mcpField
M
mcp-listen

mcp-listen

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

关于 mcp-listen

mcp-listen 是面向 MCP 兼容 Agent 的麦克风采集与语音转文字服务。它可保存 WAV 录音,或通过本机 whisper.cpp 转录并将文本交给本地 Ollama。

主要功能

  1. 01列出可用麦克风
  2. 02录制并保存 WAV 音频
  3. 03静音检测后停止录音
  4. 04本机 whisper.cpp 语音转写
  5. 05通过本地 Ollama 查询模型
  6. 06验证工具参数并报告错误

适用场景

  1. 01查看并选择录音设备
  2. 02将麦克风录音保存为文件
  3. 03用语音向本地模型提问

MCP 相关

该 MCP 服务向兼容客户端提供音频设备查询、录音和语音查询工具。音频在本机采集和转写;voice_query 将转录文本发送到本地 Ollama。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"analyticsinmotion-mcp-listen": {
"command": "npx",
"args": [
"-y",
"mcp-listen"
]
}
}
}
启动命令npx -y mcp-listen

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

安装包
npmmcp-listen0.1.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Decibri mcp-listen

mcp-listen

让你的 AI Agent 能够倾听

为兼容 MCP 的 Agent 提供麦克风采集和语音转文本工具。

元信息 MCP Server  npm 版本  Apache 2.0 许可证  CI  mcp-listen MCP 服务 

工具

工具说明
list_audio_devices列出可用的麦克风输入设备
capture_audio录制麦克风音频并保存为 WAV
voice_query采集音频,在本机使用 whisper.cpp 转录,并通过本地 Ollama 守护进程向模型发起查询

快速开始

Claude Code
claude mcp add mcp-listen npx mcp-listen
Claude Desktop / ChatGPT Desktop / Cursor / Windsurf / VS Code

添加到你的 MCP 配置中:

{
  "mcpServers": {
    "mcp-listen": {
      "command": "npx",
      "args": ["-y", "mcp-listen"]
    }
  }
}

兼容 Claude Desktop、ChatGPT Desktop、Cursor、GitHub Copilot、Windsurf、VS Code、Gemini、Zed 以及任何兼容 MCP 的客户端。

全局安装
npm install -g mcp-listen

要求

支持的平台:

  • Windows x64
  • macOS Apple silicon(arm64)
  • Linux x64 和 arm64(glibc)

不支持 Intel Mac(darwin-x64):Apple 已停止支持该平台,且未发布适用于该平台的 decibri 二进制文件。

使用 list_audio_devices 和 capture_audio 的要求:

  • Node.js 18+
  • 麦克风

使用 voice_query 的要求(可选):

工具参考

执行录制或写入操作之前会先验证参数。工具未声明的参数会被拒绝,并显示指出该参数的错误,而不是被静默忽略。duration_ms 必须是介于 100 和 30000 之间的整数;silence_ms 必须是介于 100 和 10000 之间的整数;stop_on_silence 必须是布尔值;device 必须是非负整数索引,或来自 list_audio_devices 的非空字符串 ID。如果未启用静音停止却传入了 silence_ms,该参数将无法生效,因此也会像未知参数一样被拒绝。被拒绝的调用不会向磁盘写入任何内容。

list_audio_devices

返回可用音频输入设备的 JSON 数组。

**参数:**无

响应示例:

[
  { "index": 0, "name": "Microphone", "id": "wasapi:{0.0.1.00000000}.{00000000-0000-0000-0000-000000000001}", "maxInputChannels": 2, "defaultSampleRate": 48000, "isDefault": true },
  { "index": 1, "name": "Microphone Array", "id": "wasapi:{0.0.1.00000000}.{00000000-0000-0000-0000-000000000002}", "maxInputChannels": 2, "defaultSampleRate": 48000, "isDefault": false }
]

id 在重启和设备变更后保持稳定。index 表示位置,添加或移除设备时可能发生变化,而且设备名称并不唯一。选择设备时优先使用 id。在极少数情况下,主机无法为设备生成稳定的 ID,此时其 id 为空字符串,只能通过 index 选择。

capture_audio

从麦克风录制音频并保存为 WAV 文件。默认情况下,录制时长恰好为 duration_ms 指定的时长;如果设置了 stop_on_silence: true,则录制会在说话者停止说话时结束。

参数:

参数类型默认值描述
duration_msnumber5000录制时长,单位为毫秒(100-30000)。当 stop_on_silence 为 true 时,此值为最长时长,而非精确时长
devicenumber or stringsystem default来自 list_audio_devices 的设备索引或稳定设备 id
stop_on_silencebooleanfalse使用设备端语音活动检测(Silero VAD,随附,无需下载)检测到说话者停止说话时停止录制
silence_msnumber1000结束 stop_on_silence 录制所需的连续静音时长,单位为毫秒(100-10000)。需要设置 stop_on_silence: true

示例响应(固定时长):

{
  "path": "/tmp/mcp-listen-1712345678901.wav",
  "duration_ms": 5000,
  "sample_rate": 16000,
  "channels": 1,
  "size_bytes": 160044
}

示例响应(stop_on_silence: true):

{
  "path": "/tmp/mcp-listen-1712345678901.wav",
  "duration_ms": 2600,
  "sample_rate": 16000,
  "channels": 1,
  "size_bytes": 83244,
  "stopped_by": "silence",
  "speech_detected": true
}

使用 stop_on_silence 时,响应中的 duration_ms 表示实际录制时长,stopped_by 表示录制结束的原因:"silence"(说话者说完了)、"ceiling"(达到 duration_ms 上限),或 "no_speech_timeout"(10 秒内无人说话;仍会返回 WAV,并将 speech_detected 设为 false,因此静音会作为一种结果报告,而非错误)。检测按每个约 100ms 的音频缓冲区运行,因此实际静音等待时长会向上取整到下一个缓冲区;录音会保留从调用开始到决定停止期间的所有内容:语音边界处不会进行门控或裁剪,音频本身与对相同声音进行固定时长录制所得的音频逐字节一致。

voice_query

完整语音流水线:采集音频,在本机使用 whisper.cpp 转录,将转录文本发送到本地 Ollama 守护进程,并返回转录文本和回复。音频始终保留在本机。说话者停止说话时,录音会自动停止;设置 stop_on_silence: false 可录制固定时长。

参数:

参数类型默认值描述
duration_msnumber15000 / 5000最大录音时长,单位为毫秒(100-30000)。静音停止功能启用时默认为 15000;设置 stop_on_silence: false 时默认为 5000
devicenumber or stringsystem defaultlist_audio_devices 返回的设备索引或稳定设备 id
stop_on_silencebooleantrue说话者停止说话时停止录音。传入 false 可录制恰好 duration_ms 时长
silence_msnumber1000结束录音所需的连续静音时长,单位为毫秒(100-10000)
whisper_modelstringggml-base.en.binWhisper GGML 模型的路径或文件名
languagestringen转录所用的语言代码
modelstringllama3.2Ollama 模型名称
promptstringYou are a helpful assistant.大模型的系统提示词

响应示例:

{
  "transcription": "What is the default port for PostgreSQL?",
  "response": "PostgreSQL runs on port 5432 by default.",
  "model": "llama3.2"
}

结果类型。 voice_query 会报告五种不同的结果。结构化字段是接口契约(isError、speech_detected、transcription);任何 message 都只是便于人理解的提示,其措辞不属于接口契约,因此调用方应根据字段进行分支判断,而不是根据文本描述。规则很简单:如果流水线运行成功,结果就是成功(即使没有识别出任何词语);如果依赖项出错,结果就是错误。

结果isErrorspeech_detectedtranscriptionresponse
正常不存在不存在文本回复
完全没有语音不存在falsenullnull
有语音,但没有可转录的词语不存在true(设置 stop_on_silence: false 时不存在)nullnull
转录步骤失败true不存在不存在不存在
Ollama 不可用、出错或返回内容为空true不存在不存在(回复为空时为文本)不存在(回复为空时为 null)

调用方可通过 speech_detected(false 与 true)区分“用户没有说话”和“用户说话了,但没有识别出任何词语”;这两种情况的 transcription 均为 null。非语音音频不会发送到大模型:whisper 的非语音标记([BLANK_AUDIO]、[MUSIC]、(silence) 等)会被视为没有可用词语,而不会作为查询发送。

没有语音(speech_detected: false):

{
  "speech_detected": false,
  "stopped_by": "no_speech_timeout",
  "transcription": null,
  "response": null,
  "message": "No speech was detected. Ask the user to repeat, or check that the correct microphone is selected."
}

有语音,但没有可转录的词语(speech_detected: true、transcription: null):

{
  "speech_detected": true,
  "stopped_by": "silence",
  "transcription": null,
  "response": null,
  "message": "Speech was detected but could not be transcribed. It may have been too quiet, too brief, or unclear. Ask the user to repeat, a little louder and closer to the microphone."
}

转录失败和依赖项故障会返回 isError: true,并附上实际原因(模型缺失、whisper 加载失败、Ollama 未运行、超时或模型响应为空),以便调用方调试时判断故障发生在采集、转录还是大模型环节。

工作原理

mcp-listen 使用 decibri 跨平台采集麦克风音频。无需 ffmpeg、SoX 或系统音频工具。预构建的原生二进制文件,无需任何设置。

音频以 16-bit PCM、16kHz 单声道格式采集,这是语音转文本引擎的标准格式。

静音停止功能使用 decibri 内置的 Silero 语音活动检测模型,通过捆绑的 ONNX Runtime 在设备本地运行。不会下载任何额外内容,也不会有音频离开本机。停止判断依据是已采集的音频,而非实际经过的时间;VAD 只负责判断何时停止,不会门控或修改录制的样本。

voice_query 工具会采集音频,并在本机使用 whisper.cpp 转录,然后将转录内容发送到本地 Ollama 守护进程,并将转录内容和回复返回给调用客户端。音频会保留在本机。

Whisper 模型设置

voice_query 工具需要一个 Whisper GGML 模型文件。下载一个:

Linux / macOS:

mkdir -p ~/.mcp-listen/models
curl -L -o ~/.mcp-listen/models/ggml-base.en.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin

Windows (PowerShell):

mkdir "$env:USERPROFILE\.mcp-listen\models" -Force
Invoke-WebRequest -Uri "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin" -OutFile "$env:USERPROFILE\.mcp-listen\models\ggml-base.en.bin"

模型大小约为 150MB,只需下载一次。你也可以将 WHISPER_MODEL_PATH 环境变量设置为自定义目录。

Ollama 设置

  1. 从 https://ollama.com 安装 Ollama
  2. 拉取模型:ollama pull llama3.2
  3. 确保 Ollama 正在运行:ollama serve

已知限制

  1. 突发的响声可能会被识别为语音。 静音停止功能根据 VAD 分数判断“语音已开始”,因此关门声或咳嗽声可能会启动倒计时,并在静音达到 silence_ms 后结束录音,导致录制的内容很短且大多是静音。结果会明确显示这一情况:结果会报告实际时长,voice_query 会返回空转录内容,而不会凭空编造。增加最短语音时长保护是一个可考虑的改进方向。
  2. voice_query 要求 Ollama 正在运行。 如果 Ollama 未运行,工具会返回清晰的错误消息。
  3. 首次使用前必须下载 Whisper 模型。 voice_query 不会自行下载模型;首次调用前需要预先下载模型(约 150MB)。请参阅 Whisper 模型设置。
  4. 不支持流式处理。 MCP 的请求/响应模式意味着必须先采集完整段录音,再进行转录,然后发送给 LLM。没有实时的部分结果。
  5. 临时文件。 capture_audio 会将 WAV 文件写入系统临时目录并返回路径,因此调用者读取文件前,该文件必须保持存在。超过 24 小时的录音会在服务下次启动时删除;自上次重启以来录制的文件会一直保留到那时。voice_query 会在查询完成后立即删除录音。

故障排除

Windows:“Error opening microphone” Windows 可能默认禁止访问麦克风。前往 设置 > 隐私和安全性 > 麦克风,确保已为桌面应用启用麦克风访问权限。

Ollama:“Ollama is not running” 某些 Ollama 安装会自动作为后台服务启动。如果看到此错误,请手动运行 ollama serve,或检查 Ollama 服务是否正在运行。

Whisper:“model not found” 首次使用前必须下载 whisper 模型文件。请参阅 Whisper 模型设置了解说明。

Whisper:“installed but failed to load” @kutalia/whisper-node-addon 包已存在,但它依赖的原生库在你的系统上缺失或不兼容。错误中会包含指出相关库的底层加载器消息。重新安装该包无济于事;请解决所提示的库问题。

许可证

Apache-2.0。详情请参阅 LICENSE。

版权所有 2026 Decibri

评论

支持 Markdown

第一次接触 MCP?

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

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