驰声语音评测 MCP · chivox-local-mcp
大模型(GPT / Claude / Gemini / 通义千问 等)本质上是文字大脑:它擅长读和写,但天生听不到音频、打不开你的数据库、调不通第三方 API。
MCP(Model Context Protocol)是一套由 Anthropic 主导、业界共同推进的开放协议,它像一根"对讲机":让大模型可以在需要时主动去调用外部能力(工具、数据源、服务),然后把结果接回来继续对话。
想象一个具体场景:一位开发者用 Claude 做了一款 「AI 雅思口语陪练」小程序,接入驰声语音评测 MCP。当用户发来一段录音,整个链路是这样的:
配置阶段(开发者 · 一次性)
在 AI 后端的配置文件里填一行驰声 MCP Server 地址。大模型启动时自动发现:「我多了一个叫语音评测的工具」。
接收用户指令(终端用户)
小程序用户发来一段自我介绍录音:「帮我听听,发音哪里有问题?」后端把「文字 + 录音链接」打包给大模型。
大模型自主思考(LLM · 最核心的魔法)
chivox_voice_eval 的 MCP 工具!」MCP 协议 · 自动调用(LLM → 驰声)
大模型自动按 MCP 标准构造 tools/call 请求,把录音链接和参考文本发到驰声服务。开发者不需要写任何调用代码。
驰声服务处理(评测引擎)
驰声对音频进行考试级打分,把结构化结果通过 MCP 原路返回:overall 85、/θ/ 音发音错误、流利度 88。
大模型整合并输出反馈(LLM)
大模型把冷冰冰的分数翻译成温柔反馈:
听起来复杂,但对开发者来说只需要两件事:
在 AI 后端的配置里填入驰声 MCP Server 地址和 API Key,就这一次,以后新加评测能力完全免开发。
{
"mcpServers": {
"chivox-speech-eval": {
"type": "streamable-http",
"url": "https://mcp.cloud.chivox.com",
"headers": {
"Authorization": "Bearer sk-你的完整密钥"
}
}
}
}告诉大模型这个工具是做什么的、什么时候调用、结果怎么转成用户友好的反馈。
你是一位英语口语教练。
当用户发来录音时:
1. 调用 chivox-speech-eval 评分
2. 聚焦 <70 分的音素家族
3. 用高情商话术给出练习建议其余所有事情 —— 音频上传、鉴权、工具发现、调用时机、返回格式、结果整合 —— 都由 MCP 协议和大模型自己搞定。
根据你的技术栈,有三种等价的接入方式,底层都走完全相同的 MCP 协议:
适合产品经理、运营、不写后端代码的开发者。整个过程像在手机上装 App。
| 服务器地址 | https://mcp.cloud.chivox.com |
| 鉴权密钥 | Bearer sk-•••••••••• (须含前缀 Bearer 与后面空格,整体等价 HTTP 头 Authorization: Bearer sk-…) |
若表单已拆成「鉴权类型:Bearer」与「密钥 / Token」两栏,密钥框里只填 sk-… 即可;若只有一个「鉴权密钥」文本框且会原样写入请求头,则必须填完整 Bearer sk-…(Bearer 与 sk- 之间有一个空格)。
适合做独立 APP / 小程序、用 Dify 或 LangChain 写 Agent 的极客开发者。核心就是往配置文件里加一段 JSON。
mcp.json 或框架指定的配置路径)。mcpServers 下增加一个节点:{
"mcpServers": {
"chivox-speech-eval": {
"type": "streamable-http",
"url": "https://mcp.cloud.chivox.com",
"headers": {
"Authorization": "Bearer sk-你的完整密钥"
}
}
}
}适合不用任何 Agent 框架、直接调用 LLM API 的后端开发者。豆包 1.5+ / DeepSeek / GPT / Qwen 等模型都走标准 chat.completions 的 tools 参数。这里又分 A / B 两种做法,B 才是生产推荐。
3-A · 手写 tool schema(最快验证,不推荐生产)
快速 Demo自己写一段 JSON Schema 告诉豆包"有个工具叫 xxx,参数长这样",豆包返回 tool_call 后你再手动去调驰声 MCP。缺点:驰声有 16 个评测工具,你每加一个题型都要改代码。
import os, json
from openai import OpenAI
client = OpenAI(
base_url="https://ark.cn-beijing.volces.com/api/v3",
api_key=os.getenv('ARK_API_KEY'),
)
# ─── 手写一段 tool schema(不推荐:16 个工具就要写 16 段)───
tools = [{
"type": "function",
"function": {
"name": "en_word_eval",
"description": "英语单词发音评测。当用户让你评价英语发音并提供录音链接时调用。",
"parameters": {
"type": "object",
"properties": {
"audio_url": {"type": "string", "description": "录音 URL"},
"reference_text": {"type": "string", "description": "参考文本,如 Apple"},
},
"required": ["audio_url", "reference_text"]
}
}
}]
resp = client.chat.completions.create(
model="ep-xxx-doubao-tools",
messages=[
{"role": "system", "content": "你是英语老师,拿到评测结果后温柔地反馈,不要直接报分数。"},
{"role": "user", "content": "老师,我读了 Apple,录音 https://demo.com/u1.mp3"},
],
tools=tools,
tool_choice="auto",
)
msg = resp.choices[0].message
if msg.tool_calls:
args = json.loads(msg.tool_calls[0].function.arguments)
# ↓↓↓ 这里手动调驰声 MCP,再把结果回填给豆包做第二趟 ↓↓↓
# result = requests.post("https://mcp.cloud.chivox.com", json={...})3-B · 用 MCP 客户端库自动发现
生产推荐启动时连上驰声 MCP Server,调一次 tools/list,把 16 个评测工具自动转成 Function Calling 的 tools 格式。驰声加新工具,你代码不用改。这才是 MCP 协议的真正价值。
import asyncio, os
from openai import AsyncOpenAI
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
client = AsyncOpenAI(
base_url="https://ark.cn-beijing.volces.com/api/v3",
api_key=os.getenv("ARK_API_KEY"),
)
async def main():
# ─── 1. 连驰声 MCP Server,自动拉取全部 16 个工具 ───
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
mcp_tools = (await session.list_tools()).tools # ← 一行拿到全部工具
# ─── 2. MCP schema → OpenAI Function Calling schema ───
tools = [{
"type": "function",
"function": {
"name": t.name,
"description": t.description,
"parameters": t.inputSchema, # MCP 直接给 JSON Schema
}
} for t in mcp_tools]
# ─── 3. 正常调豆包,tools 由 MCP 动态注入 ───
resp = await client.chat.completions.create(
model="ep-xxx-doubao-tools",
messages=[
{"role": "system", "content": "你是英语老师,收到评测结果后温柔反馈。"},
{"role": "user", "content": "老师,我读了 Apple,录音 https://demo.com/u1.mp3"},
],
tools=tools,
tool_choice="auto",
)
# ─── 4. 折返跑:豆包选好工具后,直接走 MCP 调驰声 ───
msg = resp.choices[0].message
if msg.tool_calls:
call = msg.tool_calls[0]
result = await session.call_tool(
call.function.name,
arguments=__import__("json").loads(call.function.arguments),
)
# 把 result 回填给豆包做第二趟 chat.completions 即可
asyncio.run(main())想要更省心?直接用 官方 mcp python sdk、mcp-use、openai-agents,或火山官方 Arkitect 高代码 SDK,它们都把上面这段"MCP → Function Calling"的桥接封装好了。
mcp.json);后端生产服务用姿势三-B(MCP 客户端库自动发现工具,不要手写 tool schema)。驰声语音评测对外提供两条并行入口,底层指向同一个评测引擎,但面向不同的客户端环境,按能力选其一即可:
MCP 模式(推荐首选)
chivox-local-mcp 支持麦克风实时录音典型客户端:Cursor / Claude Desktop / Coze / Dify / LangChain / 自研后端 Agent
functioncalling 模式(非 MCP · cvx_fc)
resume_token 断线续播、intermediate 中间结果、backpressure 反压典型客户端:原生 Android / iOS / Flutter、微信 / 支付宝小程序、老版本 Java / PHP 后端
怎么选?
| 你的客户端环境 | 建议 |
|---|---|
| Cursor / Claude Desktop / 各类 AI IDE 能装 MCP | MCP 模式 |
| Python / Node / Java 后端能引入 MCP SDK | MCP 模式 |
| Coze / Dify / n8n 等可视化平台 | MCP 模式 |
| 原生 Android / iOS App,想直接打 HTTP + WS | functioncalling 模式 |
| 微信 / 支付宝 / 抖音小程序 | functioncalling 模式 |
| 老系统 / 封闭运行时,不想引入 MCP 依赖 | functioncalling 模式 |
/ws/audio/ 和 functioncalling 的 /ws/eval/ 属于不同的会话 ID 空间。MCP 模式下有两种部署形态,底层均走 JSON-RPC 2.0,区别只在客户端离服务端有没有一层本地代理:
形态 A · 远程直连(零代码)
适合 Cursor / Coze / Dify / n8n 等支持 Streamable HTTP 的客户端,无本地依赖。
AI 客户端
Cursor / Coze /
Dify / n8n …
⇄
Streamable HTTP
JSON-RPC 2.0
驰声 MCP Server
/mcp · /ws/audio
评测引擎
形态 B · 本地代理(支持麦克风实时录音)
适合 Claude Desktop / Claude Code 等以 stdio 挂载 MCP 的客户端,需要本地实时录音时走这条路径。
AI 客户端
Claude Desktop /
Claude Code
⇄
stdio
chivox-local-mcp
本地代理 · SoX 录音
⇄
HTTP / WS
Remote Chivox
MCP Server
评测引擎
标准数据流
initialize → 协商协议版本与能力tools/list → 拉取 16 个评测工具的 JSON Schematools/call → 服务端执行评测 → 返回 JSON-RPC 响应create_stream_session → 走 /ws/audio/{session_id} 推流 → stream_eval_result 收结构化评分原始 JSON-RPC 请求示例(自建客户端可直接抄)
如果你不使用官方 MCP SDK 而是直接通过 POST /mcp 自己拼 JSON-RPC 2.0 报文,最小可用的三条请求如下。所有请求均需携带 Authorization: Bearer <your_api_key>。
① 初始化 · initialize
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": { "name": "my-client", "version": "1.0.0" }
}
}成功后服务端返回协议版本、服务端能力、服务端信息,此后方可调用其他方法。
② 拉取工具清单 · tools/list
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}返回全部 16 个评测工具(英 10 + 中 6)+ 2 个流式工具,含名字、描述、参数 JSON Schema。客户端应缓存此响应,后续按需展示 / 桥接给 LLM。
③ 调用工具 · tools/call
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "en_word_eval",
"arguments": {
"ref_text": "hello",
"audio_base64": "<base64 encoded audio>",
"accent": 2,
"rank": 100
}
}
}成功响应放在 result.content[0].text(JSON 字符串形式,内部就是评测结果结构);失败则返回 error.code + error.message。
session.initialize() / session.list_tools() / session.call_tool()。这里仅供裸协议实现或排障时参考。没有代理、没有 SDK,客户端 ↔ 服务端只有两条链路:一条 REST 管会话 / 文件评测,一条 WebSocket 推音频帧。
客户端
原生 App / 小程序 /
老版后端 / 纯前端
⇄
HTTP REST
/v1/call · /v1/functions
cvx_fc 服务
function-calling 网关
评测引擎
⇄
WebSocket
/ws/eval/{id}
客户端推流
麦克风 / 分片缓冲
三条典型数据流
a. 一次性文件评测
POST /v1/call(audio_url 或 audio_base64) → 同步返回评分
b. 流式实时评测
POST /v1/call → start_stream_eval → 拿 ws_url → 连 /ws/eval/{id} → 推 PCM → 收 intermediate / backpressure → 发 stop → 收 result
c. 断线恢复 + 兜底拉取
网络断开 60 秒内 → 用 resume_token 重连续播;彻底失败 → POST /v1/call → get_stream_result 兜底
特色能力
suggested_interval_ms,客户端按建议降速SESSION_EXPIRED / INVALID_STATE / … 便于客户端写重试逻辑详细的接入示例见下文 「接入 · 非 MCP 原生 REST」 大节。
| 维度 | MCP 模式 | functioncalling(cvx_fc) |
|---|---|---|
| 协议 | JSON-RPC 2.0 | REST + WebSocket |
| 入口路径 | POST /mcp | POST /v1/call |
| 列出工具 | tools/list | GET /v1/functions |
| 调用工具 | tools/call | POST /v1/call + name |
| 流式音频 WS | /ws/audio/{session_id} | /ws/eval/{session_id} |
| 本地 stdio 代理 | 支持(chivox-local-mcp) | 不适用 |
| 断线重连 | 客户端 SDK 自动重连 | resume_token(60s 挂起) |
| 中间结果 | stream_eval 回调 | intermediate 帧 |
| 背压反馈 | — | backpressure 帧 |
| 客户端依赖 | MCP SDK(官方 / 框架) | 仅 HTTP + WS 客户端 |
chivox-local-mcp 是驰声语音评测的 MCP 本地代理,通过 Model Context Protocol 将远程驰声评测服务桥接到本地,让 AI 助手(Claude Desktop、Claude Code、Cursor 等)直接调用语音评测能力。
它支持两种评测模式,覆盖从即时交互到批量处理的全部场景:
通过麦克风边录边评,音频以 WebSocket 流式推送,无需生成中间文件,延迟更低、体验更佳。
支持本地文件路径、Base64 编码、URL 三种输入,适合已有音频的批量评测场景。
| 依赖 | 版本 | 说明 |
|---|---|---|
| Node.js | >= 18 | 运行时必须 |
| SoX | any | 仅实时录音功能需要(处理麦克风音频流) |
安装 SoX(仅在使用实时录音时需要):
# macOS
brew install sox
# Ubuntu / Debian
sudo apt-get install sox
# Windows:从 https://sox.sourceforge.net/ 下载安装,并将安装目录加入 PATH构建或接入前可快速自检:
node -v # 需 >= 18
rec --version # 可选;未安装 SoX 会提示找不到命令,仅影响实时录音源码仓库:公网 github.com/chivox-developer/cvx_local_mcp;内网可选 git.chivox.com/CLOUD_DEV/cvx_local_mcp。二者为同一项目,按网络环境任选其一 clone 即可。
方式一:npm 安装依赖并编译(与仓库 README 一致)
git clone https://github.com/chivox-developer/cvx_local_mcp.git
# 或:git clone https://git.chivox.com/CLOUD_DEV/cvx_local_mcp.git
cd cvx_local_mcp
npm install
npm run build方式二:一键构建脚本
git clone https://github.com/chivox-developer/cvx_local_mcp.git
cd cvx_local_mcp
bash scripts/build.sh(可选)全局命令 chivox-local-mcp
在仓库根目录完成 npm run build 后,可将入口挂到 PATH,便于在 Claude 等客户端里只写命令名、不写 node …/dist/index.js:
cd cvx_local_mcp
npm link
# 或:npm install -g .args 须指向本机绝对路径下的 dist/index.js;使用全局命令时可将 command 设为 chivox-local-mcp。本地调试也可在项目目录执行 npm run start(需已设置 MCP_REMOTE_URL / MCP_API_KEY 等环境变量)。| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| MCP_REMOTE_URL | string | — | 远程驰声 MCP 服务地址;未设置时默认 https://mcp.cloud.chivox.com |
| MCP_API_KEY | string | — | API 认证密钥(远程服务开启鉴权时必填) |
这一类接入的共同特征
最新版(2026):在 Cursor 中按 Cmd/Ctrl + Shift + J 打开 Settings → 左侧 MCP → Add new MCP server。也可直接编辑 ~/.cursor/mcp.json(全局)或项目根目录 .cursor/mcp.json。
streamable-http(远程){
"mcpServers": {
"chivox-speech-eval": {
"type": "streamable-http",
"url": "https://mcp.cloud.chivox.com",
"headers": {
"Authorization": "Bearer sk-你的完整密钥"
}
}
}
}最新版(2026):Claude Desktop 已提供 Settings → Connectors → Add custom connector 的可视化入口,无需手写 JSON 即可挂载远程 MCP 服务;本地 stdio 仍可通过 claude_desktop_config.json 或 Desktop Extensions(.mcpb)安装。
方式一:UI 直接添加(推荐,远程 Streamable HTTP)
chivox-speech-eval,URL 填 https://mcp.cloud.chivox.com方式二:编辑配置文件(本地代理 / 实时录音)
macOS:~/Library/Application Support/Claude/claude_desktop_config.json,Windows:%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"chivox-speech-eval": {
"command": "node",
"args": ["/path/to/cvx_local_mcp/dist/index.js"],
"env": {
"MCP_REMOTE_URL": "https://mcp.cloud.chivox.com",
"MCP_API_KEY": "sk-你的完整密钥"
}
}
}
}最新版支持 claude mcp add 直接挂载,远程模式可使用 --transport http 一行接入:
claude mcp add --transport http chivox-speech-eval https://mcp.cloud.chivox.com \
--header "Authorization: Bearer sk-你的完整密钥"# 源码构建后
claude mcp add chivox-speech-eval -- env MCP_REMOTE_URL=https://mcp.cloud.chivox.com MCP_API_KEY=sk-你的完整密钥 node /path/to/cvx_local_mcp/dist/index.js除了 Cursor 和 Claude Code,主流的 AI 编程 IDE 都原生支持 MCP。以下客户端使用完全一致的 Streamable HTTP 配置,区别只在配置入口(点击右侧按钮直达官方添加文档):
| 客户端 | 最新配置入口(2026) | 官方文档 |
|---|---|---|
| Windsurf (Codeium) | Cascade 面板右上 MCP 图标 → MCP Marketplace / Add Server,或 ~/.codeium/windsurf/mcp_config.json | Windsurf MCP |
| Zed | Agent Panel → Settings → Add Context Server,或 ~/.config/zed/settings.json 中 context_servers | Zed MCP |
| Continue (VS Code / JetBrains) | 在工作区 .continue/mcpServers/ 下放 *.yaml 或直接拷 Cursor/Claude 风格 JSON(仅 Agent 模式可用) | Continue MCP |
| Cline (VS Code 扩展) | Cline 顶栏 MCP Servers 图标 → Marketplace / Edit Configuration(OAuth、远程 URL 都已原生支持) | Cline MCP |
| VS Code GitHub Copilot | 命令面板 → MCP: Add Server(v1.99+ 内建 MCP 客户端) | VS Code MCP |
| 通义灵码 / CodeGeeX / 文心快码 | 插件设置 → MCP 服务(陆续支持,参见各自文档) | — |
{
"mcpServers": {
"chivox-speech-eval": {
"type": "streamable-http",
"url": "https://mcp.cloud.chivox.com",
"headers": {
"Authorization": "Bearer sk-你的完整密钥"
}
}
}
}扣子(Coze)是字节跳动推出的 AI 应用开发平台,已原生支持 MCP 协议。当前主流接入路径是把 MCP 包装成扣子插件 / 应用扩展,再以 JSON 配置形式挂载到扣子空间或 Bot。具体表单字段请以官方最新版为准。
方式一:扣子空间「自定义 MCP」扩展
{
"mcpServers": {
"chivox-speech-eval": {
"type": "streamable-http",
"url": "https://mcp.cloud.chivox.com",
"headers": {
"Authorization": "Bearer sk-你的完整密钥"
}
}
}
}JSON 里 headers.Authorization 的值必须是带前缀的整串: Bearer sk-你的完整密钥(注意 Bearer 后空格)。与上文「姿势一」表单里单独一个「鉴权密钥」框时的填法一致。
方式二:在 Coze 开发平台的 Bot 中使用
https://mcp.cloud.chivox.comAuthorization 填 Bearer sk-你的完整密钥;若界面已选 Bearer 类型,密钥框只填 sk-…evaluate_english_word 等)你是一位专业的英语口语教练。当用户上传音频并请求评测时:
1. 使用 evaluate_english_word / evaluate_english_sentence 等工具进行评测
2. 根据评测结果(overall、accuracy、fluency 等分数)给出专业分析
3. 针对得分较低的维度提供具体改进建议
4. 鼓励用户持续练习如果你需要在 Coze 工作流中集成语音评测能力,可以通过 HTTP Request 节点调用评测 API:
步骤 1:上传音频
在工作流中添加一个 HTTP Request 节点,配置如下:
| 配置项 | 值 |
|---|---|
| 方法 | POST |
| URL | https://your-audio-host.com/upload |
| Content-Type | audio/mp3 |
| Body | 音频文件二进制数据 |
响应中获取 {{audioId}},传递给下一步。
步骤 2:调用评测
添加第二个 HTTP Request 节点,通过 MCP 接口调用评测工具:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "evaluate_english_sentence",
"arguments": {
"audioId": "{{audioId}}",
"sentence": "{{ref_text}}"
}
},
"id": 1
}步骤 3:处理结果
评测结果通过 JSON 格式返回,可使用 Coze 的 代码节点 或 LLM 节点 对结果进行解析和二次处理(如生成学习建议、计算进步趋势等)。
完整工作流示意
这一类是面向「上班族」的企业 / 日常 AI 助手,产品形态是个聊天框 + 插件 / 连接器。接入后,员工在客户端里打字「帮我评一下这段录音」就能自动触发驰声评测,不用写任何代码。下列为站内已核对、入口相对明确的两种;钉钉 / 飞书等产品内 MCP 入口因版本与灰度差异较大,暂不写入本文,避免误导。
企业微信 智能机器人
企业微信开放平台已支持把外部 MCP 服务挂载给企业内的智能机器人 / 应用,可在群聊与会话中直接调用。
"Bearer <MCP_API_KEY>"WorkBuddy(腾讯云 CodeBuddy)
腾讯云 CodeBuddy 团队推出的 AI 原生桌面智能体工作台。实测以 JSON 配置为准:客户端的 MCP 入口直接粘贴上文「通用配置」JSON 片段即可。
mcpServers 节点)任何遵循 MCP 协议的客户端都可以接入,统一使用以下配置:
| 配置项 | 值 |
|---|---|
| 传输类型 | streamable-http |
| URL | https://mcp.cloud.chivox.com |
| 鉴权(可选) | Header:Authorization: Bearer <MCP_API_KEY> |
大多数客户端读取 mcpServers 配置,可直接复制以下 JSON 片段:
{
"mcpServers": {
"chivox-speech-eval": {
"type": "streamable-http",
"url": "https://mcp.cloud.chivox.com",
"headers": {
"Authorization": "Bearer sk-你的完整密钥"
}
}
}
}字段名因客户端而异(如部分用 transport 替代 type),未配置鉴权时可去掉 headers。还没找到你用的客户端?任何支持 Model Context Protocol 的终端都通用。找不到入口?下一小节「编程用 MCP」里用 SDK 直接接即可。
这一类接入的共同特征
💡 强烈推荐①或②:驰声有 16 个评测工具,让 MCP 自动注入 tool schema,每新增一个题型不用改一行业务代码。
最底层、也最推荐的方式。由 Anthropic 官方维护,一次连接自动拿到全部工具的 JSON Schema,然后交给任意 LLM。
Python:mcp
# pip install mcp openai
import asyncio, os
from openai import OpenAI
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
MCP_URL = "https://mcp.cloud.chivox.com"
llm = OpenAI(api_key=os.getenv("DOUBAO_KEY"),
base_url="https://ark.cn-beijing.volces.com/api/v3") # 豆包 / DeepSeek / OpenAI 同构
async def main(audio_id: str, ref: str):
async with streamablehttp_client(
MCP_URL,
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (reader, writer, _):
async with ClientSession(reader, writer) as sess:
await sess.initialize()
tools = await sess.list_tools()
openai_tools = [{
"type": "function",
"function": {"name": t.name, "description": t.description,
"parameters": t.inputSchema},
} for t in tools.tools]
resp = llm.chat.completions.create(
model="doubao-1-5-pro-32k",
messages=[{"role": "user",
"content": f"帮我评测 audioId={audio_id},参考文本:{ref}"}],
tools=openai_tools,
)
for call in resp.choices[0].message.tool_calls or []:
result = await sess.call_tool(call.function.name,
arguments=eval(call.function.arguments))
print(call.function.name, "→", result.content[0].text[:200])
asyncio.run(main("abc123", "I think therefore I am"))TypeScript / Node.js:@modelcontextprotocol/sdk
// npm i @modelcontextprotocol/sdk openai
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import OpenAI from "openai";
const mcp = new Client({ name: "chivox-biz", version: "1.0.0" });
await mcp.connect(new StreamableHTTPClientTransport(
new URL("https://mcp.cloud.chivox.com"),
{ requestInit: { headers: { "Authorization": `Bearer ${process.env.CHIVOX_API_KEY}` } } }
));
const { tools } = await mcp.listTools();
const openai = new OpenAI({ apiKey: process.env.DEEPSEEK_KEY, baseURL: "https://api.deepseek.com/v1" });
const resp = await openai.chat.completions.create({
model: "deepseek-chat",
messages: [{ role: "user", content: "评测 audioId=abc123, 参考 I think therefore I am" }],
tools: tools.map(t => ({ type: "function", function: {
name: t.name, description: t.description, parameters: t.inputSchema
}})),
});
for (const call of resp.choices[0].message.tool_calls ?? []) {
const r = await mcp.callTool({ name: call.function.name,
arguments: JSON.parse(call.function.arguments) });
console.log(call.function.name, r.content);
}如果项目已经在用 Agent 框架,几行 adapter 就能把驰声 MCP 塞进去,框架本身会接管 tool-calling 循环、重试、日志。
LangChain / LangGraph(Python)
# pip install langchain-mcp-adapters langgraph
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
client = MultiServerMCPClient({
"chivox-speech-eval": {
"transport": "streamable_http",
"url": "https://mcp.cloud.chivox.com",
"headers": {"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
}
})
tools = await client.get_tools()
agent = create_react_agent("openai:gpt-4o-mini", tools)
result = await agent.ainvoke({"messages":
[("user", "评测 audioId=abc123 参考 think")]})
print(result["messages"][-1].content)Mastra(TypeScript)
// npm i @mastra/core @mastra/mcp
import { MCPClient } from "@mastra/mcp";
import { Agent } from "@mastra/core/agent";
import { openai } from "@ai-sdk/openai";
const mcp = new MCPClient({ servers: {
"chivox-speech-eval": {
url: new URL("https://mcp.cloud.chivox.com"),
requestInit: { headers: { Authorization: `Bearer ${process.env.CHIVOX_API_KEY}` } },
}
}});
export const speechCoach = new Agent({
name: "speech-coach",
instructions: "你是口语教练,用 chivox 工具评测并给改进建议。",
model: openai("gpt-4o-mini"),
tools: await mcp.getTools(),
});OpenAI Agents SDK(Python)
# pip install openai-agents
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
chivox = MCPServerStreamableHttp(
params={
"url": "https://mcp.cloud.chivox.com",
"headers": {"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
},
name="chivox-speech-eval",
)
async with chivox:
agent = Agent(name="coach",
instructions="专业口语教练",
mcp_servers=[chivox])
r = await Runner.run(agent, "评测 audioId=abc123")
print(r.final_output)LlamaIndex / AutoGen / CrewAI
这些框架都有官方或社区 MCP adapter,用法与上述类似:
llama-index-tools-mcpautogen-ext[mcp]crewai-tools 的 MCPServerAdapterspring-ai-mcp-clientDeepSeek、GLM(智谱)、KIMI(Moonshot)、豆包(火山方舟)、千帆、DashScope 等若提供 OpenAI 兼容的 HTTP API,接入驰声 MCP 的套路一致:用 MCP 客户端拉取工具列表 → 转为 tools → 模型决策 tool_calls → MCP 执行并回填 → 再让模型生成诊断话术。
base_url 与 api_key,驰声 MCP 与 tools 桥接代码可原样复用。先上传音频,拿到 audioId
文件评测工具通常需要 audioId(或路径参数,视工具而定)。下面是用 HTTP 上传的最小示例:
import requests
with open('audio.mp3', 'rb') as f:
r = requests.post(
'https://your-audio-host.com/upload',
data=f,
headers={'Content-Type': 'audio/mp3'}
)
result = r.json()
print(f"audioId: {result['audioId']}")
print(f"size: {result['size']} bytes")
print(f"expires: {result['expiresIn']}")const fs = require('fs');
const audioData = fs.readFileSync('audio.mp3');
const res = await fetch('https://your-audio-host.com/upload', {
method: 'POST',
headers: { 'Content-Type': 'audio/mp3' },
body: audioData,
});
const result = await res.json();
console.log('audioId:', result.audioId);再以豆包为例:MCP 动态 tools + chat.completions 折返跑
当你用的 LLM SDK 还没有原生 MCP 支持(比如老版本的火山方舟 / 百度千帆 / 通义 DashScope),退化方案是:用 MCP 客户端一次性拉到 tool schema,然后按 OpenAI Function Calling 格式喂给 LLM。
# 适用:豆包(火山方舟)/ DeepSeek / Qwen / Moonshot / GLM 等 OpenAI 兼容 API
# 核心思路:MCP 列工具 → 转 OpenAI tools → LLM 决策 → MCP 执行 → 回填
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (r, w, _):
async with ClientSession(r, w) as mcp:
await mcp.initialize()
tools = (await mcp.list_tools()).tools
# ① 用 MCP 拉到的 schema 自动转 OpenAI 格式
oa_tools = [{"type": "function", "function": {
"name": t.name,
"description": t.description,
"parameters": t.inputSchema,
}} for t in tools]
# ② 喂给豆包
messages = [{"role": "user", "content": "评测一下 audioId=abc123"}]
resp = doubao.chat.completions.create(
model="doubao-1-5-pro-32k", messages=messages, tools=oa_tools,
)
# ③ LLM 回 tool_calls → 折返跑到 MCP 执行
msg = resp.choices[0].message
if msg.tool_calls:
messages.append(msg)
for c in msg.tool_calls:
result = await mcp.call_tool(
c.function.name, arguments=json.loads(c.function.arguments))
messages.append({"role": "tool", "tool_call_id": c.id,
"content": result.content[0].text})
# ④ 再喂一轮,让豆包根据评测结果产出自然语言诊断
final = doubao.chat.completions.create(
model="doubao-1-5-pro-32k", messages=messages)
print(final.choices[0].message.content)list_tools() 动态拿。大部分落地场景其实是:你已有一个业务后端(教育 SaaS / 培训系统 / 客服平台),只需要新增一个「语音评测」能力。推荐架构:
FastAPI 示例(生产最小骨架)
from fastapi import FastAPI
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
from contextlib import asynccontextmanager
mcp_session: ClientSession | None = None
@asynccontextmanager
async def lifespan(app):
global mcp_session
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (r, w, _):
async with ClientSession(r, w) as s:
await s.initialize()
mcp_session = s
yield
mcp_session = None
app = FastAPI(lifespan=lifespan)
@app.post("/api/evaluate")
async def evaluate(audio_id: str, ref_text: str):
# 直接选一个最合适的工具执行(不经 LLM,延迟最低)
r = await mcp_session.call_tool("evaluate_english_sentence",
{"audioId": audio_id, "sentence": ref_text})
return {"result": r.content[0].text}下面是 ① ~ ④ 中第③种「直调 chat.completions」按主流 LLM 厂商的细化写法
各家 SDK / base_url / 鉴权写法略有差别,挑你当前用的那一家看即可;驰声 MCP 侧代码不用改。
DeepSeek 提供与 OpenAI 完全兼容的 API,当前最新模型为 DeepSeek-V3.2(2025 年 12 月发布,首个把"思考 + 工具调用"原生融合的模型)。 通过 deepseek-chat 进入非思考模式, 通过 deepseek-reasoner 进入思考模式,两种模式均支持 Function Calling,128K 上下文。
环境准备
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
CHIVOX_API_KEY=your_chivox_api_key完整示例(Python)
import os, json, asyncio
from openai import OpenAI
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
# DeepSeek 客户端(OpenAI 兼容)
client = OpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com/v1",
)
async def evaluate_with_deepseek(audio_id: str, ref_text: str):
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (r, w, _):
async with ClientSession(r, w) as mcp:
await mcp.initialize()
# ① 拉取驰声 MCP 工具列表
tools = (await mcp.list_tools()).tools
oa_tools = [{"type": "function", "function": {
"name": t.name,
"description": t.description,
"parameters": t.inputSchema,
}} for t in tools]
# ② 调用 DeepSeek,让它选择合适的评测工具
messages = [{"role": "user", "content":
f"请评测这段英文录音,audioId={audio_id},参考文本:{ref_text}"}]
resp = client.chat.completions.create(
model="deepseek-chat", # 或 deepseek-reasoner
messages=messages,
tools=oa_tools,
)
# ③ 执行 tool_calls
msg = resp.choices[0].message
if msg.tool_calls:
messages.append(msg)
for call in msg.tool_calls:
result = await mcp.call_tool(
call.function.name,
arguments=json.loads(call.function.arguments),
)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result.content[0].text,
})
# ④ 让 DeepSeek 根据评测结果生成自然语言诊断
final = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
)
return final.choices[0].message.content
asyncio.run(evaluate_with_deepseek("audio_abc123", "Hello, nice to meet you."))deepseek-chat,速度快、token 消耗低; 需要深度分析(错误归因 / 个性化练习路径)时用 deepseek-reasoner, V3.2 起思考模式也能在思维链中调用工具,可以一次性完成"调评测 → 思考 → 出诊断",无需再切回 V3 做工具调用。智谱 AI 当前最新旗舰为 GLM-5 / GLM-5.1(2026 年 2 月发布,744B-A40B MoE,200K 上下文,对标 Claude Opus 4.5), 以及上一代 GLM-4.7、GLM-4.6。 此外保留 glm-4-flash(免费快速版)方便开发测试。 全部模型支持 OpenAI 兼容接口与原生 zhipuai SDK,原生 Function Calling。
环境准备
ZHIPU_API_KEY=xxxxxxxx.xxxxxxxxxxxxxxxx
CHIVOX_API_KEY=your_chivox_api_key方式一:OpenAI 兼容接口(推荐)
import os, json, asyncio
from openai import OpenAI
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
client = OpenAI(
api_key=os.environ["ZHIPU_API_KEY"],
base_url="https://open.bigmodel.cn/api/paas/v4/",
)
async def evaluate_with_glm(audio_id: str, ref_text: str):
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (r, w, _):
async with ClientSession(r, w) as mcp:
await mcp.initialize()
tools = (await mcp.list_tools()).tools
oa_tools = [{"type": "function", "function": {
"name": t.name,
"description": t.description,
"parameters": t.inputSchema,
}} for t in tools]
messages = [{"role": "user", "content":
f"请评测这段录音,audioId={audio_id},参考文本:{ref_text}"}]
resp = client.chat.completions.create(
model="glm-4-flash", # 免费快速版;生产推荐 glm-5 / glm-4.7
messages=messages,
tools=oa_tools,
)
msg = resp.choices[0].message
if msg.tool_calls:
messages.append(msg)
for call in msg.tool_calls:
result = await mcp.call_tool(
call.function.name,
arguments=json.loads(call.function.arguments),
)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result.content[0].text,
})
final = client.chat.completions.create(
model="glm-4-flash", messages=messages)
return final.choices[0].message.content
asyncio.run(evaluate_with_glm("audio_abc123", "How are you today?"))方式二:官方 zhipuai SDK
from zhipuai import ZhipuAI
client = ZhipuAI(api_key=os.environ["ZHIPU_API_KEY"])
# 其余逻辑与方式一相同,仅替换 client 实例
resp = client.chat.completions.create(
model="glm-5", # 旗舰;也可用 glm-4.7 / glm-4-flash
messages=messages,
tools=oa_tools,
)glm-4-flash(免费); 在线辅导日常诊断用 glm-4.7 性价比最高; K12 / 复杂 Agent 编排(多步评测 + 个性化练习路径)用 glm-5 / glm-5.1, 200K 上下文、Agent 能力对标 Claude Opus 系列。Moonshot AI 当前最新旗舰是 Kimi K2.5(2026 年 1 月 27 日发布,MoE 架构、256K 上下文、原生多模态、Agent 集群协作)。 另外提供 kimi-k2-thinking(深度思考)、kimi-k2-turbo-preview(高速版)。 上一代 moonshot-v1-8k/32k/128k 仍然兼容,但推荐迁移到 kimi-k2.5。 全部模型 OpenAI 兼容,原生 Function Calling。
环境准备
MOONSHOT_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
CHIVOX_API_KEY=your_chivox_api_key完整示例(Python)
import os, json, asyncio
from openai import OpenAI
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
# 中国大陆用 api.moonshot.cn;海外/国际版用 api.moonshot.ai
client = OpenAI(
api_key=os.environ["MOONSHOT_API_KEY"],
base_url="https://api.moonshot.cn/v1",
)
async def evaluate_with_kimi(audio_id: str, ref_text: str):
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (r, w, _):
async with ClientSession(r, w) as mcp:
await mcp.initialize()
tools = (await mcp.list_tools()).tools
oa_tools = [{"type": "function", "function": {
"name": t.name,
"description": t.description,
"parameters": t.inputSchema,
}} for t in tools]
messages = [{"role": "user", "content":
f"请评测这段英文录音,audioId={audio_id},参考文本:{ref_text}"}]
resp = client.chat.completions.create(
model="kimi-k2.5", # 旗舰;也可选 kimi-k2-turbo-preview / moonshot-v1-128k
messages=messages,
tools=oa_tools,
)
msg = resp.choices[0].message
if msg.tool_calls:
messages.append(msg)
for call in msg.tool_calls:
result = await mcp.call_tool(
call.function.name,
arguments=json.loads(call.function.arguments),
)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result.content[0].text,
})
final = client.chat.completions.create(
model="kimi-k2.5", messages=messages)
return final.choices[0].message.content
asyncio.run(evaluate_with_kimi("audio_abc123", "Nice to meet you."))kimi-k2-thinking, 追求实时反馈用 kimi-k2-turbo-preview。字节跳动 豆包 Seed 2.0(2026 年 2 月发布)是 ByteDance Seed 团队推出的新一代通用大模型,覆盖 Pro / Lite / Mini / Code 多种规格, 通过 火山方舟(Volcano Ark) 提供 OpenAI 兼容的 /api/v3/chat/completions 接口, 原生支持 Function Calling、JSON Schema 结构化输出、深度思考(Chain-of-Thought)模式, 接驰声 MCP 几乎无须改动业务代码。
en.sent.score,看完弱项再调 en.word.score 进一步定位音素", 适合做"多步评测 + 自动纠音"这类 Agent 场景。 默认开启思考模式,可通过 thinking: { type: "disabled" } 关闭以节省时延。推荐版本
| model | 规格 | 推荐用途 |
|---|---|---|
| doubao-seed-2-0-pro-260215 | Pro · 旗舰 | 多步评测 + 深度诊断 + 复杂 Agent 编排 |
| doubao-seed-2-0-lite-260215 | Lite · 平衡 | 在线辅导单轮评测 + 自然语言反馈,性价比首选 |
| doubao-seed-2-0-mini-260215 | Mini · 极小 | 高并发 / 边缘部署 / 移动端实时反馈 |
| doubao-seed-2-0-code-preview-260215 | Code · 预览 | 代码生成 / 工具编排 DSL,对评测场景非主推 |
| doubao-seed-1-8-251228 | 1.8 · 深度思考 | 支持 reasoning_effort 调档(minimal/low/medium/high),上一代深度思考强化版仍可用 |
| doubao-seed-1-6-251015 | 1.6 · 经典 | 256K 上下文经典版,已上线项目可继续沿用 |
环境准备
# 火山方舟控制台 → API Key 管理
ARK_API_KEY=ak-xxxxxxxxxxxxxxxxxxxxxxxx
CHIVOX_API_KEY=your_chivox_api_key完整示例(Python · 动态 tools + 折返跑)
import os, json, asyncio
from openai import OpenAI
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
# 火山方舟 OpenAI 兼容端点
client = OpenAI(
api_key=os.environ["ARK_API_KEY"],
base_url="https://ark.cn-beijing.volces.com/api/v3",
)
MODEL = "doubao-seed-2-0-pro-260215" # 也可换成 lite / mini
async def evaluate_with_doubao(audio_id: str, ref_text: str):
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (r, w, _):
async with ClientSession(r, w) as mcp:
await mcp.initialize()
# ① 把驰声 16 个评测工具的 schema 动态注入豆包
tools = (await mcp.list_tools()).tools
ark_tools = [{
"type": "function",
"function": {
"name": t.name,
"description": t.description,
"parameters": t.inputSchema,
},
} for t in tools]
messages = [
{"role": "system",
"content": "你是一位专业的英语口语教练,会主动调用驰声评测工具获取真实分数。"},
{"role": "user",
"content": f"请评测这段录音,audio_id={audio_id},参考文本:{ref_text}。"
f"先做句子级评测,弱项再追加单词级定位。"},
]
# ② 第一轮 —— 让豆包根据 prompt 自主选工具
resp = client.chat.completions.create(
model=MODEL,
messages=messages,
tools=ark_tools,
tool_choice="auto",
# extra_body={"thinking": {"type": "disabled"}}, # 需要时可关思考
)
msg = resp.choices[0].message
messages.append(msg)
# ③ 折返跑:豆包可能一次发起多个 tool_calls,全部回填
for call in (msg.tool_calls or []):
result = await mcp.call_tool(
call.function.name,
arguments=json.loads(call.function.arguments),
)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result.content[0].text,
})
# ④ 第二轮 —— 让豆包基于真实评测 JSON 输出诊断 / 练习建议
final = client.chat.completions.create(
model=MODEL,
messages=messages,
)
return final.choices[0].message.content
print(asyncio.run(evaluate_with_doubao(
audio_id="audio_abc123",
ref_text="The quick brown fox jumps over the lazy dog.",
)))深度思考模式(可选)
豆包 Seed 2.0 默认开启 thinking 模式,会在内部生成思维链再产出答案, 对"多步评测编排 / 复杂诊断"质量明显更好;但会增加 30%~80% 的端到端延迟。 在 extra_body 里可显式控制:
# 关闭思考(更快、适合实时反馈)
client.chat.completions.create(
model="doubao-seed-2-0-lite-260215",
messages=messages,
tools=ark_tools,
extra_body={"thinking": {"type": "disabled"}},
)
# 开启思考(默认,适合 Pro 模型 + 多步 Agent)
client.chat.completions.create(
model="doubao-seed-2-0-pro-260215",
messages=messages,
tools=ark_tools,
extra_body={"thinking": {"type": "enabled"}},
)doubao-seed-2-0-lite + 关思考; K12 / 考试场景需要"多题型联动 + 升级建议"时用 doubao-seed-2-0-pro + 开思考; 移动端实时口语对话用 doubao-seed-2-0-mini 控制成本与时延。OpenAI 当前旗舰为 GPT-5.1(2025-11-13 发布),400K 上下文、128K 最大输出, 支持可调推理强度 reasoning_effort(none / low / medium / high)。 另有 gpt-5.1-chat-latest(ChatGPT 同款,128K 上下文,对话场景更优)和 gpt-5-mini(性价比版)。 全部模型原生支持 Function Calling 与 Structured Outputs。
环境准备
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
CHIVOX_API_KEY=your_chivox_api_key完整示例(Python · GPT-5.1 + 驰声 MCP)
import os, json, asyncio
from openai import OpenAI
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
async def evaluate_with_gpt(audio_id: str, ref_text: str):
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (r, w, _):
async with ClientSession(r, w) as mcp:
await mcp.initialize()
tools = (await mcp.list_tools()).tools
oa_tools = [{"type": "function", "function": {
"name": t.name,
"description": t.description,
"parameters": t.inputSchema,
}} for t in tools]
messages = [
{"role": "system",
"content": "你是英语口语教练,必须调用驰声评测工具拿真实分数后再回答。"},
{"role": "user",
"content": f"请评测:audioId={audio_id},参考文本:{ref_text}"},
]
resp = client.chat.completions.create(
model="gpt-5.1",
messages=messages,
tools=oa_tools,
tool_choice="auto",
reasoning_effort="medium", # GPT-5.1 新参数:none / low / medium / high
)
msg = resp.choices[0].message
messages.append(msg)
for call in (msg.tool_calls or []):
result = await mcp.call_tool(
call.function.name,
arguments=json.loads(call.function.arguments),
)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result.content[0].text,
})
final = client.chat.completions.create(
model="gpt-5.1", messages=messages)
return final.choices[0].message.content
print(asyncio.run(evaluate_with_gpt(
"audio_abc123", "The quick brown fox jumps over the lazy dog.")))gpt-5.1(reasoning_effort="medium",质量与延迟平衡); 纯对话/课堂讲解用 gpt-5.1-chat-latest; 高并发批量评测降本用 gpt-5-mini。 深度推理 / 多步 Agent 编排把 reasoning_effort 调到 high。Anthropic 当前最新为 Claude Opus 4.7(旗舰)、Claude Sonnet 4.6(平衡)、Claude Haiku 4.5(高速)。 Claude 用 Messages API(与 OpenAI Chat Completions 不同),工具协议是 tool_use / tool_result 块结构。 支持文本 + 视觉输入,工具 schema 用 input_schema 字段(与 OpenAI 的 parameters 等价)。
环境准备
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxxxxxxxxxx
CHIVOX_API_KEY=your_chivox_api_key完整示例(Python · 原生 Anthropic SDK + MCP 工具桥接)
# pip install anthropic mcp
import os, json, asyncio
from anthropic import Anthropic
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
async def evaluate_with_claude(audio_id: str, ref_text: str):
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (r, w, _):
async with ClientSession(r, w) as mcp:
await mcp.initialize()
# 把驰声 MCP 工具转成 Anthropic 风格(用 input_schema 而非 parameters)
tools = (await mcp.list_tools()).tools
anth_tools = [{
"name": t.name,
"description": t.description,
"input_schema": t.inputSchema,
} for t in tools]
messages = [{"role": "user",
"content": f"请评测这段录音 audioId={audio_id},参考文本:{ref_text}"}]
# 工具循环:Claude 可能多轮 tool_use,需逐轮回填
while True:
resp = client.messages.create(
model="claude-opus-4-7", # 或 claude-sonnet-4-6 / claude-haiku-4-5
max_tokens=2048,
tools=anth_tools,
messages=messages,
system="你是专业英语口语教练,必须调用驰声评测工具获取真实分数。",
)
# 把整段助手回复(含 tool_use 块)追加进 messages
messages.append({"role": "assistant", "content": resp.content})
if resp.stop_reason != "tool_use":
# 没有更多工具调用,输出最终诊断
return "".join(b.text for b in resp.content if b.type == "text")
# 提取所有 tool_use 块、并行执行、把 tool_result 回填给 Claude
tool_results = []
for block in resp.content:
if block.type == "tool_use":
result = await mcp.call_tool(block.name, arguments=block.input)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result.content[0].text,
})
messages.append({"role": "user", "content": tool_results})
print(asyncio.run(evaluate_with_claude(
"audio_abc123", "The quick brown fox jumps over the lazy dog.")))claude-opus-4-7(旗舰,编程/Agent 提升明显); 日常评测 + 性价比首选 claude-sonnet-4-6; 高并发实时反馈用 claude-haiku-4-5。 Opus 4.5 起新增 effort 参数(low/medium/high),medium 即可达到 Sonnet 4.5 同等质量但 token 减少 ~76%。Google 最新 Gemini 3 Flash(gemini-3-flash-preview,2025-12-17)以 Flash 价位提供 Pro 级推理; 另有 Gemini 3.1 Pro Preview(旗舰)、Gemini 3.1 Flash-Lite Preview。 全部支持 Function Calling、并行调用、组合调用,原生多模态,thinking_level 控制推理深度。 推荐用 OpenAI 兼容端点,可直接复用 OpenAI SDK 与已有的 MCP 工具桥接代码。
环境准备
GEMINI_API_KEY=AIzaSyxxxxxxxxxxxxxxxxxxxxxxxxxxx
CHIVOX_API_KEY=your_chivox_api_key方式一:OpenAI 兼容端点(推荐,零迁移成本)
import os, json, asyncio
from openai import OpenAI
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
# Gemini OpenAI 兼容端点 —— 完全复用 OpenAI SDK
client = OpenAI(
api_key=os.environ["GEMINI_API_KEY"],
base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
)
async def evaluate_with_gemini(audio_id: str, ref_text: str):
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (r, w, _):
async with ClientSession(r, w) as mcp:
await mcp.initialize()
tools = (await mcp.list_tools()).tools
oa_tools = [{"type": "function", "function": {
"name": t.name,
"description": t.description,
"parameters": t.inputSchema,
}} for t in tools]
messages = [{"role": "user",
"content": f"请评测:audioId={audio_id},参考文本:{ref_text}"}]
resp = client.chat.completions.create(
model="gemini-3-flash-preview", # 或 gemini-3.1-pro-preview
messages=messages,
tools=oa_tools,
tool_choice="auto",
)
msg = resp.choices[0].message
messages.append(msg)
for call in (msg.tool_calls or []):
result = await mcp.call_tool(
call.function.name,
arguments=json.loads(call.function.arguments),
)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result.content[0].text,
})
final = client.chat.completions.create(
model="gemini-3-flash-preview", messages=messages)
return final.choices[0].message.content
print(asyncio.run(evaluate_with_gemini(
"audio_abc123", "The quick brown fox jumps over the lazy dog.")))方式二:原生 google-genai SDK(thinking_level / 流式工具调用)
# pip install google-genai mcp
import os, asyncio
from google import genai
from google.genai import types
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
async def evaluate_with_gemini_native(audio_id: str, ref_text: str):
async with streamablehttp_client(
"https://mcp.cloud.chivox.com",
headers={"Authorization": f"Bearer {os.getenv('CHIVOX_API_KEY')}"},
) as (r, w, _):
async with ClientSession(r, w) as mcp:
await mcp.initialize()
tools = (await mcp.list_tools()).tools
# 把 MCP 工具转成 Gemini function_declarations
fn_decls = [{
"name": t.name,
"description": t.description,
"parameters": t.inputSchema,
} for t in tools]
resp = client.models.generate_content(
model="gemini-3-flash-preview",
contents=f"评测 audioId={audio_id},参考文本:{ref_text}",
config=types.GenerateContentConfig(
tools=[types.Tool(function_declarations=fn_decls)],
# Gemini 3 起:thinking_level 替代旧的 thinking_budget
# thinking_level="high",
),
)
# tool_call 在 response.candidates[0].content.parts[0].function_call
fc = resp.candidates[0].content.parts[0].function_call
print(f"call: {fc.name}({dict(fc.args)}) id={fc.id}")
asyncio.run(evaluate_with_gemini_native("audio_abc123", "The quick brown fox jumps over the lazy dog."))gemini-3-flash-preview(速度比 2.5 Pro 快 3 倍、价格 ~$0.50/M 输入),已是 Gemini App 默认; 复杂多步 Agent / 编程任务用 gemini-3.1-pro-preview; 超大上下文 + 多模态批处理用同系列的 gemini-3.1-flash-lite-preview。id,多轮工具调用必须把 id 透传回 function_response,否则会被拒绝(OpenAI 兼容端点已自动处理)。| 模型 | 推荐版本 | base_url | Function Calling | 适合场景 |
|---|---|---|---|---|
| DeepSeek V3.2 · 非思考 | deepseek-chat | api.deepseek.com/v1 | ✓ 支持 | 评测调用 + 诊断,性价比最高 |
| DeepSeek V3.2 · 思考 | deepseek-reasoner | api.deepseek.com/v1 | ✓ 支持(思考中可调工具) | 深度分析 + 错因归因 + 个性化练习路径 |
| GLM-5 · 旗舰 | glm-5 / glm-5.1 | open.bigmodel.cn/…/v4 | ✓ 支持 | 200K 长上下文 + Agent 编排,复杂诊断 |
| GLM-4.7 | glm-4.7 | open.bigmodel.cn/…/v4 | ✓ 支持 | 在线辅导日常诊断,性价比首选 |
| GLM-4-Flash | glm-4-flash | open.bigmodel.cn/…/v4 | ✓ 支持 | 免费额度,开发联调 |
| Kimi K2.5(旗舰) | kimi-k2.5 | api.moonshot.cn/v1 | ✓ 支持 | 256K + 多模态 + Agent 集群协作 |
| Kimi K2 Thinking | kimi-k2-thinking | api.moonshot.cn/v1 | ✓ 支持 | 多步推理 + 多轮历史进度报告 |
| Kimi K2 Turbo | kimi-k2-turbo-preview | api.moonshot.cn/v1 | ✓ 支持 | 高速响应版,实时反馈 |
| 豆包 Seed 2.0 Pro | doubao-seed-2-0-pro-260215 | ark.cn-beijing.volces.com/api/v3 | ✓ 支持(含深度思考) | 多步评测编排 + 深度诊断 Agent |
| 豆包 Seed 2.0 Lite | doubao-seed-2-0-lite-260215 | ark.cn-beijing.volces.com/api/v3 | ✓ 支持 | 在线辅导 + 单轮诊断,性价比首选 |
| 豆包 Seed 2.0 Mini | doubao-seed-2-0-mini-260215 | ark.cn-beijing.volces.com/api/v3 | ✓ 支持 | 移动端 / 边缘部署 / 低延迟实时反馈 |
| GPT-5.1(旗舰) | gpt-5.1 | api.openai.com/v1 | ✓ 支持(reasoning_effort 可调) | 400K 上下文 + 深度推理 + 复杂 Agent 编排 |
| GPT-5.1 Chat | gpt-5.1-chat-latest | api.openai.com/v1 | ✓ 支持 | ChatGPT 同款,对话 / 课堂讲解 |
| GPT-5 mini | gpt-5-mini | api.openai.com/v1 | ✓ 支持 | 高并发 / 批量评测降本 |
| Claude Opus 4.7 | claude-opus-4-7 | api.anthropic.com/v1 | ✓ 支持(tool_use 协议) | 旗舰,编程 / Agent / 深度诊断 |
| Claude Sonnet 4.6 | claude-sonnet-4-6 | api.anthropic.com/v1 | ✓ 支持 | 日常评测 + 性价比首选 |
| Claude Haiku 4.5 | claude-haiku-4-5 | api.anthropic.com/v1 | ✓ 支持 | 高并发实时反馈 |
| Gemini 3 Flash | gemini-3-flash-preview | …/v1beta/openai/ | ✓ 支持(并行 / 组合) | Pro 级推理 + Flash 价位,Gemini App 默认 |
| Gemini 3.1 Pro Preview | gemini-3.1-pro-preview | …/v1beta/openai/ | ✓ 支持(thinking_level 可调) | 复杂多步 Agent + 编程任务 |
anthropic 包,tool_use / tool_result 协议)外,其余所有模型均可通过 OpenAI Python SDK(openai 包)调用,仅需替换 base_url 与 api_key,驰声 MCP 侧代码无需改动。方案选型速查
| 场景 | 推荐方案 |
|---|---|
| AI 对话 / Copilot 类产品,LLM 供应商可能会换 | ① 官方 MCP 客户端库 |
| 已有 LangChain / Mastra / Agents SDK 技术栈 | ② Agent 框架 + adapter |
| 火山方舟 / 千帆控制台直连,最小侵入 | ③ chat.completions + tools |
| 教育 SaaS / 培训 / 客服等业务后端集成 | ④ 自研后端 Agent |
| 原生 Android / iOS / 小程序 / 不装 MCP SDK 的老系统 | → 走下一大节「非 MCP REST」 |
这一类接入的共同特征
cvx_fc(OpenAI function-calling 风格),与 MCP 模式指向同一个评测引擎,两者为并行入口💡 能走 MCP 的一律优先 MCP;仅当客户端限制无法装 SDK 时走本大节。
驰声在 MCP 之外提供一套 OpenAI 兼容的 Function Calling 风格 REST API(内部代号 cvx_fc)。它和 MCP 模式指向同一个评测引擎,但协议层走纯 HTTP / WebSocket,不依赖任何 MCP SDK。
POST /mcp,JSON-RPC 2.0)和 functioncalling 模式(POST /v1/call,REST)是两个并行入口,功能等价、工具/函数列表基本一致。API 端点
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /v1/functions | 列出全部可用评测函数(等价 MCP tools/list) |
| POST | /v1/call | 调用一个评测函数(等价 MCP tools/call)· 同时用于创建流式会话和拉取流式结果 |
| WS | /ws/eval/{session_id} | 流式评测音频传输 |
认证
所有请求在 HTTP Header 中携带 API Key:
Authorization: Bearer <your_api_key>认证失败返回 401(缺少 Authorization)或 403(Key 无效 / 无权使用该评测类型)。结构化错误码见 API 参考 · 错误码。
调用 GET /v1/functions 拿到当前 API Key 已授权的全部评测函数列表,响应格式与 OpenAI function-calling 的工具清单一致,可以直接喂给大模型作为 tools:
GET /v1/functions
Authorization: Bearer <api_key>{
"object": "list",
"data": [
{
"type": "function",
"function": {
"name": "en_word_eval",
"description": "英文单词发音评测,返回总分和每个音标得分。",
"parameters": {
"type": "object",
"properties": {
"ref_text": { "type": "string", "description": "参考文本" },
"audio_base64": { "type": "string", "description": "Base64 编码音频(与 audio_url 二选一)" },
"audio_url": { "type": "string", "description": "音频 HTTP(S) URL(与 audio_base64 二选一)" },
"accent": { "type": "number", "description": "1=英式 / 2=美式 / 3=不区分(默认)" },
"rank": { "type": "number", "description": "评分制:4 或 100(默认)" }
},
"required": ["ref_text"]
}
}
}
/* … 其它函数依此类推 … */
]
}tools/list,每个 API Key 可见的函数集合由后台权限决定——客户端应以实际返回为准,不要在本地硬编码全量 19 个。英文评测函数(10 个)
| 函数名 | core_type | 说明 |
|---|---|---|
| en_word_eval | en.word.score | 单词发音评测 |
| en_word_correction | en.word.pron | 单词发音纠错 |
| en_phonics_eval | en.nsp.score | 自然拼读评测 |
| en_sentence_eval | en.sent.score | 句子朗读评测 |
| en_sentence_correction | en.sent.pron | 句子发音纠错 |
| en_vocab_eval | en.vocabs.pron | 词汇批量评测 |
| en_paragraph_eval | en.pred.score | 段落朗读评测 |
| en_realtime_eval | en.rltm.score | 实时朗读评测 |
| en_choice_eval | en.choc.score | 口语选择题 |
| en_semi_open_eval | en.scne.exam | 半开放题(情景对话等) |
中文评测函数(6 个)
| 函数名 | core_type | 说明 |
|---|---|---|
| cn_word_pinyin_eval | cn.word.score | 拼音 / 汉字发音评测 |
| cn_word_raw_eval | cn.word.raw | 汉字发音评测 |
| cn_sentence_eval | cn.sent.raw | 句子朗读评测 |
| cn_paragraph_eval | cn.pred.raw | 段落朗读评测 |
| cn_rec_eval | cn.rec.raw | 有限分支识别 |
| cn_aitalk_eval | cn.recscore.raw | 口语表达评测(AI Talk) |
流式评测函数(3 个)
| 函数名 | 作用 |
|---|---|
| start_stream_eval | 创建流式评测会话,返回 session_id / ws_url / resume_token |
| get_stream_result | 兜底拉取:WS 没拿到 result 时,通过 HTTP 把最终评分捞回来 |
| stream_eval_result | (MCP 模式的别名;cvx_fc 模式统一用 get_stream_result) |
📘 每个函数的业务语义 / 参数 / 返回字段与 MCP 模式下的同名工具完全一致,可直接参考下文 API 参考 · 英文评测工具 与 中文评测工具。
把完整音频通过 audio_base64 或 audio_url 二选一传给 /v1/call,同步返回评分(与 MCP 模式的 evaluate_english_word 等工具语义等价):
curl -X POST https://fc.cloud.chivox.com/v1/call \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "en_word_eval",
"arguments": {
"ref_text": "hello",
"audio_url": "https://example.com/hello.mp3",
"accent": 2,
"rank": 100
}
}'成功响应:
{
"name": "en_word_eval",
"result": {
"overall": 85.5,
"details": { /* 音素 / 韵律 / 流利度等结构与 MCP 模式完全一致 */ }
}
}失败响应:
{
"name": "en_word_eval",
"error": { "message": "错误描述" }
}单次音频 ≤ 50MB,推荐 16 kHz / 单声道 / 16bit。
创建会话:POST /v1/call 调用 start_stream_eval
响应中拿到 session_id / ws_url / resume_token。
WebSocket 推送:连接 ws_url,收到 {"type":"ready"} 即可开始发二进制音频帧。
边推边收 intermediate 中间结果;结束时发 {"type":"stop"},收到 result 即为最终评分。
兜底拉取(可选):如 WS 断开未收到最终 result,可再次 POST /v1/call 调用 get_stream_result 兜底。
start_stream_eval 参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| core_type | string | ✓ | 评测类型,如 en.sent.score / cn.sent.raw(参考上方中英评测工具表) |
| ref_text | string | ✓ | 参考文本 |
| audio_type | string | — | 音频格式:pcm / wav / mp3(默认 mp3;流式推荐 pcm 省编解码) |
| sample_rate | number | — | 采样率,默认 16000 |
| channel | number | — | 声道:1=单声道(默认)/ 2=立体声 |
| sample_bytes | number | — | 采样位深,默认 2(16bit) |
| accent | number | — | 英文口音:1=英式 / 2=美式 / 3=不区分(默认) |
| age_group | string | — | 中文人群:adult(默认)/ child |
| rank | number | — | 评分制:4 或 100(默认) |
WebSocket 帧协议
客户端 → 服务端
Binary — 原始音频帧,连上即可直接发送,无需握手{"type":"stop"} — 结束录音{"type":"ping"} — 心跳服务端 → 客户端
ready — 连接就绪,可开始发送音频intermediate — 实时中间结果result — 最终评测结果backpressure — 背压,含 suggested_interval_ms,建议降低发送频率error — 错误(含结构化 code + message,见错误码一节)pong — 心跳响应JavaScript(浏览器 / Node.js)
// ① 创建会话
const resp = await fetch('https://fc.cloud.chivox.com/v1/call', {
method: 'POST',
headers: {
'Authorization': 'Bearer your_api_key',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'start_stream_eval',
arguments: {
core_type: 'en.sent.score',
ref_text: 'Hello world',
audio_type: 'pcm',
sample_rate: 16000,
},
}),
});
const { result } = await resp.json();
// ② WebSocket 推送音频
const ws = new WebSocket(result.ws_url);
ws.onmessage = (ev) => {
const msg = JSON.parse(ev.data);
switch (msg.type) {
case 'ready': startRecording(); break;
case 'intermediate': console.log('部分结果', msg.data); break;
case 'result': console.log('最终结果', msg.data); ws.close(); break;
case 'backpressure': console.warn('降速 ~', msg.suggested_interval_ms, 'ms'); break;
case 'error': console.error(msg.code, msg.message); break;
}
};
function onAudioChunk(pcm) {
if (ws.readyState === WebSocket.OPEN) ws.send(pcm); // 直接发二进制
}
function stopRecording() {
ws.send(JSON.stringify({ type: 'stop' }));
}Android(OkHttp · Kotlin)
// ① 创建会话,拿到 ws_url
val createResp = OkHttpClient().newCall(
Request.Builder()
.url("https://fc.cloud.chivox.com/v1/call")
.addHeader("Authorization", "Bearer ${apiKey}")
.addHeader("Content-Type", "application/json")
.post("""{"name":"start_stream_eval","arguments":{"core_type":"en.sent.score","ref_text":"Hello world","audio_type":"pcm"}}""".toRequestBody())
.build()
).execute()
val wsUrl = JSONObject(createResp.body!!.string()).getJSONObject("result").getString("ws_url")
// ② 连接 WebSocket
val client = OkHttpClient()
val req = Request.Builder()
.url(wsUrl)
.build()
val ws = client.newWebSocket(req, object : WebSocketListener() {
override fun onMessage(ws: WebSocket, text: String) {
val msg = JSONObject(text)
when (msg.getString("type")) {
"ready" -> startRecording()
"intermediate" -> updateUI(msg.getJSONObject("data"))
"result" -> handleFinalResult(msg.getJSONObject("data"))
"error" -> handleError(msg.getString("code"), msg.getString("message"))
}
}
})
// 录音回调中发送 PCM 字节
fun onAudioData(pcm: ByteArray) {
ws.send(ByteString.of(*pcm))
}
fun stop() {
ws.send("""{"type":"stop"}""")
}ws_url、把 PCM bytes 发出去、按 type 字段解析服务端消息就行。resume_token · 60 秒续播
客户端意外断开时,会话在服务端挂起 60 秒;用创建会话拿到的 resume_token 续播即可:
// ws_url 取自 start_stream_eval 响应,追加 resume 参数即可重连
GET {ws_url}?resume={resume_token}ready,继续推送音频即可;服务端会颁发新的 resume_token,原 token 立即作废。兜底拉取 · get_stream_result
如果 WS 没能收到最终 result,可主动通过 HTTP 拉取:
curl -X POST https://fc.cloud.chivox.com/v1/call \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "get_stream_result",
"arguments": {
"session_id": "stream-1713340800-a1b2c3",
"auto_stop": true,
"timeout": 30
}
}'| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| session_id | string | ✓ | 由 start_stream_eval 返回的会话 ID |
| auto_stop | bool | — | 是否自动发送 stop 并等待结果,默认 true |
| timeout | number | — | 等待秒数,默认 30 |
/ws/audio/ 和 cvx_fc 的 /ws/eval/,两条链路的会话 ID 空间是分开的。通过本地麦克风实时录音,音频以 WebSocket 流式推送到评测服务,无需生成中间文件。这是最灵活、延迟最低的评测方式,特别适合交互式口语练习场景。
需要按顺序调用三个工具:
create_stream_session — 创建流式评测会话
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| core_type | string | ✓ | 评测类型,如 en.word.score、en.sent.score、cn.sent.raw |
| ref_text | string | ✓ | 评测参考文本 |
| audio_type | string | — | 音频格式,默认 mp3 |
| sample_rate | number | — | 采样率,默认 16000 |
| rank | number | — | 评分制:4 或 100,默认 100 |
返回 session_id,后续步骤需使用。
start_recording — 开始麦克风录音
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| session_id | string | ✓ | 来自 create_stream_session 的会话 ID |
| chunk_size | number | — | 音频块大小(bytes),默认 3200 |
| chunk_interval_ms | number | — | 推送间隔(ms),默认 100 |
调用后自动启动麦克风,音频通过 WebSocket 实时推送到评测服务。
stop_recording — 停止录音并获取结果
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| session_id | string | ✓ | 会话 ID |
| timeout | number | — | 等待评测结果超时秒数,默认 30 |
用户:"请评测我的英文发音,文本是 Hello"
AI 调用 create_stream_session(core_type="en.word.score", ref_text="Hello")
→ 获得 session_id
AI 调用 start_recording(session_id=xxx)
麦克风开始录音,音频通过 WebSocket 实时推送到评测服务
用户说完后告知 AI "结束"
AI 调用 stop_recording(session_id=xxx)
→ 返回评测结果(总分、准确度、流利度、音素得分等)
适用于已有音频文件的评测场景,支持三种输入方式:
| 参数 | 说明 | 适用场景 |
|---|---|---|
| audio_file_path | 本地文件路径 | 代理自动读取并转为 Base64,最便捷 |
| audio_base64 | Base64 编码数据 | 已有编码数据时使用 |
| audio_url | 音频文件 URL | 音频托管在云存储时使用 |
audio_file_path,只需传入本地文件路径,代理会自动处理编码和上传。支持的音频格式:mp3, wav, ogg, m4a, aac, pcm
限制:单文件最大 50MB,大于 500KB 的文件自动压缩为 16kHz / 单声道 / 32kbps。
| 工具名 | 功能 | 典型场景 | 详情 |
|---|---|---|---|
| en_word_eval | 单词评测 | 评测 "Hello" 的发音准确度 | 文档 |
| en_word_correction | 单词纠音 | 检测多读/漏读/错读并给出纠正建议 | 文档 |
| en_vocab_eval | 词语评测 | 同时评测多个单词的发音 | 文档 |
| en_sentence_eval | 句子评测 | 评测整句朗读的准确度与流利度 | 文档 |
| en_sentence_correction | 句子纠音 | 逐词检测发音问题并给出修正建议 | 文档 |
| en_paragraph_eval | 段落朗读评测 | 评测整段英文课文的朗读质量 | 文档 |
| en_phonics_eval | 自然拼读评测 | 评测 Phonics 拼读规则掌握程度 | 文档 |
| en_choice_eval | 口语选择题 | 从预设选项中识别口语回答 | 文档 |
| en_semi_open_eval | 半开放题评测 | 场景对话等半开放口语题型 | 文档 |
| en_realtime_eval | 实时朗读评测 | 实时反馈朗读质量,逐句评分 | 文档 |
通用参数:所有英文评测工具均支持以下参数。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ref_text | string | ✓ | 评测参考文本 |
| audio_file_path | string | — | 本地音频文件路径(三选一) |
| audio_base64 | string | — | Base64 编码的音频数据(三选一) |
| audio_url | string | — | 音频文件 URL(三选一) |
| accent | string | — | 口音:british / american(默认) |
| 工具名 | 功能 | 典型场景 | 详情 |
|---|---|---|---|
| cn_word_raw_eval | 单字评测(汉字) | 评测 "中" 的发音 | 文档 |
| cn_word_pinyin_eval | 单字评测(拼音) | 评测 "zhōng" 的发音 | 文档 |
| cn_sentence_eval | 词句评测 | 评测 "你好世界" 的朗读 | 文档 |
| cn_paragraph_eval | 段落朗读评测 | 评测一段中文课文的朗读质量 | 文档 |
| cn_rec_eval | 有限分支识别评测 | 从预设选项中识别用户发音 | 文档 |
| cn_aitalk_eval | AI Talk 口语评测 | 中文口语对话能力评测 | 文档 |
通用参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ref_text | string | ✓ | 评测参考文本(汉字或拼音) |
| audio_file_path | string | — | 本地音频文件路径(三选一) |
| audio_base64 | string | — | Base64 编码的音频数据(三选一) |
| audio_url | string | — | 音频文件 URL(三选一) |
所有评测工具返回统一的结构化结果:
{
"overall": 85,
"accuracy": 82,
"pron": 88,
"fluency": {
"overall": 78,
"speed": 65,
"pause": 2
},
"integrity": 95,
"details": [
{
"char": "hello",
"score": 85,
"phone": [
{ "phoneme": "h", "score": 90 },
{ "phoneme": "ɛ", "score": 82 },
{ "phoneme": "l", "score": 88 },
{ "phoneme": "oʊ", "score": 80 }
]
}
]
}| 字段 | 范围 | 说明 |
|---|---|---|
| overall | 0–100 | 综合总分,反映整体语音质量 |
| accuracy | 0–100 | 准确度,音素级别的发音准确率 |
| pron | 0–100 | 发音得分,整体发音质量评价 |
| fluency.overall | 0–100 | 流利度,语流的自然度与平滑度 |
| fluency.speed | 0–100 | 语速得分,每分钟词/音节计量 |
| fluency.pause | number | 不自然停顿次数 |
| integrity | 0–100 | 完整度,是否完整朗读了参考文本 |
| details[].phone[] | array | 每个音素的独立评分,可定位具体弱项 |
| details[].stress[] | array | 重音得分,检测重弱读是否正确 |
常见业务场景
| 场景 | 原因 | 解决方式 |
|---|---|---|
| 音频 ID 无效或已过期 | 音频上传后 5 分钟内有效,评测完成后自动删除 | 重新上传音频 |
| 服务器繁忙 | 当前请求过多,排队已满 | 稍后重试,使用指数退避策略 |
| 存储空间已满 | 服务器临时音频存储已满 | 稍后重试,系统会自动清理 |
| 音频格式不支持 | 上传了不支持的文件类型 | 使用 mp3/wav/ogg/m4a/aac/pcm |
| 音频时长超限 | 超过该题型最大时长限制 | 裁剪音频后重试 |
| WebSocket 连接断开 | 网络不稳定导致流式连接中断 | 代理会自动重连,如持续失败请检查网络 |
HTTP 状态码(functioncalling 模式)
| 状态码 | 含义 |
|---|---|
| 400 | 请求格式错误(JSON 缺字段 / 类型错) |
| 401 | 未认证(缺少 Authorization 头) |
| 403 | 权限不足(API Key 无效或无权使用该评测类型) |
| 404 | 会话不存在(session_id 错误或已回收) |
| 409 | 会话状态不允许当前操作(如已 stop 后又发音频) |
流式评测结构化错误码
WebSocket 的 error 帧与 get_stream_result 的 HTTP 错误体统一使用以下错误码,便于客户端差错分流:
| 错误码 | 说明 | 建议处理 |
|---|---|---|
| SESSION_NOT_FOUND | 会话不存在 | 重新调用 start_stream_eval / create_stream_session 创建 |
| SESSION_EXPIRED | 会话已过期(60s 未续流) | 重新创建会话 |
| INVALID_STATE | 当前状态不允许该操作 | 检查调用顺序(例如已 stop 后又发音频) |
| INVALID_PARAMS | 参数无效 | 核对 core_type / ref_text / 采样率等 |
| RESUME_INVALID | resume_token 无效或已过期 | 重新创建会话(每次重连会颁发新 token) |
| AUDIO_TOO_LARGE | 单次音频超过 50MB | 压缩或切片后重传 |
| UPSTREAM_CONNECT | 评测引擎连接失败 | 稍后重试;持续发生请联系驰声 |
| UPSTREAM_TIMEOUT | 评测超时 | 缩短音频 / 检查网络 |
| UPSTREAM_EVAL_ERROR | 评测引擎返回错误 | 查看 message 字段细节 |
| CAPACITY_FULL | 并发会话已满 | 退避重试或升级配额 |
下面这些模板与 免费体验 Demo 中实际使用的「教练 Prompt」一脉相承,全部围绕 角色 / 任务 / 方法 / 输出格式 / 语气 五段式结构,并使用占位符 {mcp_response} 直接拼接 MCP 工具返回的 JSON。 推荐在 system 消息里挂载,再把工具返回原文塞进user 消息,由 LLM 基于真实分数和音素生成可读诊断 / 练习材料。
overall / dp_type / phonemes 等字段)原样塞入 {mcp_response},不要预先做汇总——细节越完整诊断越具体。1. 单词级 · 音素诊断
适用工具:en.word.score / cn.word.raw。围绕 phonemes[].dp_type 找出错读音。
你是一位专业的英语发音教练。下面是驰声 MCP(en.word.score)返回的单词级评测数据:
一个目标词、总分与发音分、以及带有 dp_type 的音素数组。
## 任务
为学习者写一份 **可直接阅读** 的发音诊断,每一条都要引用音素分数(写出 IPA 符号)。
## 方法
- 按 dp_type 分组:先看 mispron,再补充 normal 但分数 < 70 的"边缘音"。
- 每个问题音素:① 典型母语干扰 → ② 你听到的声音 → ③ 一条具体的发音修正动作(下颌 / 舌位 / 气流 / 唇形)。
- 重音符号 ˈ 标记的音节,重音错位也要单独列出(即便音素本身分数尚可)。
- 最多列 4 条,按 **影响力从弱到强** 排序。
## 输出
精简 Markdown:可选一句总结 → 编号列表 → 单行 **🎯 优先级** 排序。
## 语气
友善、具体、可执行,不要空喊"加油"。
## MCP 数据
```json
{mcp_response}
```2. 句子级 · 节奏 + 重音诊断
适用工具:en.sent.score。开头先给一行"计分牌",再从 phones → words → prosody。
你是一位专业的英语口语教练。下面是驰声 MCP(en.sent.score)返回的句子级数据:refText、总分、发音子分(accuracy / integrity / fluency / rhythm)、可选 speed(WPM),以及 details[] 中的逐词得分、dp_type 与可选 phonemes[]。
## 任务
开头给一行紧凑的 **计分牌**(总分 + 各子分 + 速度),再按 **音素 → 词 → 韵律** 顺序展开诊断。
## 检查清单(每项都要覆盖;不适用则写"无明显问题")
1. **音素级**:每个 score < 70 或 dp_type ≠ normal 的词,展开 phonemes,命名典型错误(如 /ð/ → /d/)并给一条修正动作。
2. **漏读 / 多读**:标注 dp_type=omit / insert,解释如何拉低 integrity。
3. **韵律**:基于 rhythm + 错读词的重音,指出重音错位、陈述句调型平直、断句过多等。
4. **流利度 vs 准确度**:若 fluency 高但 accuracy 低,明确指出,让学习者知道优先改哪一项。
## 输出格式
Markdown 子标题:**Pronunciation / Prosody / Study priority**(最后一行简短排序,按 ROI 从高到低)。
## MCP 数据
```json
{mcp_response}
```3. 段落级 · 音素族归并 + 完整度
适用工具:en.pred.score。把同类错音合并为"音素族",避免逐词复述。
你是一位专业的英语口语教练。下面是驰声 MCP(en.pred.score)返回的段落级数据:长 refText、总分、发音子分、可选 speed / integrity,以及大量 details[](同一个词可能在不同子句中重复出现;空 char + dp_type=omit 表示漏读)。
## 任务
对整段做 **整体诊断**:
(a) 完整度 / 漏读,
(b) 反复出现的 **音素族**,
(c) 节奏与断句,
(d) 各子分之间是否相互印证。
## 检查清单
1. **integrity / dp_type**:列出每个 omit / insert,并给出所在子句;解释长读时为什么虚词容易被吞。
2. **音素聚类**:将弱词按共同音素问题归族(/θ/ 链、/e/ 链、/ɒ/ 等),引用 details 中的实例。
3. **韵律**:结合 rhythm 与标点 —— 短语内停顿过多?子句边界缺失?
4. **整体一致性**:若 fluency 正常但 accuracy 差(或反之),点明并指出对练习设计的影响。
## 输出格式
Markdown 章节:**Summary / Completeness / Pronunciation (families) / Rhythm / Study priorities**(最后一项最多 4 条,按影响力排序)。
## MCP 数据
```json
{mcp_response}
```4. 半开放题 · IELTS 风格四维评级
适用工具:en.pqan.score。结合学习者 transcript + 四维分数,给出可教学的"升档建议"。
你是一位 **IELTS / 课堂口语风格** 的口语教练。下面是驰声 MCP(en.pqan.score)返回的半开放题数据:题目 refText、学习者 transcript、overall、四个维度分(grammar / content / fluency / pron)、speed(WPM)、以及结构化的 issues[] 标记。
## 任务
给出 **基于 rubric 的诊断**:先用一句话给出 0–100 的整体段位估计,再 **逐维度** 解释,并 **引用 transcript 中的短句**(不要复述全文)。最后给 3–5 条 **可执行的"升档建议"**(句型 / 模板,而不是"多练一点")。
## 权重(要明确告诉学习者)
- **Content ~30%** — 想法深度、举例、具体程度
- **Grammar ~25%** — 句型多样性、主谓一致、从句
- **Fluency ~25%** — 语速、停顿、口头禅、衔接
- **Pronunciation ~20%** — 音素 + 可懂度
## 跨维度检查
- 若 content 最低,先给"展开模板",不要先抠音素。
- 若 fluency 低 + WPM 低,区分"思考型停顿"与"发音卡顿"。
- 若 pron 标出特定音,绑定到 transcript 里 **真实出现过的词**。
## 输出格式
Markdown:**段位估计** → 紧凑的 **得分表格** → **"To reach the next band"** 编号列表(每条给出可仿写的句型)。
## MCP 数据
```json
{mcp_response}
```5. 中文专项 · 声调 / 儿化 / 变调
适用工具:cn.word.raw / cn.sent.raw / cn.pred.raw。中文评测最大权重在 **声调**,必须单独检查。
你是一位专业的普通话口语教练。下面是驰声 MCP(cn.sent.raw)返回的中文句子评测数据:整句分数 + 逐字 details + 可选 phonemes + 流利 / 节奏分。
## 中文评测的权重
- **声调错误权重最高** —— 声调读错可能直接改变词义
- dp_type=mispron 多来自:声调错、平翘舌混用、前后鼻音混用
- 拼音对、声调错,听感仍是"洋腔洋调"
## 检查清单(缺则写"无明显问题")
1. **儿化**:phonemes 出现 r(儿化) 或 dp_type 提示时,确认是否被读成"主音节 + 单独儿"两拍。
2. **轻声**:叠词、词缀、句末语气词 —— 第二字应短促轻读,无完整声调曲线。
3. **变调**:三声连读、不 + 后字、一 + 后字,是否符合普通话规则。
4. **节奏**:用 rhythm + 逗号位置,标记停顿过长或过碎,建议 chunk 边界。
## 输出
Markdown 子标题:**总览 / 儿化 / 轻声 / 变调 / 节奏 / 学习优先级**(最后一项 1–3 条,按"听感自然度提升"排序)。
## MCP 数据
```json
{mcp_response}
```6. 单词 / 句子 · 微练习
建议在 诊断完成后 第二轮调用:让 LLM 严格按弱项音素生成,避免"通用绕口令包"。
你仍是这位学习者的发音教练。**第二轮诊断已经完成** —— 现在严格基于诊断里点名的弱音素,生成 **1:1 对应** 的微练习(不要给通用题)。
## 输出(仅返回一段合法 JSON 数组,外层不要任何文字)
根节点必须是数组,每个元素含 category(字符串)、icon(单个 emoji)、items({ "label", "content" } 数组)。
```json
[
{ "category": "Phoneme drills", "icon": "🎯", "items": [ { "label": "…", "content": "…" } ] },
{ "category": "Awareness", "icon": "🗣️", "items": [ { "label": "…", "content": "…" } ] },
{ "category": "Whole word", "icon": "📝", "items": [ { "label": "…", "content": "…" } ] }
]
```
## 规则
- **Phoneme drills**:诊断里每个 mispron 音素至少给一对最小对立对 + 一句短绕口令 / 重复句。
- **Awareness**:当重音偏弱时,给一条 stress / 舌位 / 下颌姿态提示。
- **Whole word**:2–3 句自然句,目标词分别出现在句首 / 句中 / 句末。
- 所有 content 必须可念出声;字符串内不要再嵌套 JSON。
## 上下文
诊断结论:{previous_diagnosis}
原始 MCP:
```json
{mcp_response}
```7. 段落 · Chunk Map + 元认知
段落级练习要从"音素"上升到"短语 / 整段 / 元认知录回放"。直接对应 en.pred.score 的诊断结果。
你仍是这位学习者的口语教练。**段落级二次诊断** 已经列出了漏读位置和音素族 —— 现在请生成 **整段练习**:把弱音素串成"族"练习、用 chunk map 把虚词粘回短语,并附一条录音 → 回放 → 对照 MCP details 的元认知步骤。
## 输出(仅返回一段合法 JSON 数组)
```json
[
{ "category": "Phoneme families", "icon": "🎯", "items": [ { "label": "…", "content": "…" } ] },
{ "category": "Chunking", "icon": "🎵", "items": [ { "label": "…", "content": "…" } ] },
{ "category": "Metacognition", "icon": "🧠", "items": [ { "label": "…", "content": "…" } ] }
]
```
## 规则
- **Phoneme families**:至少 3 条,按诊断里的音素族(/θ/、/e/、/ɒ/ 等)组织最小对立对 / 词链。
- **Chunking**:① 给一行用 [ ] 和 / 标注的 chunk map(可加大致停顿秒数);② 给一句"把漏掉的虚词嵌入短语"的练习(不要孤立练)。
- **Metacognition**:一条"录音 → 回放 → 对照 MCP details"的 N 遍练习(N 写明,2–3 之间)。
- 字符串只能是纯展示文本,禁止嵌套 JSON。
## 上下文
诊断结论:{previous_diagnosis}
```json
{mcp_response}
```8. 多日学习报告
把过去 N 天的 MCP 评测结果聚合后丢给 LLM,输出适合发给学生 / 家长的周报。
你是一位英语口语学习顾问。下面是这位学习者过去 7 天的驰声 MCP 评测历史(按时间顺序),每条包含题型、coreType、overall、子分、weak_phonemes 摘要。
## 任务
为学习者生成一份 **周报**,目标读者:本人 + 家长 / 老师。
强调 **趋势** 与 **下一步计划**,不要复述每一次具体分数。
## 必须包含
1. **整体趋势**:进步 / 持平 / 退步(一句话 + 简短依据)
2. **维度变化**:accuracy / fluency / rhythm / integrity / speed 任意有数据的维度,给出"本周均分 vs 上周"
3. **本周高光**:分数提升最大的题型 / 音素 / 句型
4. **顽固问题**:连续 3 次以上未达 70 的音素或维度
5. **下周计划**:3 条具体动作(每条对应一个 MCP 工具或一个练习类型)
6. **结尾**:1–2 句鼓励性总结,避免空话
## 风格
- 像一位认真但不啰嗦的私教
- 出现学生姓名时使用占位 {student_name}
- 数字一律保留整数
## 评测历史
```json
{history}
```9. 错误归因 · JSON 摘要
用于后端聚合 / 数据看板:让 LLM 把一次评测压缩成结构化摘要,方便入库统计。
你是一个评测结果归类器。下面是驰声 MCP 一次评测的完整返回。请抽取关键信息并 **仅返回合法 JSON**(不要任何解释文字)。
## Schema
```json
{
"core_type": "string,例如 en.sent.score",
"overall": 0,
"sub_scores": { "accuracy": 0, "integrity": 0, "fluency": 0, "rhythm": 0 },
"weak_phonemes": [
{ "ipa": "string", "avg_score": 0, "occur": 0, "example_word": "string" }
],
"omissions": [{ "after": "string", "missing": "string" }],
"stress_issues": [{ "word": "string", "expected": "string", "actual": "string" }],
"primary_issue_tag": "phoneme|stress|fluency|integrity|content|none",
"next_action_hint": "string,10 字以内,例如 "练 /θ/ 对立对""
}
```
## 规则
- weak_phonemes 只收 avg_score < 70 的项,最多 5 项,按 occur 降序。
- 不要复述 refText,不要 markdown。
- 字段缺失时使用 null 或空数组,不要省略 key。
## MCP 数据
```json
{mcp_response}
```en.sent.score 工具,把工具 result(即 tool 消息内容)原样填入上面任意「诊断」模板的 {mcp_response},作为第二轮 user 消息发回;拿到诊断结论再走第三轮,套「微练习」模板得到 JSON。三轮调用即可串起 评测 → 诊断 → 练习 全链路。audio_file_path 参数传入本地路径,代理自动处理编码,无需手动转 Base64。| 端点 | 方法 | 说明 |
|---|---|---|
| /upload | POST | 音频文件上传(MCP 模式文件评测使用) |
| /mcp | POST | MCP 模式 · JSON-RPC(Streamable HTTP) |
| /ws/audio/{session_id} | WS | MCP 模式 · 流式音频 WebSocket |
| /v1/functions | GET | functioncalling 模式 · 列出全部评测函数 |
| /v1/call | POST | functioncalling 模式 · 一次性评测 / 创建流式会话 / 拉取流式结果 |
| /ws/eval/{session_id} | WS | functioncalling 模式 · 流式音频 WebSocket |
| /health | GET | 健康检查 |
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 存储限制 | 500MB | 最大音频存储空间 |
| 最大排队 | 10 | 等待处理的请求数 |
| 最大并发 | 3 | 同时处理的评测数 |
| 音频有效期 | 5 分钟 | 上传后未评测自动过期 |
| 文件大小限制 | 50MB | 单个音频文件最大 |
上表为托管侧技术默认;计费与试用/商用调用配额、并发档位以 会员套餐说明为准,与上表独立。