ASR 模式与厂商配置
EasyMrcp 的 ASR 配置分两层:
mrcp.asrMode:选择使用哪个 ASR 厂商或处理器。asr/*.properties里的identify-patterns:选择这个厂商使用哪种识别模式。
可以把 mrcp.asrMode 理解成“选供应商”,把 identify-patterns 理解成“选识别方式”。
1. 可选 ASR 模式
application.yaml 里的配置示例:
mrcp:
asrMode: aliyun-funasr当前源码里可以看到这些 ASR 模式:
| 值 | 说明 |
|---|---|
aliyun-funasr | 阿里云 DashScope FunASR。 |
xfyun | 科大讯飞 ASR。 |
funasr | 本地或自建 FunASR。 |
tencent-cloud | 腾讯云 ASR。 |
example-asr | 示例 ASR 实现,主要用于二次开发参考。 |
实际创建处理器时,EasyMrcp 会先读取 mrcp.asrMode,再进入对应厂商的配置文件读取具体参数。
2. dictation 和 transliterate
identify-patterns 目前主要有两种取值:
| 值 | 通俗理解 | 适合场景 |
|---|---|---|
dictation | 一句话识别。EasyMrcp 本地先用 VAD 判断一段话什么时候开始、什么时候结束,结束后再通知厂商收尾。 | 机器人问一句、用户答一句的电话对话。 |
transliterate | 长连接实时转写。音频持续送给厂商,分句更多依赖厂商服务端能力。 | 需要持续听写、实时字幕、较长语音流的场景。 |
2.1 dictation
dictation 模式下,ASR 音频进入 EasyMrcp 后会先经过 VAD:
- VAD 检测到用户开始说话。
- EasyMrcp 回退一小段音频,避免漏掉开头。
- 建立或重建厂商 ASR 连接,并发送缓存音频。
- VAD 检测到句尾静音后,EasyMrcp 发送剩余音频并调用
sendEof()。 - 厂商返回最终结果后,EasyMrcp 推送
RecognitionComplete。
这种模式的句尾由 EasyMrcp 控制,常用参数是 DetectSpeech 事件里的 SpeechCompleteTimeout。
2.2 transliterate
transliterate 模式下,EasyMrcp 不走本地 VAD 分句,收到 RTP 音频后会持续转发给 ASR 处理器。
这种模式更像“把整路音频流交给厂商”。如果需要控制句子切分,一般要看厂商自己的参数,例如阿里云 FunASR 的 max-sentence-silence。
3. 阿里云 FunASR 配置
配置文件:
asr/aliyun-funasr.properties常用配置项:
aliyun-funasr.api-key=<your-api-key>
aliyun-funasr.websocket-url=wss://dashscope.aliyuncs.com/api-ws/v1/inference
aliyun-funasr.workspace-id=
aliyun-funasr.format=pcm
aliyun-funasr.vocabulary-id=
aliyun-funasr.language-hints=zh
aliyun-funasr.semantic-punctuation-enabled=false
aliyun-funasr.heartbeat=false
aliyun-funasr.identify-patterns=dictation
aliyun-funasr.max-sentence-silence=12008k 直连方案:
aliyun-funasr.model=fun-asr-flash-8k-realtime
aliyun-funasr.sample-rate=8000
# 不要配置 aliyun-funasr.re-sample16k 重采样方案:
aliyun-funasr.model=fun-asr-realtime
aliyun-funasr.sample-rate=16000
aliyun-funasr.re-sample=upsample8kTo16k如果电话 RTP 是 8k,而厂商模型要求 16k,就需要配置 re-sample=upsample8kTo16k。如果使用 8k 模型,则不要额外重采样。
max-sentence-silence 主要影响阿里云服务端的分句静音时长。dictation 模式的句尾静音由 EasyMrcp 的 SpeechCompleteTimeout 控制,不受这个参数控制。
4. 科大讯飞 ASR 配置
配置文件:
asr/xfyun-asr.properties一句话识别示例:
xfyun-asr.host-url=https://iat-api.xfyun.cn/v2/iat
xfyun-asr.APPID=<your-appid>
xfyun-asr.APISecret=<your-api-secret>
xfyun-asr.APIKey=<your-api-key>
xfyun-asr.identify-patterns=dictation长连接转写示例:
xfyun-asr.host-url=rtasr.xfyun.cn/v1/ws
xfyun-asr.APPID=<your-appid>
xfyun-asr.APIKey=<your-api-key>
xfyun-asr.re-sample=upsample8kTo16k
xfyun-asr.identify-patterns=transliterate讯飞的 dictation 和 transliterate 使用不同的接口地址,切换时要同时检查 host-url、鉴权参数和 identify-patterns。
5. DetectSpeech 参数关系
常见 ASR 控制参数:
| 参数 | 说明 |
|---|---|
StartInputTimers | 是否开启输入超时计时。为 false 时不会触发无输入超时。 |
NoInputTimeout | 等待用户开始说话的超时时间,单位毫秒。 |
SpeechCompleteTimeout | dictation 模式下 VAD 判断句尾静音的时间,单位毫秒。 |
AutomaticInterruption | 识别到用户说话时是否允许打断当前 TTS 播放。 |
示例:
{
"StartInputTimers": true,
"NoInputTimeout": 60000,
"SpeechCompleteTimeout": 800,
"AutomaticInterruption": true
}SpeechCompleteTimeout 只对 EasyMrcp 本地 VAD 参与的路径有意义,通常就是 dictation。如果使用 transliterate,分句静音时间优先看厂商服务端参数。
6. 实时识别结果
客户端 ClientConnect 时可以传入:
{
"PushAsrRealtimeResult": true
}支持实时结果的 ASR 处理器会把中间识别结果推给客户端。需要注意的是,spy 监听模式下源码会强制关闭实时结果推送,避免监听链路和普通对话链路的事件语义混在一起。
7. 常见排查
| 现象 | 优先检查 |
|---|---|
| 没有识别结果 | mrcp.asrMode 是否和目标厂商一致,identify-patterns 是否配置正确。 |
| 鉴权失败 | api-key、APPID、APISecret、APIKey 是否来自同一个厂商应用。 |
| 识别乱码或效果差 | RTP 采样率、厂商 sample-rate、re-sample 是否匹配。 |
dictation 很久才返回 | SpeechCompleteTimeout 是否过大,VAD 参数是否适合当前环境。 |
transliterate 不按预期分句 | 检查厂商服务端的静音或分句参数,例如 max-sentence-silence。 |
| 电话 8k 接 16k 模型失败 | 增加 re-sample=upsample8kTo16k,并把厂商采样率配置为 16000。 |
