当前位置: 首页 > 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.hskmm.com/?act=detail&tid=40374

相关文章:

  • 从 “报表堆里找问题” 到 “实时预警止损”:MyEMS 如何终结能源管理低效?
  • 「Note」计算几何
  • C++语法—类的声明和定义
  • 施工用电隐患 “无形侦探”!思通数科 AI 卫士自动排查用电违规
  • 四场比赛(三)
  • 使用DAST发现Android应用API中的AWS凭证泄露漏洞
  • 从 “短期达标” 到 “长期优化”:MyEMS 如何帮企业建立可持续的能源管理体系?
  • 为什么大型网站能“秒回”你的用户名?揭秘毫秒级响应背后的“守门人”艺术
  • 文件同步备份:为什么说“同步盘”是比“普通网盘”更高效、更安全的选择?
  • 基于C#的停车场管理系统实现
  • 2025年市面上别墅石材品牌与行业内别墅石材源头厂家推荐榜单及口碑好的别墅石材产品分析
  • 连中五标,中电金信国际化服务助力企业出海
  • 1195. 交替打印字符串
  • 回调函数
  • gdb调试常用命令
  • 2025年10月中国管理咨询公司推荐榜:五强数据对比
  • 条码识别插件 quaggaJS - microsoft
  • 2025 年灵巧手厂家最新推荐榜,技术实力与市场口碑深度解析,筛选高适配性与长耐用性优质品牌
  • Dify工作流实战:一键自动生成测试报告并推送钉钉,我每天白赚1小时
  • CF2043D Problem about GCD
  • 一起为可信数据流通添砖加瓦,隐语社区 OSCP 专项开源活动正式启动!
  • 2025年10月精益管理咨询公司推荐:权威榜单与多维对比评测
  • 2025年10月降本增效咨询公司推荐:实力榜对比五家优劣势
  • CF2093G Shorten the Array
  • 2025年10月降本增效咨询公司推荐榜:五强数据横评
  • 2025 年水处理聚丙烯酰胺,聚丙烯酰胺水处理剂,工业废水处理聚丙烯酰胺厂家最新推荐,产能、专利、环保三维数据透视!
  • 2025 年阴离子聚丙烯酰胺,阳离子聚丙烯酰胺,非离子聚丙烯酰胺厂家最新推荐,产能、专利、环保三维数据透视
  • 2025 年聚丙烯酰胺絮凝剂,PAM 聚丙烯酰胺,聚丙烯酰胺聚合氯化铝厂家最新推荐,产能、专利、环保三维数据透视
  • ST表
  • 吱吱企业即时通讯:赋能企业高效沟通与协作新生态