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. dictationtransliterate

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

讯飞的 dictationtransliterate 使用不同的接口地址,切换时要同时检查 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-keyAPPIDAPISecretAPIKey 是否来自同一个厂商应用。
识别乱码或效果差RTP 采样率、厂商 sample-ratere-sample 是否匹配。
dictation 很久才返回SpeechCompleteTimeout 是否过大,VAD 参数是否适合当前环境。
transliterate 不按预期分句检查厂商服务端的静音或分句参数,例如 max-sentence-silence
电话 8k 接 16k 模型失败增加 re-sample=upsample8kTo16k,并把厂商采样率配置为 16000