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