在Freeswitch中,播放录音使用的是playback,语音识别使用的是
play_and_detect_speech detect:unimrcp {start-input-timers=false,no-input-timeout=80000,recognition-timeout=80000} hello
那么如何控制在语音识别结果出来的时候,停止音频播放;未识别出语音识别结果的时候,音频继续播放。
在Freeswitch中,播放录音使用的是playback,语音识别使用的是
play_and_detect_speech detect:unimrcp {start-input-timers=false,no-input-timeout=80000,recognition-timeout=80000} hello
那么如何控制在语音识别结果出来的时候,停止音频播放;未识别出语音识别结果的时候,音频继续播放。
收起
当前问题酬金
¥ 200 (您已提供 ¥ 20, 还可追加 ¥ 300)
支付方式
扫码支付
调用函数play_and_detect_speech后,判断语音识别是否出来了,然后分别进行不同的处理。
改动最小最简单的方法:
打开mod_unimrcp.c 找到这个函数,只需要添加一句代码,这是最简单的代码方式就能使这个app play_and_detect_speech 变得好用起来,你甚至不用去改fs的核心代码,也不用去重新编译fs,只需要重新编译mod_unimrcp.c就行

更简单更安全的方法:
不让unimrcpserver发送 start of input 事件,同样可以使这个app好用起来
这个只需要编译unimrcpserver里面的插件就行

因为这样做都是让fs可以忽略了 mrcp 的 start of input 事件,改为收到结果再打断。
你调用的这个接口可能是将播放和识别捆绑在一起的,要想单独控制的话,最好就播放和识别分开调用
加控制语句
playback_terminators=123456789*0# | any | none
你的你目的是:控制在语音识别结果出来的时候,停止音频播放;未识别出语音识别结果的时候,音频继续播放。
音频播放应该是一个函数,语音识别也应该是一个函数
(1)定义一个全局变量flag,在语音识别中,当识别出结果时,flag = true
(2)在音频播放中,不断检测 flag 是否为true,当检测到 true 时,停止音频播放;否则,继续播放
不知道具体你代码如何,只能说一下思路
if ret==语音识别结果出来的时候:
停止音频播放;
if ret==未识别出语音识别结果的时候:
音频继续播放。
if ret==语音识别结果出来的时候:
停止音频播放;
if ret==未识别出语音识别结果的时候:
音频继续播放。
找到这个app的注册函数
二:当进入switch_ivr_play_file,在一个死循环内就会不断地去调用回调函数play_and_detect_input_callback去检查asr生成的事件,如果事件的类型为:
SWITCH_EVENT_DETECTED_SPEECH 即收到了asr的事件,这个时候不论是收到事件类型的:begin-speaking 还是 detected-speech 都会导致跳出播放文件(打断)
但一开始应该收到的事件一般多为mrcp的start input ,除非unimrcpserver不发送start input 事件,最后也就是说,freeswitch 的语音打断是通过mrcp的start input 或者是收到asr的识别结果来做打断的。但其实这个是不好的
总结:
语音打断的方案其实有不少,fs的只是其中的一种,虽然不好用,但你也可以收动改源码使这个app好用
一:
改动最小最简单的方法:
打开mod_unimrcp.c 找到这个函数,只需要添加一句代码,这是最简单的代码方式就能使这个app play_and_detect_speech 变得好用起来,你甚至不用去改fs的核心代码,也不用去重新编译fs,只需要重新编译mod_unimrcp.c就行
这个是什么
private void doVoice(ArrayList<RecognizerResult> results) {
Intent i = new Intent();
for(RecognizerResult result : results){
if(result.text.contains("天气")){
i.setClass(Voice1Activity.this, Weather.class);
startActivity(i);
}else if(result.text.contains("新闻")){
i.setClass(Voice1Activity.this, News.class);
startActivity(i);
}else if(result.text.contains("短信")){
i.setAction(Intent.ACTION_VIEW);
i.setType("vnd.android-dir/mms-sms");
startActivity(i);
}else{
Toast.makeText(Voice1Activity.this, "无法识别", Toast.LENGTH_SHORT).show();
}
}
}
报告相同问题?