Audio(音频播放)

# 简介 模块支持播放音频文件和TTS(文字转语音)功能,AT版本和LuatOS-Air版本均支持音频播放,AT版本和带TTS的LuatOS-Air版本支持TTS功能。音频文件目前支持mp3和amr. # API说明 |API接口|描述| |-|-| |audio.play()|播放音频| |audio.stop()|停止音频播放| |audio.setVolume()|设置喇叭音量等级| |audio.setCallVolume()|设置通话音量等级| |audio.setMicVolume()|设置麦克音量等级| |audio.getVolume()|获取喇叭音量等级| |audio.getCallVolume()|获取通话音量等级| |audio.getMicVolume()|获取麦克音量等级| |audio.setStrategy()|设置优先级相同时的播放策略| |audio.setTTSSpeed()|设置TTS朗读速度| |audio.setChannel()|设置音频输出、输入通道| |audio.setMicGain()|设置mic增益等级| >详细的API介绍见[audio API章节](https://doc.openluat.com/wiki/21?wiki_page_id=2266) ## 实现流程 调用相应接口。 代码逻辑:先判断是否是带TTS功能的底包(string.match(rtos.get_version(),"TTS")),然后设置5秒后调用testPlayTts(sys.timerStart(testPlayTts,5000)),最后在testPlayTts里循环播放,音量等级7,循环间隔为2000毫秒(audio.play(TTS,"TTS",ttsStr,7,nil,true,2000)). ## 示例 [demo讲解](http://doc.openluat.com/wiki/21?wiki_page_id=2164"demo讲解") ## 常见问题 1. 播放提示priority error”,原因是优先级高的音频还没有播放完。分析方法:在audio.lua开源库里看日志打印的地方。解决办法:可根据应用需要提高优先级。 2. TTS功能问题 不支持英文单词朗读,仅支持单字母朗读,例如bye,不会读成“白”,会读成“比、外、一” 数字朗读时,根据特殊标记,可作为数值连续,也可以作为号码连读。默认是自动识别; 例如"10086",默认状态下,根据语义,可能读成“幺零零八六”,也可能读成“一万零八十六”。 如果主动配置为号码来读,加[n1]标记,变成"[n1]10086",会读成“幺零零八六” 如果主动配置为数值来读,加[n2]标记,变成"[n2]10086",会读成“一万零八十六” 更多文本标记参考:[Aisound5.pdf](https://cdn.openluat-luatcommunity.openluat.com/attachment/20201113135045712_Aisound5.pdf) 3. 暂停、重新播放功能问题 在3037底包上使用audiocore.pause()和audiocore.resume(),在testAudio.lua添加测试代码如下: ``` sys.taskInit(function() sys.wait(5000) audio.play(CALL,"FILE","/lua/tip.amr",1) sys.wait(5000) log.info("testAudio.pause") audiocore.pause() sys.wait(5000) log.info("testAudio.resume") audiocore.resume() sys.wait(5000) log.info("testAudio.pause") audiocore.pause() sys.wait(5000) log.info("testAudio.resume") audiocore.resume() end) ``` 4. 有些MP3用demo流播放失败 原因:有些MP3包含很多歌曲说明,文件头比较大。如果第一个放入 audiocore.streamplay的数据不包含完整的头,就会播放失败。 解决:testAudioStream.lua修改 ``` local data = fileHandle:read(streamType == audiocore.SPX and 1200 or 1024) ``` 为 ``` local data = fileHandle:read(streamType == audiocore.SPX and 1200 or 2048) ``` testHttpPlayMp3.lua修改 ``` if #tBuffer==1 then sys.publish("DATA_STREAM_IND") end ``` 为 ``` if 2048 <=remainDataLen then sys.publish("DATA_STREAM_IND") end ``` 5. 模块音频最高码率支持多大 通话中发送声音到对端,必须是12.2K AMR格式 ,播放mp3音乐为128kbps