Freeswitch VAD改造支持as

349 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第35天,点击查看活动详情

当用户说话才开始录音,当用户停止说话停止录音.

uuid_record和record_session

1.使用条件:

设置录音时间长度在1-50s之间

就启动支持asr:当用户说话才开始录音,当用户停止说话停止录音.

假如没设置录音时间长度,或者时间长度超过50s,支持asr功能不起效.

uuid_record和record_session 行为跟修改之前一样.

2.设置参数:

2.1 可以设置 RECORD_SILENCE_THRESHOLD  通道变量

参数是判断用户说话开始的能量,可以设置<3000,比如设置RECORD_SILENCE_THRESHOLD=1000

没设置就是使用系统里面默认的能量=3000.一般情况下设置=1000

 

 可以设置 EOS_SILENCE_THRESHOLD  通道变量

参数是判断用户没说话的能量,可以设置>200,EOS_SILENCE_THRESHOLD=5000

没设置就是使用系统里面默认的能量=200.一般情况下设置=500

2.2 可以设置 RECORD_FINAL_TIMEOUT_MS  通道变量

 参数是设置用户说话之后没说话多久认为用户真的停止说话了

 可以设置<2000,比如设置RECORD_FINAL_TIMEOUT_MS=1000

 没设置就是使用系统里面默认的是2000ms,

 假如 拨入可以设置 default 拨号计划里面

假如拨出的 需要vars.xml 里面设置

 说话间隔超时时间:

 

 说话开始能量:

   

  说话结束的能量:

 

 

3.事件处理

 设置录音时间长度在1-20s之间,这个时候支持asr功能生效,

 用户假如一直没说话,时间到了会产生RECORD_STOP事件.

 假如用户开始说话,马上产生:RECORD_START事件,

 用户说话结束产生: RECORD_STOP

 假如系统有播音(对话方式),那么收到RECORD_START事件

 需要马上停止播音,收到RECORD_STOP事件可以把录音文件打开

读出里面的语音拿去进行识别

4.esl 修改:

 4.1 增加 RECORD_START RECORD_STOP 事件监听

4.2

if (strcmp(event, "RECORD_START") == 0)//yhy2018-01-13 需要判断自己的record filename才能stop play

{if (xxx)//有播音要停止播音

{char*p = strstr(eventbody, "Record-File-Path: ");

if (p)

{p = p + strlen("Record-File-Path: ");

strncpy(tmp, p, 64);

tmp[64] = 0;

if (strlen(Lineinfo.filename)>1 && strstr(tmp, Lineinfo.filename + 4))//d:/xx Record-File-Path: d%3A/data/2018/01/13/150614_13606060253_001.wav

{sprintf(cmd_tmp, "api uuid_break %s all", uuid);

esl_send_recv_timed(handle, cmd_tmp, 1000);

cti_log(5, "RECORD_START,%s,stop play,pause on", cmd_tmp);

return 0;

4.3

if (strcmp(event, "RECORD_STOP") == 0)//yhy2017-12-19 支持op_record 50秒内的录音改进. sos 才录音,eos 录音结束.

{

get_lineinfo(index, Lineinfo);

if (Lineinfo.record == 1 && time(NULL)>Lineinfo.time)//yhy2018-01-31 之前的record 不是当前的record 才停止

{

char*p = strstr(eventbody, "Record-File-Path: ");//yhy2018-03-17停止也要判断文件名

if (p)

{

p = p + strlen("Record-File-Path: ");

strncpy(tmp, p, 64);

tmp[64] = 0;

if (strlen(Lineinfo.filename) > 1 && strstr(tmp, Lineinfo.filename + 4))//d:/xx Record-File-Path: d%3A/data/2018/01/13/150614_13606060253_001.wav

{if (xxx)//有播音要停止播音

{sprintf(cmd_tmp, "api uuid_break %s all", uuid);

esl_send_recv_timed(handle, cmd_tmp, 1000);

cti_log(5, "index=%04d,RECORD_STOP,filename=%s", index, Lineinfo.filename);

return 0;