Skip to content

ASR 模式与厂商配置 ​

EasyMrcp 的 ASR 配置分两层:

  • mrcp.asrMode:选择使用哪个 ASR 厂商或处理器。
  • asr/*.properties 里的 identify-patterns:选择这个厂商使用哪种识别模式。

可以把 mrcp.asrMode 理解成“选供应商”,把 identify-patterns 理解成“选识别方式”。

1. 可选 ASR 模式 ​

application.yaml 里的配置示例:

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:

  1. VAD 检测到用户开始说话。
  2. EasyMrcp 回退一小段音频,避免漏掉开头。
  3. 建立或重建厂商 ASR 连接,并发送缓存音频。
  4. VAD 检测到句尾静音后,EasyMrcp 发送剩余音频并调用 sendEof()。
  5. 厂商返回最终结果后,EasyMrcp 推送 RecognitionComplete。

这种模式的句尾由 EasyMrcp 控制,常用参数是 DetectSpeech 事件里的 SpeechCompleteTimeout。

2.2 transliterate ​

transliterate 模式下,EasyMrcp 不走本地 VAD 分句,收到 RTP 音频后会持续转发给 ASR 处理器。

这种模式更像“把整路音频流交给厂商”。如果需要控制句子切分,一般要看厂商自己的参数,例如阿里云 FunASR 的 max-sentence-silence。

3. 阿里云 FunASR 配置 ​

配置文件:

text
asr/aliyun-funasr.properties

常用配置项:

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=1200

8k 直连方案:

properties
aliyun-funasr.model=fun-asr-flash-8k-realtime
aliyun-funasr.sample-rate=8000
# 不要配置 aliyun-funasr.re-sample

16k 重采样方案:

properties
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 配置 ​

配置文件:

text
asr/xfyun-asr.properties

一句话识别示例:

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

长连接转写示例:

properties
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等待用户开始说话的超时时间,单位毫秒。
SpeechCompleteTimeoutdictation 模式下 VAD 判断句尾静音的时间,单位毫秒。
AutomaticInterruption识别到用户说话时是否允许打断当前 TTS 播放。

示例:

json
{
  "StartInputTimers": true,
  "NoInputTimeout": 60000,
  "SpeechCompleteTimeout": 800,
  "AutomaticInterruption": true
}

SpeechCompleteTimeout 只对 EasyMrcp 本地 VAD 参与的路径有意义,通常就是 dictation。如果使用 transliterate,分句静音时间优先看厂商服务端参数。

6. 实时识别结果 ​

客户端 ClientConnect 时可以传入:

json
{
  "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。