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

news/2025/10/28 12:14:37/文章来源:https://www.cnblogs.com/FBsharl/p/19171473

这个函数通过以下几个条件来综合判定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.mzph.cn/news/948674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:Qt信号与槽在多线程编程中的应用与注意事项

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

从 “短期达标” 到 “长期优化”:MyEMS 如何帮企业建立可持续的能源管理体系?

能源管理体系:短期与长期目标解析 在当今追求可持续发展的时代,能源管理体系对于企业而言至关重要。它犹如企业能源管理的指南针,引导企业在能源利用的道路上不断优化前行。能源管理体系的目标可以大致分为短期达标…

四场比赛(三)

0.前言 不会二项式反演了。 1.正文 20251028 我怒了。我不会二项式反演了。哭了。

使用DAST发现Android应用API中的AWS凭证泄露漏洞

本文详细介绍了如何通过动态应用安全测试(DAST)技术,在Android应用API中发现泄露的AWS凭证,这些凭证可能导致AWS基础设施被接管,包含完整的测试环境搭建和漏洞发现过程。发现隐藏威胁:我如何使用DAST在Android应用…

百航鹿大联训 Pwn篇

好难我靠,太难了。 四个人就我一个是主攻binary的,什么汇编、堆栈、计组一个没学,在人家机房里像个飞舞。 干巴爹。 hitb2018_gundam 纪念一下,人生第一道做出来(呃,复现出来)的Pwn题。人家教练交代的任务说什么…

开发stm32-配置vscode环境

第一步: 下载编译工具: 第二步: 打开vscode,安装相关插件。第三步:生成文件 (1)打开命令面板(Ctrl+Shift+P)输入并选择 C/Cpp: Edit Configurations (UI)。 第四步:配置c_cpp_properties.json 参照以下配置:…

iNeuOS工业互联网操作系统,增加工厂模型配置,继续深入业务

这次增加《生产工厂》模型配置,面向集团业务场景,可以增加多个工厂、每个工厂配置多个工序和班制信息。后续继续深化面向智能制造生产一体化管控具体业务,实现能源监测、能源统计和分析等功能模块。1. 概述 之前…

C++语法—类的声明和定义

一、 类的声明和定义 class 类名 {public:数据成员的声明成员函数的声明private:数据成员的声明成员函数的声明protected:数据成员的声明成员函数的声明 } 自生类的对象不可以作为该类的成员,但自生类的指针或引用可以…

施工用电隐患 “无形侦探”!思通数科 AI 卫士自动排查用电违规

施工用电是施工现场安全管理的 “重中之重”,但传统人工巡检模式常因 “专业性要求高、隐患隐蔽性强” 陷入困境:电缆泡水、电线私拉乱接(如直接缠绕钢管、未穿管保护)等隐患,藏在设备角落或地面杂物下,人工难以…

基于C#的停车场管理系统实现

一、系统架构设计 // 核心类结构设计 public class ParkingSystem {private ParkingLot _parkingLot; // 停车场实体private VehicleManager _vehicleMgr; // 车辆管理private FeeCalculator _feeCalculator; …

为什么大型网站能“秒回”你的用户名?揭秘毫秒级响应背后的“守门人”艺术

我们都经历过那个瞬间:在一个新平台注册时,你满怀期待地输入一个心仪的昵称,比如“ByteMonk”,点击“下一步”…… 几乎在你点击的同一瞬间,页面就弹出了那个让人抓狂的红色提示:“用户名已被占用”。 请暂停一下…

文件同步备份:为什么说“同步盘”是比“普通网盘”更高效、更安全的选择?

还在为文件误删或忘记保存而烦恼吗?本文深度评测2024年主流文件同步软件,助你找到最佳数据备份方案。首选推荐坚果云,其无感自动同步与强大的“文件历史版本”功能,能有效防止数据丢失,是你的终极数据“后悔药”。…

连中五标,中电金信国际化服务助力企业出海

近日,中电金信语言服务业务持续发力,凭借专业的技术实力与定制化服务能力,成功中标涵盖数字支付与金融科技、AI制造、游戏研发与发行、社交电商、互联网高科技等五个重点项目。这一系列合作成果,不仅是市场对中电金…

1195. 交替打印字符串

1195. 交替打印字符串 题目描述编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:如果这个数字可以被 3 整除,输出 "fizz"。如果这个数字可以被 5 整除,输出 "buzz"。如果这个数字…

企业微信ipad协议实现聚合聊天系统、RPA机器人智能回复

企业微信ipad协议实现聚合聊天系统、RPA机器人智能回复一、企业微信iPad协议技术解析 企业微信iPad协议是一种基于企业微信iPad版本的智能接口服务,通过自主研发的中间件技术实现企业微信生态功能的深度集成 。 与依赖…

2025年市面上别墅石材品牌与行业内别墅石材源头厂家推荐榜单及口碑好的别墅石材产品分析

摘要 随着高端住宅市场持续升温,别墅石材行业在2025年迎来新一轮发展机遇。消费者对石材品质、设计美感及供应链可靠性要求显著提升,本文基于市场调研数据及行业洞察,梳理当前别墅石材领域具有竞争力的品牌与企业。…

最近公共祖先 (LCA)

\(update : 2025/10/28\) 最近公共祖先, 即 \(LCA\) (\(Least\; Common\; Ancestor\)), 顾名思义, 用于在一棵树中求两个点的最近公共祖先 方法有很多, 效率和码量各有千秋 倍增法 很经典的 \(lca\) 求法, 主要是好理解…

IP归属地颗粒度和IP应用场景的关系

在我们日常生活中,IP地址归属地定位(即识别IP对应地理位置)的精度(颗粒度)常因使用方式不同而各异。颗粒度指的是位置识别的细致程度,例如国家、省、城市、区县或街道层级。IP地址的应用场景(如家庭宽带或数据中…

ChatGPT API集成测试自动化框架的实践与成效汇报

一、项目背景与目标 随着软件测试复杂度的提升,传统测试流程面临效率瓶颈。2025年,我司测试团队探索将ChatGPT API集成至现有自动化框架,旨在通过自然语言处理能力优化测试用例生成、缺陷定位及报告分析等环节,实现…

[题解]【MX-S8】梦熊 CSP-S 2025 模拟赛

原比赛页面 ~ 官方题解(直播回放) T1. P14308 【MX-S8-T1】斐波那契螺旋 发现方形的边长是斐波那契数列,增长非常快。打表发现,只要 \(91\) 个方形就能覆盖 \([-10^{18},10^{18}]\) 内的所有点。 所以模拟即可。时…