使用Air201做录音和播放录音的功能
Air201可以支持本地的录音功能,并且将录音保存的数据进行播放,下面我们将开始帮助您如何从零上手,实现录音和播放的功能。
1, 搭建环境
此时也可以在Luatools项目管理中新建一个项目,重新选择底层CORE和脚本
或者在原有项目的基础上,不更换CORE,将原来的脚本删除,添加为demo/record的脚本。
1.1 获取软件资料
固件链接:https://gitee.com/openLuat/LuatOS-Air201/tree/master/core
脚本链接:https://gitee.com/openLuat/LuatOS-Air201/tree/master/demo/record
1.2 连接喇叭
2, 调试代码
使用克隆的代码中 LuatOS-Air201\demo\record 的代码测试
2.1 初始化驱动es8311
Air201板子自带了es8311音频解码芯片(audio codec),所以硬件配置参数是固定的。
- es8311使用了I2C0,电源脚为GPIO2,pa控制脚为GPIO23
local es8311i2cId = 0 -- I2CID
local es8311PowerPin = 2 -- ES8311电源控制引脚
local paPin = 23 -- PA放大器控制引脚
mcu.altfun(mcu.I2C, es8311i2cId, 13, 2, 0)
mcu.altfun(mcu.I2C, es8311i2cId, 14, 2, 0)
i2c.setup(es8311i2cId, i2c.SLOW)
i2s.setup(0, 0, 16000, 16, i2s.MONO_R, i2s.MODE_LSB, 16)
audio.config(0, paPin, 1, 3, 100, es8311PowerPin, 1, 100)
audio.setBus(0, audio.BUS_I2S, {
chip = "es8311",
i2cid = es8311i2cId,
i2sid = 0,
voltage = audio.VOLTAGE_1800
}) -- 通道0的硬件输出通道设置为I2S
audio.vol(0, 80) -- 喇叭输出音量
audio.micVol(0, 80) -- mic输入音量
audio.pm(0, audio.POWEROFF)
2.2 注册音频事件回调函数
-- @param id 通道id
-- @param event 事件类型,可以是以下之一:
-- 0 开始解码文件
-- 1 开始输出解码后的音数据
-- 2 MORE_DATA: 底层驱动播放播放完一部分数据,需要更多数据
-- 3 AUDIO_DONE: 底层驱动播放完全部数据了
-- 4 DONE: 音频解码完成
-- 5 TTS做完了必要的初始化,用户可以通过audio_play_tts_set_param做个性化配置
-- 6 TTS编码完成了。注意不是播放完成
-- 7 RECORD_DATA: 录音数据
-- 8 RECORD_DONE: 录音完成
-- @param buff 事件相关的数据缓冲区
audio.on(0, function(id, event, buff)
log.info("audio.on", id, event)
-- 使用play来播放文件时只有播放完成回调
if event == audio.RECORD_DATA then -- 录音数据
elseif event == audio.RECORD_DONE then -- 录音完成
sys.publish("AUDIO_RECORD_DONE")
elseif event == audio.DONE or event == audio.MORE_DATA then -- 播放音频的事件
local succ, stop, file_cnt = audio.getError(0)
if not succ then
if stop then
log.info("用户停止播放")
else
log.info("第", file_cnt, "个文件解码失败")
end
end
log.info("播放完成一个音频")
sys.publish("AUDIO_PLAY_DONE")
end
end)
2.3 准备录音
录音API说明
audio.record(id, record_type, record_time, amr_quailty, path, record_callback_time)
id:多媒体播放通道号
record_type:录音音频格式,支持audio.AMR和audio.PCM
record_time:录制时长 单位秒,可选参数,默认为0 则表示一直录制
amr_quailty:录音质量,只有在音频格式为audio.AMR的情况下此参数有效。
path:录音文件路径,可选参数,不指定则不保存,可以再audio.on回调函数中处理原始PCM数据
record_callback_time:单次录音回调时长,单位100ms 默认1,既100ms。在不指定录音文件路径时,此参数有效。
-- 开始录音
log.info("准备开始录音")
audio.pm(0, audio.RESUME) -- 工作模式
local err = audio.record(0, audio.AMR, 5, 7, recordPath) -- 录制AMR格式,时长为5s的录音数据
result = sys.waitUntil("AUDIO_RECORD_DONE", 10000) -- 等待录音结束,并设置10s超时(超时时间要设置的比录制时间长 否则会还没录完就被当做超时强制结束了)
log.info("录音结束")
audio.pm(0, audio.POWEROFF) -- 断电模式,工作结束后就休息,节省功耗
2.4 播放录音
播放录音需要使用 audio.play() 接口,需要将录音文件的存放路径(path),作为第二个参数传入,就可以将刚刚录音的文件,进行播放。
-- 播放录音
log.info("准备播放录音")
local err = audio.play(0, recordPath)
result = sys.waitUntil("AUDIO_PLAY_DONE", 10000) -- 等待录音文件播放结束,并设置10s超时(超时时间要设置的比录制时间长 否则会还没播放完就被当做超时强制结束了)
log.info("录音播放完成")
audio.pm(0, audio.POWEROFF) -- 断电模式,工作结束后就休息,节省功耗
3, 展示效果
将demo烧录至Air201开机后,等待蓝灯亮起后对着mic麦克说话
经过5s后,蓝灯灭掉,会自动结束录音。随后间隔2s,红灯亮起,开始播放录音文件。