当前位置: 首页 > 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.gsyq.cn/news/32720.html

相关文章:

  • 开发stm32-配置vscode环境
  • 连中五标,中电金信国际化服务助力企业出海
  • 2025年市面上别墅石材品牌与行业内别墅石材源头厂家推荐榜单及口碑好的别墅石材产品分析
  • 最近公共祖先 (LCA)
  • ChatGPT API集成测试自动化框架的实践与成效汇报
  • [题解]【MX-S8】梦熊 CSP-S 2025 模拟赛
  • 从手动到全自动:我们如何用Dify重构了API回归测试流程
  • 基于3GPP LTE标准的信道仿真模型
  • 2025年10月智能工厂规划咨询公司推荐:热门对比榜五强深度解析
  • 2025 年 10 月 2 小时应急发电机租赁,山东发电机租赁,大型发电机租赁公司最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 2025年10月数字化咨询公司推荐:五强榜单与实战对比 .
  • 2025年10月绩效管理咨询公司推荐:五强榜单与选择指南
  • Java前后端分离架构的实践与优化路径
  • 2025年10月数字化咨询公司推荐:五强榜单与实战对比
  • 一起为可信数据流通添砖加瓦,隐语社区 OSCP 专项开源活动正式启动!
  • 2025年10月降本增效咨询公司推荐:实力榜对比五家优劣势
  • 2025 年水处理聚丙烯酰胺,聚丙烯酰胺水处理剂,工业废水处理聚丙烯酰胺厂家最新推荐,产能、专利、环保三维数据透视!
  • 2025 年阴离子聚丙烯酰胺,阳离子聚丙烯酰胺,非离子聚丙烯酰胺厂家最新推荐,产能、专利、环保三维数据透视
  • 吱吱企业即时通讯:赋能企业高效沟通与协作新生态
  • 企业性能测试内训首选方案|让团队快速掌握全链路性能分析与优化
  • 2025 年装配式建筑,装配式集成房屋,装配式轻钢房屋,装配式公厕厂家最新推荐,产能、专利、环保三维数据透视
  • Windows Server 2025 OVF (2025 年 10 月更新) - VMware 虚拟机模板
  • 同步盘哪个好用?坚果云、百度网盘等五大工具横向对比
  • Windows Server 2008 R2 OVF (2025 年 10 月更新) - VMware 虚拟机模板
  • Windows Server 2019 OVF (2025 年 10 月更新) - VMware 虚拟机模板
  • 基于Matlab/Simulink的CS-DCSK混沌键控系统仿真
  • 2025年10月环保板材品牌推荐:热度榜对比评测
  • CF1798D Shocking Arrangement 题解
  • P11994 [JOIST 2025] 外郎糕 题解
  • 告别手动上传!10款自动同步本地文件夹的网盘深度评测