关于 mcp-voice-summary
mcp-voice-summary 是一个本地 MCP 服务,可朗读 AI 助手执行代码相关任务后的摘要。它支持离线 SAPI5 和在线神经语音,并根据语言设置或系统语言选择语音。
主要功能
- 01朗读代码更改和命令的摘要
- 02异步排队播放
- 03支持离线 SAPI5 和在线 Edge 语音
- 04运行时选择语言和语音
- 05配置语音、语速、音量和队列限制
适用场景
- 01无需阅读完整回复即可听取编码 Agent 的任务摘要
- 02通过语音获取代码任务进度以提升可访问性
- 03在无法联网时使用离线语音合成
MCP 相关
向 MCP 客户端提供 `speak_summary` 工具以提交待朗读文本,并提供 `set_language` 以在运行时更改语言或性别。它通过 stdio 在本地运行。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx mcp-voice-summaryVOICE_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+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
3收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| text | string | 是 |
详细介绍
MCP 语音摘要服务
一个本地 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。
然后告诉你的助手使用它,例如:“完成任务后,请大声朗读一段简短摘要。”
平台支持
| 平台 | 推荐引擎 | 语音来源 | 额外安装 |
|---|---|---|---|
| Windows | edge(音质更佳),sapi5(离线) | 系统语音或神经语音 | 离线使用需运行 pip install -e ".[sapi5]" |
| macOS | edge(音质更佳),sapi5(离线) | 系统语音或神经语音 | 离线使用需运行 pip install pyttsx3 |
| Linux | edge | 神经语音 | 播放需运行 pip install ffmpeg |
| Linux 离线模式 | sapi5 | espeak-ng | sudo 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_ENGINE | edge 或 sapi5 | sapi5 | 合成引擎 |
VOICE_NAME | 语音 ID 或名称 | 自动 | 指定确切语音,优先级最高 |
VOICE_LANGUAGE | es、en、pt-BR、auto | 系统语言 | 语音语言 |
VOICE_GENDER | female、male | 语言默认值 | 语音性别 |
VOICE_RATE | 100、110、-15% | 100 | 语速 |
VOICE_VOLUME | 100 | 100 | 音量 |
VOICE_PLAYER | 路径或名称 | 自动检测 | 指定 MP3 播放器 |
MAX_SUMMARY_WORDS | 整数 | 400 | 每条摘要的字数上限 |
MAX_QUEUE_SIZE | 整数 | 20 | 等待播报的摘要数量上限 |
PLAYBACK_TIMEOUT | 秒 | 30 | 播放一直未返回时放弃等待 |
VOICE_MUTE | 1、true、yes | 未设置 | 静音模式:仍将摘要加入队列,但不播放 |
VOICE_REDACT | 0、false、no | 开启 | 设为 0 可停止清除凭据 |
VOICE_RATE_LIMIT | 每分钟通知数 | 30 | 防止客户端向队列发送过多内容 |
MAX_SUMMARY_AGE | 秒 | 120 | 超过此时长的排队摘要将被丢弃 |
VOICE_MODE | full、short | full | short 会播报固定的通用消息 |
VOICE_RATE 和 VOICE_VOLUME 同时接受绝对值表示法(SAPI5 标度,100 为正常值)和相对值表示法(+10%、-15%)。服务会自动转换为各引擎所需的格式。
更改配置后,请重启 MCP 客户端。
语言
无需进行任何配置即可使用你的语言。 服务会自行选择语音。优先级如下:
- 如果设置了
VOICE_NAME:始终以此手动指定的值为准。 - 如果助手在会话期间调用了
set_language。 - 如果在配置中设置了
VOICE_LANGUAGE。 - 操作系统语言。
- 最后使用英语。
更改语言和性别
永久更改:在配置中设置:
"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 种语言同时配有女性和男性语音:
| 语言 | 女性 | 男性 | 语言 | 女性 | 男性 |
|---|---|---|---|---|---|
es | Ximena | Ãlvaro | da | Christel | Jeppe |
en | Ava | Andrew | fi | Noora | Harri |
fr | Vivienne | Rémy | nl | Colette | Maarten |
de | Seraphina | Florian | pl | Zofia | Marek |
it | Elsa | Giuseppe | ru | Svetlana | Dmitry |
pt | Thalita | Antonio | uk | Polina | Ostap |
ca | Joana | Enric | cs | Vlasta | AntonÃn |
gl | Sabela | Roi | sk | Viktoria | Lukáš |
hu | Noémi | Tamás | ro | Alina | Emil |
bg | Kalina | Borislav | el | Athina | Nestoras |
sv | Sofie | Mattias | tr | Emel | Ahmet |
nb | Pernille | Finn | ar | Salma | Shakir |
ja | Nanami | Keita | he | Hila | Avri |
ko | Sun-Hi | Hyunsu | hi | Swara | Madhur |
zh | Xiaoxiao | Yunxian | th | Premwadee | Niwat |
vi | HoaiMy | NamMinh | id | Gadis | Ardi |
ms | Yasmin | Osman |
(简称;完整标识符带有 Neural 后缀,可通过 list_voices 或 python -m edge_tts --list-voices 查看。)
在 142 种语言区域中,只有 2 种只有单一性别的语音:中文方言 zh-CN-liaoning 和 zh-CN-shaanxi。如果请求的性别在所选语言区域中不存在,服务会记录警告,并改用可用语音,而不会静音。
没有精选语音的语言仍然可用:服务会在 322 种语音中搜索第一个符合所请求语言和性别的语音。例如,sw(斯瓦希里语)会匹配到 sw-KE-RafikiNeural。
如果请求特定的地区变体,系统会按要求选择,也会考虑性别:
| 请求 | 女性 | 男性 |
|---|---|---|
en-GB | en-GB-LibbyNeural | en-GB-RyanNeural |
pt-PT | pt-PT-RaquelNeural | pt-PT-DuarteNeural |
es-MX | es-MX-DaliaNeural | es-MX-JorgeNeural |
zh-TW | zh-TW-HsiaoChenNeural | zh-TW-YunJheNeural |
fr-CA | fr-CA-SylvieNeural | fr-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。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。