Skip to content

常见问题

ASR和TTS支持流式么?

项目中使用的ASR和TTS是流式的。tts合成时是边合边播放音频,asr也是实时将数据发送给asr服务。

EasyMrcp如何工作的?

EasyMrcp2.0版本之后使用sip完成通话建立,使用自定义的EasyMrcp事件控制asr、tts,使用一个tcp连接发送EasyMrcp的事件。EasyMrcp本身使用Netty进行网络通信,确保了VoIP的并发性能。

如何将SIP和EasyMrcp进行绑定的?

通过sip自定义协议头X-EasyMRCP进行绑定,在调用EasyMrcp时获取一个通话的uuid作为参数传入EasyMrcp事件,这样EasyMrcp服务就会根据这个id找到对应的sip部分。

是否支持通话并发?

支持通话并发。虽然看起来都是拨打同一个号码,但是底层每通电话都是独立的,底层的通道和会话建立跟号码其实没有什么关系。例如通话a是1000拨打1020,通话b是1001拨打1020,通话a是1002拨打1020,abc之间是独立的通话,互相之间没有影响。

是否支持ESL事件

不支持,因为在设计之初为了解耦(不依赖任何IPPBX),所以没有将EasyMrcp的事件接入Freeswitch。目前EasyMrcp提供的思路是简化了客户端的事件,开发者可以根据自己使用的语言通过py模板自己编写对应的客户端。暂时无支持esl的计划。

SIP和EasyMrcp Client的连接有没有先后顺序?

由于SIP和EasyMrcp Client的连接是两种独立的连接,在实际情况中是自己控制发送的,所以可能出现某个先到的情况。对于这种情况,EasyMrcp内部做了相关的处理,无论谁先到都不会影响正常流程。官方推荐先进行EasyMrcp Client的连接再进行sip的桥接。官方给出的示例脚本中就是先进行EasyMrcp Client的连接再进行sip的桥接。

支持ASR实时文字结果推送么?

支持,在连接参数中设置PushAsrRealtimeResult为true即可开启推送,这样就可以接收到实时的文字结果。

ASR可以识别但是TTS听不到声音是为什么?

这个原因可能比较复杂,牵扯到的各种配置可能会很多,可能是您的Freeswitch配置问题、网络问题、EasyMrcp问题等等。这里给出使用中比较常问的问题,检查一下通话使用的编码类型,推荐使用PCMA。如果通话编码不对则会导致听不到TTS声音。或者指定freeswitch与EasyMrcp之间的协议,使用originator_codec=PCMA指定编码。

多次合成TTS时感到句子之间有停顿

因为现在是串行执行tts的,一个tts执行完才会执行下一个tts,这样在执行第二个tts的时候就有有个首包延迟的时间。这个问题目前还没优化,后期会优化成并行tts解决这个问题。

如何判断我要执行的TTS已经完成?

在调用EasyMrcp事件tts命令的时候可以传入自定义的eventid,这个id会在tts播放完成后返回SpeakComplete事件,其中就会包含自定义传入的eventid。此时证明tts已经在voip中播放完。

外呼如何发起?

freeswitch的通话其实是a-leg和b-leg的桥接,其实跟主叫被叫没有关系,只要能建立leg连接就可以进行通话,所以用fs呼叫谁都可以,建立好后桥接起来即可。

ASR语音识别模式

配置asr语音识别模式: dictation(一句话语音识别) 或者 transliterate(长时间语音转写)。这两种模式对应的是服务厂商提供的asr模式配置的。dictation是时长较短的一句话识别,这种是通过vad截取人声部分进行识别,一般服务厂商的费用低并发高。transliterate是从通话一开始就对音频进行asr识别,这种厂商收取的费用会高并且并发低。