mcpField
M
mcp-voice-summary

mcp-voice-summary

本地服务
github.com媒体与设计04 周前更新

关于 mcp-voice-summary

mcp-voice-summary 是一个本地 MCP 服务,可朗读 AI 助手执行代码相关任务后的摘要。它支持离线 SAPI5 和在线神经语音,并根据语言设置或系统语言选择语音。

主要功能

  1. 01朗读代码更改和命令的摘要
  2. 02异步排队播放
  3. 03支持离线 SAPI5 和在线 Edge 语音
  4. 04运行时选择语言和语音
  5. 05配置语音、语速、音量和队列限制

适用场景

  1. 01无需阅读完整回复即可听取编码 Agent 的任务摘要
  2. 02通过语音获取代码任务进度以提升可访问性
  3. 03在无法联网时使用离线语音合成

MCP 相关

向 MCP 客户端提供 `speak_summary` 工具以提交待朗读文本,并提供 `set_language` 以在运行时更改语言或性别。它通过 stdio 在本地运行。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"eduplopez-mcp-voice-summary": {
"command": "uvx",
"args": [
"mcp-voice-summary"
],
"env": {
"VOICE_ENGINE": "<VOICE_ENGINE>",
"VOICE_LANGUAGE": "<VOICE_LANGUAGE>",
"VOICE_GENDER": "<VOICE_GENDER>",
"VOICE_RATE": "<VOICE_RATE>",
"VOICE_VOLUME": "<VOICE_VOLUME>",
"VOICE_MUTE": "<VOICE_MUTE>",
"VOICE_MODE": "<VOICE_MODE>"
}
}
}
}
启动命令uvx mcp-voice-summary
需要配置的环境变量
VOICE_ENGINESynthesis engine: 'edge' for Azure neural voices (needs internet), 'sapi5' for fully offline native speech.
VOICE_LANGUAGEISO 639-1 code such as 'es' or 'en', optionally with a region such as 'pt-BR'. 'auto' detects it per summary, which is unreliable on short text. Empty follows the system language.
VOICE_GENDER'female' or 'male'. Requires the edge engine; sapi5 does not expose the gender of its voices.
VOICE_RATEReading speed. 100 is normal, 120 is faster, '-15%' is relative.
VOICE_VOLUMEVolume, 0 to 100.
VOICE_MUTESet to 1 to validate and queue summaries without playing anything. Useful in shared spaces.
VOICE_MODE'full' speaks the sanitized summary, 'short' replaces it with a fixed generic message so no summary content reaches the speakers or the cloud engine.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypimcp-voice-summary0.1.1

工具

3

收录的工具列表 · 更新于 2 周前

参数类型必填说明
textstring是

详细介绍

MCP 语音摘要服务

CI PyPI Python Downloads License: MIT

一个本地 MCP 服务,可朗读 AI 助手刚刚对你的代码执行的操作摘要。它作为无障碍辅助层构建:无需阅读完整回复,也能听到 Agent 做了什么。

它会自动使用用户的语言进行朗读,提供女声和男声;你也可以让它完全离线运行。

快速开始

pip install mcp-voice-summary

然后将 MCP 客户端指向已安装的命令。对于 Claude Desktop、Cursor 或 Cline,在 claude_desktop_config.json 中:

{
  "mcpServers": {
    "voice-summary": {
      "command": "mcp-voice-summary",
      "env": {
        "VOICE_ENGINE": "edge",
        "VOICE_LANGUAGE": "es",
        "VOICE_GENDER": "male"
      }
    }
  }
}

完全不需要 env 块:服务会根据系统语言选择语音。上面的值只是用于固定语音。

使用 uvx,无需安装任何内容:

{
  "mcpServers": {
    "voice-summary": {
      "command": "uvx",
      "args": ["mcp-voice-summary"],
      "env": { "VOICE_ENGINE": "edge" }
    }
  }
}

此服务也已列入 MCP Registry, 标识为 io.github.eduplopez/mcp-voice-summary。注册表元数据位于此仓库中的 server.json。

然后告诉你的助手使用它,例如:“完成任务后,请大声朗读一段简短摘要。”

平台支持

平台推荐引擎语音来源额外安装
Windowsedge(音质更佳),sapi5(离线)系统语音或神经语音离线使用需运行 pip install -e ".[sapi5]"
macOSedge(音质更佳),sapi5(离线)系统语音或神经语音离线使用需运行 pip install pyttsx3
Linuxedge神经语音播放需运行 pip install ffmpeg
Linux 离线模式sapi5espeak-ngsudo apt install espeak-ng libespeak-ng1

edge 引擎每次朗读都需要联网,因为音频由 Microsoft 的服务器生成。sapi5 引擎则完全离线。

在 Linux 上,系统会自动检测音频播放器;如果没有检测到任何播放器,请安装 ffmpeg(它会提供 ffplay)或 mpg123。

更高音质的 Windows 离线语音

Windows 自带的语音比默认显示的三个语音更出色,但这些语音隐藏在 SAPI5 不会读取的注册表项下。以管理员身份运行一次:

powershell -Command "Start-Process powershell -Verb RunAs -ArgumentList '-ExecutionPolicy Bypass -File .\register_voices_onecore.ps1'"

之后,Microsoft Laura 和 Microsoft Pablo 就可以通过 sapi5 使用。

功能

它会提供一个 MCP 工具 speak_summary,助手可在修改代码、创建文件或运行命令后调用。

摘要长度由助手根据完成的工作量决定:小改动使用简短句子,任务较大或包含多个步骤时则提供更完整的摘要。请参阅 控制摘要长度。

播放是异步的:工具会将文本加入队列并立即返回,因此朗读不会阻塞助手。

要求

  • Python 3.10 或更高版本。
  • Windows、Linux 或 macOS。

只有 sapi5 引擎需要系统依赖项(原生合成器)。 edge 引擎除 Python 外不需要其他依赖。

检查是否正常运行

mcp-voice-summary

此服务通过 stdio 朗读,因此你不会在控制台中看到任何内容。这是正常的:输出到 stdout 的任何内容都会破坏协议。按 Ctrl+C 停止。

对于离线引擎,请先安装其额外依赖:

pip install -e ".[sapi5]"

配置

所有设置均通过环境变量控制。

变量值默认值说明
VOICE_ENGINEedge 或 sapi5sapi5合成引擎
VOICE_NAME语音 ID 或名称自动指定确切语音,优先级最高
VOICE_LANGUAGEes、en、pt-BR、auto系统语言语音语言
VOICE_GENDERfemale、male语言默认值语音性别
VOICE_RATE100、110、-15%100语速
VOICE_VOLUME100100音量
VOICE_PLAYER路径或名称自动检测指定 MP3 播放器
MAX_SUMMARY_WORDS整数400每条摘要的字数上限
MAX_QUEUE_SIZE整数20等待播报的摘要数量上限
PLAYBACK_TIMEOUT秒30播放一直未返回时放弃等待
VOICE_MUTE1、true、yes未设置静音模式:仍将摘要加入队列,但不播放
VOICE_REDACT0、false、no开启设为 0 可停止清除凭据
VOICE_RATE_LIMIT每分钟通知数30防止客户端向队列发送过多内容
MAX_SUMMARY_AGE秒120超过此时长的排队摘要将被丢弃
VOICE_MODEfull、shortfullshort 会播报固定的通用消息

VOICE_RATE 和 VOICE_VOLUME 同时接受绝对值表示法(SAPI5 标度,100 为正常值)和相对值表示法(+10%、-15%)。服务会自动转换为各引擎所需的格式。

更改配置后,请重启 MCP 客户端。

语言

无需进行任何配置即可使用你的语言。 服务会自行选择语音。优先级如下:

  1. 如果设置了 VOICE_NAME:始终以此手动指定的值为准。
  2. 如果助手在会话期间调用了 set_language。
  3. 如果在配置中设置了 VOICE_LANGUAGE。
  4. 操作系统语言。
  5. 最后使用英语。
更改语言和性别

永久更改:在配置中设置:

"environment": { "VOICE_LANGUAGE": "fr", "VOICE_GENDER": "male" }

也可以在运行时更改,无需编辑任何内容。用户可以用自然语言提出要求,助手会调用该工具:

set_language("en")             -> Language English (en), gender default
set_language("pt-BR", "male")  -> Language Portuguese (pt), gender male
set_language("", "f")           -> keep the language, switch to a female voice
set_language("system")         -> back to the OS language
set_language("", "any")         -> back to the language default gender

运行时更改会应用于后续播报,并持续生效,直到服务重启或再次调用该工具并设置其他值。

性别设置 仅适用于 edge 引擎。SAPI5 不会提供语音的性别信息,因此使用 sapi5 时,工具会如实说明,而不会假装支持。选择性别需要使用神经语音。

自动语言检测

VOICE_LANGUAGE=auto 会让服务根据每条摘要的文本推断语言。

请谨慎使用。 语言检测对短文本并不可靠,而本项目主要用于处理短摘要。以下是使用真实摘要进行测试的结果:

文本实际语言检测结果
"Done."西班牙语捷克语(置信度 100 %)
"Listo"西班牙语德语
"Test 123"任意语言法语
"I updated the login endpoint and fixed the dependencies"英语英语

即使检测结果有误,检测器也会给出很高的置信度,因此无法通过概率筛除错误结果。简而言之:检测适用于长句,对短句则会失效。若语言固定,VOICE_LANGUAGE 始终更可靠。

如果未安装 langdetect,auto 会记录警告并回退到英语。其他模式不依赖此项依赖。

覆盖范围

edge 引擎提供 142 种语言区域,涵盖 322 种语音。其中 34 种语言同时配有女性和男性语音:

语言女性男性语言女性男性
esXimenaÁlvarodaChristelJeppe
enAvaAndrewfiNooraHarri
frVivienneRémynlColetteMaarten
deSeraphinaFlorianplZofiaMarek
itElsaGiusepperuSvetlanaDmitry
ptThalitaAntonioukPolinaOstap
caJoanaEnriccsVlastaAntonín
glSabelaRoiskViktoriaLukáš
huNoémiTamásroAlinaEmil
bgKalinaBorislavelAthinaNestoras
svSofieMattiastrEmelAhmet
nbPernilleFinnarSalmaShakir
jaNanamiKeitaheHilaAvri
koSun-HiHyunsuhiSwaraMadhur
zhXiaoxiaoYunxianthPremwadeeNiwat
viHoaiMyNamMinhidGadisArdi
msYasminOsman

(简称;完整标识符带有 Neural 后缀,可通过 list_voices 或 python -m edge_tts --list-voices 查看。)

在 142 种语言区域中,只有 2 种只有单一性别的语音:中文方言 zh-CN-liaoning 和 zh-CN-shaanxi。如果请求的性别在所选语言区域中不存在,服务会记录警告,并改用可用语音,而不会静音。

没有精选语音的语言仍然可用:服务会在 322 种语音中搜索第一个符合所请求语言和性别的语音。例如,sw(斯瓦希里语)会匹配到 sw-KE-RafikiNeural。

如果请求特定的地区变体,系统会按要求选择,也会考虑性别:

请求女性男性
en-GBen-GB-LibbyNeuralen-GB-RyanNeural
pt-PTpt-PT-RaquelNeuralpt-PT-DuarteNeural
es-MXes-MX-DaliaNeurales-MX-JorgeNeural
zh-TWzh-TW-HsiaoChenNeuralzh-TW-YunJheNeural
fr-CAfr-CA-SylvieNeuralfr-CA-ThierryNeural

sapi5 引擎只能使用系统上已安装的语音,因此其语言覆盖范围取决于操作系统提供的内容,而且无法按性别选择。Windows 自带西班牙语和英语语音;其他语言需要另行添加语音。

语音

Neural 语音(edge 引擎)

全部 322 种语音的完整目录:

python -m edge_tts --list-voices

45 种西班牙语语音包括:

语音地区
es-ES-AlvaroNeural西班牙,男性
es-ES-XimenaNeural西班牙,女性
es-ES-ElviraNeural西班牙,女性
es-MX-DaliaNeural墨西哥,女性
es-MX-JorgeNeural墨西哥,男性
es-US-PalomaNeural美国,女性
Windows 原生语音(sapi5 引擎)

开箱即用时,只能看到三种非常基础的语音。Windows 已自带更好的语音,例如 Microsoft Laura 和 Microsoft Pablo,但它们注册在 SAPI5 不会读取的注册表项 Speech_OneCore 下。

register_voices_onecore.ps1 会将这些项复制到 SAPI5 能读取的分支。以管理员身份打开 PowerShell 提示符并运行一次:

powershell -Command "Start-Process powershell -Verb RunAs -ArgumentList '-ExecutionPolicy Bypass -File .\register_voices_onecore.ps1'"

此操作只会复制,不会删除或覆盖任何现有语音,并会跳过已存在的项。然后重启 MCP 客户端并调用 list_voices 查看这些语音。从此之后,即使离线也能使用 Laura 和 Pablo。

与 MCP 客户端集成

OpenCode

将其添加为全局配置,以便在每个项目中使用:

opencode mcp add voice-summary -- "C:\path\mcp-voice-summary\.venv\Scripts\python.exe" "C:\path\mcp-voice-summary\mcp_voice_summary.py"

使用 opencode mcp list 检查连接。

要固定引擎、语音和语言,请编辑 ~/.config/opencode/opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "servers": {
      "voice-summary": {
        "type": "local",
        "command": ["mcp-voice-summary"],
        "environment": {
          "VOICE_ENGINE": "edge",
          "VOICE_LANGUAGE": "en",
          "VOICE_RATE": "120"
        }
      }
    }
  }
}

注意:设置 VOICE_NAME 会固定使用某一种特定语音,并停用自动语言和性别选择。要继续使用这些功能,请改用 VOICE_LANGUAGE 和 VOICE_GENDER。

Claude Desktop

claude_desktop_config.json,位于 %APPDATA%\Claude\:

{
  "mcpServers": {
    "voice-summary": {
      "command": "mcp-voice-summary",
      "env": {
        "VOICE_ENGINE": "edge",
        "VOICE_LANGUAGE": "en",
        "VOICE_RATE": "120"
      }
    }
  }
}
Cursor

项目中的 .cursor/mcp.json:

{
  "mcpServers": {
    "voice-summary": {
      "command": "mcp-voice-summary",
      "env": { "VOICE_ENGINE": "edge", "VOICE_LANGUAGE": "en" }
    }
  }
}
其他客户端

这是一个标准的 stdio MCP 服务,因此只需声明命令、参数和环境变量即可。

工具

speak_summary(text)

通过系统扬声器朗读文本。长度不限:助手会根据工作量发送简短或详细的摘要。如果文本超过安全上限,则会截断,并在响应中附上提示。

list_voices()

显示当前使用的语言和语音,以及系统上已安装的语音。

set_language(language="", gender="")

无需编辑配置即可设置语音语言和性别。

  • language:ISO 639-1 代码(es、en、fr)、区域变体(pt-BR、en-GB)、用于跟随操作系统设置的 "system",或用于按每篇摘要检测语言的 "auto"。留空则保留当前语言。
  • gender:"f" 或 "m",或用于跟随语言默认设置的 "any"。留空则保留当前性别。

控制摘要长度

服务不会强制限定长度:助手会根据完成的工作量决定长度。可通过两种方式控制,了解它们之间的区别很重要。

1. 助手选择的长度(推荐)

助手会根据任务选择长度。你可以通过给助手的指令来控制这一点。大多数情况下都应使用这种方式,因为它会根据工作内容自动调整。

一个平衡的示例:

When calling `speak_summary`, match the summary length to the size of the work:

- Small or single change: one short sentence, 10 to 20 words.
- Medium task or several files: two or three sentences, 30 to 60 words.
- Large task or long project: a summary of 80 to 150 words that walks through
  the main actions performed.

Always write in the first person, without reading out literal code.

想要更接近日常对话的语气?调高数值。想要更简洁?调低数值。没有绝对正确的数值:这取决于任务的时长,以及你是否还会阅读完整响应。

2. 服务安全上限

MAX_SUMMARY_WORDS 不是长度建议,而是紧急制动。它能防止过长的 text 变成持续数分钟的播报。如果超出上限,服务会截断摘要,并在响应中说明。

"environment": { "MAX_SUMMARY_WORDS": "400" }
值大致时长适用场景
0不截断仅当你想要不受限制的播报时使用
150~1 分钟即使任务很大,也希望摘要简短
400~2-3 分钟默认值,较为均衡
800~5 分钟工作量很大,且不介意等待较长时间

英语神经语音每秒大约能读 2.5 个单词,因此 100 个单词约需 40 秒。相比精确的字数,简短的句子和停顿更有助于理解。

如果长摘要仍不够详细,最好的办法是将任务拆成多次调用,而不是提高上限:这样你能在每个阶段进行时听到内容,而不是最后一次性听完一大段。

3. 调整朗读速度

如果觉得摘要读得太慢,可以调整速度,而不是长度:

"environment": { "VOICE_RATE": "120" }  // 20% faster

设置行为规则

要让助手自动采用此行为,请将以下指令添加到客户端规则中。在 OpenCode 中,该文件位于 ~/.config/opencode/AGENTS.md:

## Voice accessibility rule

You have access to the `voice-summary` MCP server with the `speak_summary`
tool. You MUST use it right after you finish modifying code, creating files or
running commands.

When calling it, match the summary length to the size of the work:

- Small or single change: one short sentence, 10 to 20 words.
- Medium task or several files: two or three sentences, 30 to 60 words.
- Large task or long project: a summary of 80 to 150 words that walks through
  the main actions performed.

Always write in the first person, without reading out literal code.

如果用户要求使用其他语言或语音,或指定男性或女性语音,请调用 set_language。语言默认跟随系统设置,因此无需配置。

隐私与安全

此服务旨在本地运行于你自己的计算机上,由 MCP 客户端作为子进程启动。它不会开放端口,也不会监听任何内容。

使用 edge 引擎时,哪些内容会离开你的计算机

edge 引擎会将摘要文本发送到 Microsoft 的服务器以生成音频。发送的只有摘要文本,绝不会发送你的代码;但请注意,摘要中可能会提到你不希望公开的文件名、函数名或错误消息。

如果这不符合你的使用场景,请改用 sapi5 引擎:它完全离线,任何内容都不会离开计算机。

引擎网络音频质量
edge摘要文本会发送到 Microsoft高
sapi5不会有任何内容离开计算机基础,语音较少
已落实的加固措施
  • 不使用 shell。 外部音频播放器通过参数列表调用,绝不使用 shell=True。VOICE_PLAYER 必须通过 shutil.which 解析为真实的可执行文件。
  • 子进程无法访问 stdin。 对于 stdio MCP 服务,stdin 和 stdout 承载 JSON-RPC 流。若启动播放器时未设置 stdin=DEVNULL,播放器可能会读取原本发给服务的协议消息;这一点已通过读取器子进程验证,并已采取措施加以阻止,同时也设置了 timeout 和管道输出。
  • 绝不将 stdout 用于日志记录。 导入合成器时打印的任何内容都会重定向到 stderr。
  • 所有操作都有超时。 网络合成调用和播放器进程都会在 PLAYBACK_TIMEOUT 后放弃,避免工作进程永久挂起。
  • 输入经过清理。 控制字符和标记都会被移除,因此只会朗读文本本身。edge-tts 会自行转义 SSML,但 sapi5 会将文本直接交给操作系统的合成器。
  • 绝不将摘要写入日志。 发生故障时,日志只记录字数和简短的 sha256 摘要,便于关联日志行,同时不会持久化文件名、错误文本或机密信息。
  • 在朗读或发送到任何地方之前,都会移除凭据。 私钥块、提供商令牌(OpenAI、GitHub、Slack、Google、AWS)、JWT、key=value 格式的机密信息和电子邮件地址都会替换为 [redacted]。在开放式办公室中朗读摘要,或将摘要发送到云 TTS 服务,都会形成信息泄露渠道。替换时会使用占位符,避免某个模式破坏另一个模式的输出。只有在摘要绝不包含任何敏感内容时,才可通过 VOICE_REDACT=0 关闭此功能。
  • 脱敏会对合并后的匹配区间进行一次处理,而不是连续执行多次替换。针对原始文本匹配所有模式,再统一替换一次,可确保任何模式都不会重新匹配其他模式的输出;该函数也是幂等的:重复脱敏结果不变。
  • 从三个方面限制滥用。 队列大小限制突发请求,速率限制阻止持续垃圾请求绕过大小检查,同时会跳过连续重复的摘要。三项检查都在同一把锁下运行,因此并发处理程序不会突破限制。
  • 用计数器代替增加工具。 list_voices 会报告已接受、触发速率限制、队列已满、已去重、已截断、已脱敏、已丢弃过期请求和错误的计数。每个工具都会在每轮对话中占用上下文,因此不值得仅为诊断再增加第四个工具。
  • 丢弃过期通知。 等待时间超过 MAX_SUMMARY_AGE 的摘要会被丢弃,不会在工作完成几分钟后才被读出。
  • 通过标准库处理孤儿进程。 超时后,subprocess.run 会终止子进程;此行为已通过一个会写入自身 PID 的进程验证。
  • 在将语音名称加入队列之前,会根据实时目录进行验证,因此 VOICE_NAME 拼写错误时会立即给出有用的提示,而不是浪费一次网络往返后才报错。
  • 队列有容量上限,由 MAX_QUEUE_SIZE 限定。如果没有上限,客户端以快于播放的速度调用 speak_summary,队列就可能无限增长并耗尽内存。超过上限的请求会被拒绝,而不是被静默丢弃。
  • 工具注释声明了副作用:speak_summary 不是只读、非幂等,并且会影响外部环境。
  • 不执行动态代码。 源代码中没有任何 eval、exec、pickle 或 os.system。
静音模式

设置 VOICE_MUTE=1,即可在服务器保持运行的同时不发出任何声音。摘要仍会经过验证、加入队列并得到确认,因此可以放心地在办公室或会议期间启用服务器。speak_summary 会返回 "Muted.",方便你区分静音状态和实际播放。

通用消息模式

设置 VOICE_MODE=short 后,无论助手提交什么内容,语音文本都会固定为 "Task completed."。 摘要中的任何内容都不会传到扬声器或云端引擎。

如果摘要可能提及机密信息,或者你根本不想听到原始文本,可以使用此模式。代价是你会失去相关信息:你只会知道“有事完成了”,而不知道具体是什么。

每次发布前
.venv\Scripts\python.exe pre_release_check.py

运行测试套件、pip-audit、标准输出纯净度检查、危险调用扫描、工具目录预算检查,以及确保计数器不暴露文本的检查。失败时返回非零退出码,因此可用于阻止发布。

添加机密模式时

脱敏测试由 tests/test_server.py 顶部的一张表驱动。添加模式时,需要向 SECRET_CASES 添加一行(一个正向用例,以及必须被清除的片段);如果该模式有可能匹配到合法文本,还需要向 BENIGN_CASES 添加一行。之后会自动检查每个用例的幂等性、标记安全性、多行处理,以及空格或大小写变体。

测试

测试套件涵盖输入处理、队列限制、语音解析、平台回退、日志隐私和令牌预算。它不会播放真实音频,因此可在离线状态下于几秒内运行:

python -m unittest discover -s tests
已知限制
  • 脱敏是防御措施,并非面面俱到。 它能捕获私钥块、常见的提供商令牌格式、JWT、key=value 机密信息和电子邮件地址。但它无法捕获没有标记的 Base64 数据、使用 Unicode 形似字符拼写的机密信息,或不常见的内部格式。不要将其视为唯一的安全措施。此外,由于匹配片段会被整体替换,匹配内容周围的上下文也会一并删除。
  • 语音和语言是进程级全局设置。 set_language 会更改整个服务的状态,因此如果两个 MCP 会话与同一个服务进程通信,其中一个会话就能为另一个会话更改语音。这对于预期的单用户本地设置没有影响,但它并不提供按会话隔离。
  • 意外的工具参数会被忽略,而非拒绝。 SDK 根据函数签名推导架构,且无法设置 additionalProperties: false。向 speak_summary 传入 tts_endpoint 或 api_key 会被静默丢弃且不起作用;这一点已通过使用额外字段调用工具进行验证。在此处,忽略这些参数是安全的,因为模型可传入的任何参数都不会到达网络、文件系统或命令行。
  • 同步工具函数体会在工作线程中运行,而非事件循环中:SDK 会通过 anyio.to_thread.run_sync 分发它们,因此脱敏正则表达式不会阻塞服务。
  • VOICE_PLAYER 会执行程序。 这是它的用途,而且它只会从你自己的配置中读取,但不要使用不可信输入来构建它。
  • langdetect 的准确性。 详见 自动语言检测。

实现说明

修改前值得了解的一些细节:

  • 如果在一个线程中创建 pyttsx3 引擎,然后在另一个线程中使用,它会永久阻塞。 COM 采用单元线程模型。这就是引擎采用延迟初始化,并且始终在同一个工作线程中使用的原因。
  • 一个工作线程会从 queue 中取出任务,因此连续的两条语音不会重叠或互相打断。
  • SAPI5 的 runAndWait 可能会在语音播放结束前返回,因此会通过 isBusy() 主动等待。edge 引擎使用阻塞式 MCI 播放,因此计时准确。
  • 工作线程是守护线程:语音播放不会阻止进程关闭。
  • pyttsx3、edge_tts 和 langdetect 都采用延迟导入,因此即使缺少其中任何一个,服务也能启动。
  • 按语言选择语音有三个回退层级:该语言精选的语音、其首选地区变体的任意语音,然后是该语言的任意语音。因此,即使某种语言没有精选语音,也仍然可以使用。
  • 任何音频故障都会被捕获并记录日志。MCP 服务绝不会因为无法播放语音而停止运行。

故障排除

工具没有显示在我的客户端中。 修改配置后,重启 MCP 客户端;大多数客户端只会在启动时读取配置。确认命令可以正常解析:在终端中运行 mcp-voice-summary,你应该看不到任何输出,因为它会在 stdio 上静默等待。

没有播放语音。 检查系统音量和默认输出设备。使用 edge 引擎时,请确认网络连接正常。若要区分配置问题和播放问题,请调用 list_voices 并检查它报告的语音:如果语音看起来正确,问题就出在音频输出,而不是服务。

敏感内容仍然被读出。 检查 VOICE_REDACT 是否未设置为 0。脱敏机制是一种防护措施,无法识别所有格式;因此,对于真正敏感的内容,建议使用 VOICE_MODE=short,它会在播放或发送文本前将其替换为固定消息。

语音被截断或消息互相重叠。 检查是否只运行了一个 MCP 服务实例。

No audio player was found。 仅影响使用 edge 引擎的 Linux 和 macOS。请安装 ffmpeg、mpg123 或 vlc,或者设置 VOICE_PLAYER。Windows 使用 MCI,不会出现此问题。

sapi5 引擎在 Linux 上找不到语音。 安装系统合成器:sudo apt install espeak-ng libespeak-ng1。请注意,espeak 语音的效果远不如 edge-tts。

ImportError: No module named mcp.server.fastmcp。 这是 v1 代码。请安装 mcp>=2.0;在该版本中,FastMCP 已重命名为 MCPServer。此项目需要 2.x。

播放的语言不符合预期。 如果文本读出来时带有奇怪的口音,最可能是 VOICE_LANGUAGE=auto 误判了语言。已知语言检测在文本非常短时并不可靠:请通过 set_language("fr") 或 VOICE_LANGUAGE 指定语言。请参阅检测失败情况表格。

Windows 语音听起来很基础。 以管理员身份运行一次 register_voices_onecore.ps1,然后使用 VOICE_NAME=Laura 或 VOICE_NAME=Pablo。

许可证

MIT。请参阅 LICENSE。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。