Voice Coach

io.github.FabianIMV由 GitHub 帳號 FabianIMV 發布v0.1.1更新於 Oct 24, 2026

Gives Claude ears: local pitch, pronunciation and public-speaking analysis for voice coaching.

已驗證STDIO僅桌面媒體與設計AI 與機器學習

概覽

AI 產生的概覽

本機 MCP 伺服器,從麥克風錄音並量測音準、發音與演講指標,讓 Claude 擔任你的聲音教練。

可以做什麼
  • 錄製麥克風音訊並回報音量、削波與雜訊狀況
  • 依音符分析音準,可對照十二平均律、調性或 MIDI 旋律,找出錯音、漏音與延遲
  • 在本機轉錄音訊,提供片段與詞級時間戳
  • 量測語速、長停頓、語助詞、音調單調度與音量變化
  • 對照預期文字給出英語音素級發音評分
  • 讀取並追加練習進度紀錄
適用情境
適合想讓助理指導唱歌音準、英語發音或公開演講的情況,可進行暖身、練習、分析、回饋的完整流程,並跨工作階段保留進度紀錄。
執行需求
透過 uvx 在本機執行 Python 套件 voice-coach-mcp;需要 uv,發音分析需要 espeak-ng,讀取 m4a/aac 可選用 ffmpeg。啟動伺服器的應用程式需取得麥克風權限。首次啟動會安裝相依套件並下載模型(Whisper 約 480 MB,音素模型約 1.3 GB)。可選設定包括 VOICE_COACH_DIR 與 VOICE_COACH_WHISPER_MODEL。
安裝前請注意
record_audio 執行時會錄音,請先取得同意。會在語音教練資料夾寫入錄音、分析明細檔與 progress.md。音訊預設留在本機;若將 VOICE_COACH_PRONUNCIATION_BACKEND 設為 azure 並設定 AZURE_SPEECH_KEY 與 AZURE_SPEECH_REGION,音訊與預期文字會傳送到 Azure Speech。發音評估僅支援英語,雜訊或削波音訊下結果可能不可靠。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Voice Coach,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[Voice Coach]

voice-coach-mcp

Give Claude ears. A local MCP server that listens to you sing, speak and read aloud, measures what it hears, and lets Claude coach your voice.

[CI] [License: MIT] [Python 3.12] [MCP]

Claude cannot process audio. This server records from your microphone, analyzes the audio on your computer, and returns compact measurements that Claude turns into concrete coaching:

ModeWhat it measures
🎤 SingingPitch accuracy per note (cents), flat/sharp tendency, drift, stability and vibrato. Compares against equal temperament, a key, or a MIDI melody, including wrong, missed and late notes.
🗣️ English pronunciationPhoneme-level comparison of what you said against what you meant to read, with per-word scores and frequent confusions (θ → s, v → b, iː → ɪ…).
🎙️ Public speakingWords per minute, long pauses, filler words (English and Spanish), pitch monotony and volume variation, with a timestamped transcript.

A bundled skill turns Claude into a coach: it runs warm-up → exercise → analysis → feedback sessions, gives one concrete focus per take, and keeps a progress log across sessions. Claude replies in your language.

  • Local and private: audio never leaves your computer (unless you opt into the Azure backend).
  • Free: open-source models (faster-whisper, wav2vec2) and no API keys.
  • Tools measure, Claude interprets: every response is compact JSON (≤ 2 KB) with confidence and warnings, so Claude never coaches on bad audio.

Install

You need uv and, for pronunciation, espeak-ng:

bash
brew install uv espeak-ng ffmpeg        # macOS (ffmpeg is optional: m4a/aac input)

On Linux: install uv, then sudo apt install espeak-ng ffmpeg libportaudio2. Pronunciation analysis on macOS needs Apple Silicon and macOS 14 or later (a PyTorch requirement).

Claude Code (plugin: server + skill)

bash
claude plugin marketplace add FabianIMV/voice-coach-mcpclaude plugin install voice-coach@voice-coach

Or, inside a session: /plugin install voice-coach --marketplace FabianIMV/voice-coach-mcp.

The first start installs the Python dependencies with uv, which can take a minute or two (the models download later, on first use). If /mcp shows voice-coach as failed right after installing, reconnect it from /mcp once the installation finishes.

Claude Desktop (extension)

Download voice-coach.mcpb from the latest release and double-click it (or drag it into Claude Desktop). For the coaching skill, also download voice-coach-skill.zip and upload it in Settings → Capabilities → Skills.

Any MCP client (manual)

bash
claude mcp add voice-coach --scope user -- uvx --from "voice-coach-mcp[speech,pronunciation]" voice-coach-mcp

For Claude Desktop's claude_desktop_config.json, use absolute paths (Desktop does not inherit your shell PATH; which uvx prints it):

json
{  "mcpServers": {    "voice-coach": {      "command": "/opt/homebrew/bin/uvx",      "args": ["--from", "voice-coach-mcp[speech,pronunciation]", "voice-coach-mcp"]    }  }}

Optional: run uvx --from "voice-coach-mcp[speech,pronunciation]" voice-coach-mcp download-models once, so the first call does not wait for the models (~480 MB Whisper, ~1.3 GB phoneme model).

Microphone permission (macOS)

macOS grants the microphone to the app that launches the server: Claude Desktop, or the terminal running Claude Code (Terminal, iTerm, Ghostty, VS Code…). If permission is denied, macOS returns silence instead of an error and record_audio reports no_microphone_permission. Fix it in System Settings → Privacy & Security → Microphone and restart that app.

Use it

Just talk to Claude:

  • "I want to practice singing in tune. I'm a beginner."
  • "Record 30 seconds of me presenting my project and tell me how many filler words I use."
  • "Help me pronounce 'th'. Give me sentences to read and score them."
  • "Analyze this voice memo against melody.mid" (any wav/mp3/m4a path works).
  • "How am I doing?" (Claude reads your progress log).

Real sessions in Claude Code: a 60-second talk about work, and a singing baseline on one held note.

[Speaking session in Claude Code: pace, pauses, monotone pitch and one concrete focus]

[Singing session: warm-up, a baseline take measured in cents, and one focus for the retake]

Guided sessions are also available as MCP prompts: singing_session, pronunciation_session and speaking_session (in Claude Code: /mcp__voice-coach__singing_session).

Tools

ToolPurpose
record_audio(seconds, name?)Records a 16 kHz mono WAV to ~/VoiceCoach/recordings/ and reports levels, clipping and noise.
analyze_pitch(audio, reference_midi?, key?, midi_track?)Pitch accuracy per note against equal temperament, a key ("A minor", "G major"…) or a MIDI melody.
transcribe(audio, language?)Local transcription with segment and word timestamps.
speech_metrics(audio, language, pause_threshold_s=0.7)Pace, long pauses, filler words, pitch monotony and volume variation.
assess_pronunciation(audio, expected_text, language="en-US")Phoneme-level English pronunciation scores and errors.
read_progress(entries=5) / log_progress(entry)Read and append sessions in ~/VoiceCoach/progress.md.

Audio can be a path or the name returned by record_audio. When a result is too long, the most relevant items are returned and everything else is saved next to the audio (full_details).

Example: analyze_pitch on a synthetic C major scale with known deviations
json
{"audio":"examples/audio/c_major_scale.wav","duration_s":7.36,"mode":"equal_temperament", "summary":{"notes":8,"range":"C4–C5","pct_within_25_cents":75.0,"mean_deviation_cents":-7.8,   "mean_abs_deviation_cents":13.6,"tendency":"centered","drift_cents":-1.0,   "stability":{"stable":7,"vibrato":1,"unstable":0}}, "notes":[{"t":0.4,"dur":0.62,"note":"C4","cents":0,"stability":"stable"},   {"t":1.84,"dur":0.62,"note":"E4","cents":-30,"stability":"stable"},   {"t":4.72,"dur":0.62,"note":"B4","cents":-42,"stability":"stable"},   {"t":5.44,"dur":1.43,"note":"C5","cents":-2,"stability":"vibrato","vibrato_hz":5.5,"vibrato_pp_cents":84}, "…"], "confidence":{"value":1.0,"level":"high"},"warnings":[]}

With a MIDI reference, the server detects that the melody was sung an octave lower (octave_shift: -1), started 1 s late (start_offset_ms: 1003), and that one note came in 134 ms late.

Example: assess_pronunciation — "I sink the berry best sings…" read for "I think the very best things in life are free"
json
{"backend":"wav2vec2-local", "summary":{"overall_score":90,"words":10,"words_with_errors":3,   "errors":{"substitution":3,"deletion":0,"insertion":0},   "frequent_confusions":[{"expected":"θ","detected":"s","count":2},{"expected":"v","detected":"b","count":1}]}, "words":[{"word":"think","score":75,"t":0.56,"expected":"θ ɪ ŋ k","detected":"s ɪ ŋ k",     "errors":[{"type":"substitution","expected":"θ","detected":"s"}]},   {"word":"very","score":75,"t":0.96,"expected":"v ɛ ɹ i","detected":"b ɛ ɹ i",     "errors":[{"type":"substitution","expected":"v","detected":"b"}]}, "…"], "confidence":{"value":1.0,"level":"high"},"warnings":[]}
Example: speech_metrics on a short synthetic talk with inserted pauses and fillers
json
{"language":"en", "pace":{"words":36,"speaking_time_s":14.9,"words_per_minute":145,"wpm_excluding_long_pauses":165}, "pauses":{"threshold_s":0.7,"count":2,"total_s":1.9,"max_s":1.03,"per_minute":8.1,   "items":[{"t":4.42,"dur":1.03,"after":"speaking"},{"t":12.1,"dur":0.83,"after":"normal"}]}, "fillers":{"total":6,"per_minute":24.2,"by_type":{"um":1,"so":1,"uh":1,"you know":1,"like":1,"i mean":1}}, "pitch":{"median_f0_hz":101,"std_semitones":1.53,"monotone":true,"monotone_stretches":[{"t":0.0,"end":12.0}]}, "volume":{"mean_dbfs":-21.2,"std_between_words_db":2.4,"low_variation":true}, "confidence":{"value":1.0,"level":"high"},"warnings":[]}

The synthetic voice is very flat, hence monotone: true. A Spanish example is also included.

All example outputs are real responses from the server over stdio, regenerated by examples/generate_examples.py on synthetic audio; see examples/outputs/.

How it works

  • Pitch: pYIN (librosa) finds voiced frames; each frame is refined from its harmonic peaks with parabolic interpolation (~1 cent accuracy from C2 to C6). Notes are split at silences, energy dips and sustained pitch changes; vibrato does not split notes. With a MIDI reference, the octave and offset are found by cross-correlation, notes are aligned with Needleman–Wunsch, and a tempo line t_sung = a·t_ref + b is fitted to judge each onset.
  • Speech: faster-whisper transcribes with word timestamps (an initial prompt keeps fillers). Pauses are measured from the audio energy, because Whisper stretches word endings into silence. Ambiguous fillers ("like", "so") only count when isolated by a comma or a pause.
  • Pronunciation: phonemizer + espeak-ng give the expected IPA phonemes; the facebook/wav2vec2-lv-60-espeak-cv-ft phoneme model gives what was said; both are aligned by edit distance. Normal American English variants (flap, schwa, linking r, glottal stop) are not counted as errors.
  • Quality first: clipping, background noise, silence and missing microphone permission are reported as warnings and lower the confidence.

Known limitations: one voice at a time (accompaniment degrades pitch detection); two identical notes sung in perfect legato count as one; the phoneme model uses sentence context and may occasionally "correct" a mispronounced word; pronunciation assessment is English-only.

Privacy and network access

Everything the plugin runs, writes and downloads:

  • Runs: uv starts the server from the plugin folder (uv run --frozen, pinned by uv.lock); the server uses espeak-ng for expected phonemes and ffmpeg only to read m4a/aac files.
  • Microphone: only while record_audio runs, for the number of seconds Claude asks for.
  • Writes: recordings and progress.md in ~/VoiceCoach (or VOICE_COACH_DIR), and an analysis detail file <audio>.<tool>.json next to each analyzed audio (or in ~/VoiceCoach/analysis if that folder is read-only). Analyzing the same audio again replaces its detail file; nothing else is overwritten or deleted.
  • Downloads: the Python dependencies from PyPI on first start, then the models from Hugging Face on first use: the faster-whisper model (Systran/faster-whisper-small by default) and facebook/wav2vec2-lv-60-espeak-cv-ft. After that, models load from the local cache.
  • Sends: nothing by default. No telemetry, no accounts, no API keys. Only if you set VOICE_COACH_PRONUNCIATION_BACKEND=azure with your own AZURE_SPEECH_KEY and AZURE_SPEECH_REGION does assess_pronunciation send that audio and the expected text to Azure Speech in your region.

Configuration

VariableDefaultPurpose
VOICE_COACH_DIR~/VoiceCoachRecordings, analysis details and progress.md
VOICE_COACH_MAX_SECONDS120Maximum record_audio length
VOICE_COACH_A4_HZ440Tuning reference
VOICE_COACH_MAX_BYTES2048Response size budget
VOICE_COACH_WHISPER_MODELsmalltiny, base, small, medium, large-v3…
VOICE_COACH_WHISPER_DEVICE / _COMPUTE_TYPEcpu / int8CTranslate2 settings
VOICE_COACH_FILLERS—Your own filler-word TOML (see fillers.toml)
VOICE_COACH_PRONUNCIATION_BACKENDlocallocal (wav2vec2) or azure
VOICE_COACH_PRONUNCIATION_DEVICEautoauto (MPS when available), cpu or mps
AZURE_SPEECH_KEY, AZURE_SPEECH_REGION—Optional Azure Pronunciation Assessment backend (pip install voice-coach-mcp[azure]); the audio is then sent to Azure
PHONEMIZER_ESPEAK_LIBRARYauto-detectedPath to libespeak-ng if it is not in Homebrew's default location

Development

bash
git clone https://github.com/FabianIMV/voice-coach-mcp.git && cd voice-coach-mcpuv sync --extra speech --extra pronunciationuv run pytest                 # fast suite: synthetic audio, simulated microphoneuv run pytest -m models       # real Whisper and wav2vec2 models on synthetic speechuv run ruff check . && uv run ruff format --check .

See CONTRIBUTING.md for the design principles and the release process.

src/voice_coach_mcp/  server.py         MCP tools and prompts (thin layer)  audio/            loading, recording and quality checks  singing/          pitch tracking, music theory, MIDI reference, pitch accuracy  speech/           transcription, speech metrics, filler lists  pronunciation/    expected phonemes, alignment, wav2vec2 and Azure backends  output.py         2 KB response budget and details file  progress.py       progress logskills/voice-coach/ coaching skill (also bundled in the Python package)examples/           synthetic audio and real tool outputs

License and credits

MIT © FabianIMV. Built on faster-whisper, librosa, wav2vec2 phoneme recognition and the official MCP Python SDK. The optional pronunciation extra uses phonemizer and espeak-ng, both GPL-3.0. Example voices were synthesized with espeak-ng and Piper (public-domain LJSpeech voice).

來源:README.md,提交 96230b5

工具

0
SourceWeft 曾在隔離沙箱中以無憑證方式啟動該軟體包一次,以列出其工具,但未能完成:軟體包安裝失敗。

版本歷史

1
  1. v0.1.1最新Oct 23, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分