当前位置: 首页 > news >正文

【CI130x 离在线】语音芯片如何判断TTS音频播放完毕?

这个函数通过以下几个条件来综合判定TTS播放结束:

主要判定逻辑:

1. 缓冲区数据检查

c
#if NET_AUDIO_PLAY_BY_MP3
if (xStreamBufferBytesAvailable(mp3_player) == 0) // 播放完成
#elif NET_AUDIO_PLAY_BY_PCM || NET_AUDIO_PLAY_BY_OPUS
if (xStreamBufferBytesAvailable(gCiasAiotRunParam.pcm_play_data_stream_buffer) < 512)
#endif
  • MP3模式:缓冲区完全为空

  • PCM/OPUS模式:缓冲区数据少于512字节

2. 结束标志与重试次数组合判断

情况A - 有结束标志时:

c
if (gCiasAiotRunParam.play_cloud_end_flag)
{if (gCiasAiotRunParam.request_play_try_count >= 10){ret = true;}
}

收到云端结束标志后,再重试10次(约1秒)确认真实结束

情况B - 无结束标志时:

c
else if (gCiasAiotRunParam.request_play_try_count >= 30)
{ret = true;
}

未收到结束标志时,重试30次(约3秒)后强制结束

3. 播放结束后的清理操作

当判定播放结束后,执行:

  • 设置播放状态为闲置(CI_SS_PLAY_STATE_IDLE)

  • 开启VOX语音检测

  • 重置所有相关标志位

  • 停止编解码器

  • 等待播放完全停止(最多300ms)

  • 发送PLAY_TTS_END命令

总结:

判定播放结束的核心是缓冲区数据基本耗尽 + 适当的重试等待,通过组合云端结束标志和本地缓冲区状态来确保播放真正完成,避免提前或延迟结束。

 

完整代码

#if NET_AUDIO_PLAY_BY_MP3if (xStreamBufferBytesAvailable(mp3_player) == 0) // 播放完成
#elif NET_AUDIO_PLAY_BY_PCM || NET_AUDIO_PLAY_BY_OPUSif (xStreamBufferBytesAvailable(gCiasAiotRunParam.pcm_play_data_stream_buffer) < 512)
#endif{if (gCiasAiotRunParam.play_cloud_end_flag){if (gCiasAiotRunParam.request_play_try_count >= 10){ret = true;}}else if (gCiasAiotRunParam.request_play_try_count >= 30){ret = true;}if (ret){mprintf("play stop sync state to wifi ....\r\n");ret = false;ciss_set(CI_SS_PLAY_STATE, CI_SS_PLAY_STATE_IDLE); // 设置播放结束if (!gCiasAiotFuncParam.upload_play_full_duplex){ciss_set(CI_SS_VOX_WORK_STATE, 1); // 开启vox vad计算}gCiasAiotRunParam.request_play_try_count = 0;gCiasAiotRunParam.play_cloud_data_flag = false;gCiasAiotRunParam.request_play_data_flag = false;gCiasAiotRunParam.wait_play_end_flag = false;gCiasAiotRunParam.rcv_cloud_play_data_flag = false;gCiasAiotRunParam.stop_collect_pcm_flag = false;
#if NET_AUDIO_PLAY_BY_MP3stop_play(NULL, NULL); // 必须保留,不然下一段播放音频会保留上一段音频数据
#elif NET_AUDIO_PLAY_BY_PCM || NET_AUDIO_PLAY_BY_OPUScm_stop_codec(PLAY_CODEC_ID, CODEC_OUTPUT);cm_set_codec_mute(PLAY_CODEC_ID, CODEC_OUTPUT, 3, DISABLE);
#endifint try_count = 30;while(try_count--)   //等待播放状态同步完成{if(gCiasAiotRunParam.mp3_play_finish_flag){break;}else{mprintf("===wait audio play over\r\n");vTaskDelay(pdMS_TO_TICKS(10));}}cias_send_cmd(PLAY_TTS_END, DEF_FILL);}gCiasAiotRunParam.request_play_try_count++;}

 

http://www.sczhlp.com/news/237792/

相关文章:

  • 从 “报表堆里找问题” 到 “实时预警止损”:MyEMS 如何终结能源管理低效?
  • 「Note」计算几何
  • CTP制版设备品牌权威推荐:洞察行业翘楚,赋能印刷未来
  • 做牛津纺衬衫的网站不成立公司怎么做企业网站
  • 阳谷网站建设费用桂林漓江景区游玩攻略
  • 郑州网站建设喝彩环球资源网的优势
  • 盐城网站平台建设小型办公室网络布线设计方案
  • 公司网站建设招标文件范本wordpress 网页加载慢
  • 马云的网站是谁建设的手机端是什么
  • 网站开发选什么职位竞价网络推广
  • 外贸网站建设熊掌号seo页面排名优化
  • 个体户做网站ja.wordpress.org
  • 手机网站开发教程浙江十大外贸公司
  • 淄博手机网站专业做电脑系统下载网站
  • 福建建设工程报建网站全国工程信息查询平台
  • 重庆网站制作公司 wordpress卡密销售
  • 网站缺陷和优化的例子wordpress修改我要注册链接
  • 谈谈网站建设会有哪些问题湖南长沙旅游攻略自助游
  • 怎么建立网站免费的购物网站后台管理模板
  • 高端网站建设公司排名简单描述什么是网络营销
  • 南通云网站建设视频制作公司排名
  • 嘉定网站建设网页制作阿里云虚拟主机购买
  • 高端企业网站源码项目网络由箭线和节点构成
  • 厚街做网站公司电脑培训班附近有吗
  • 安徽省住房城乡建设厅网站什么叫网站集约化建设
  • 儿童做网站wordpress斗图
  • 喀什哪有做网站的网站建设服务网站建设
  • 微网站设置爱企业查询
  • 网站建设合同怎么写大伙房水库输水工程建设局网站
  • 做网站使用什么软件的免费咨询师心理医生