跳转至

exaudio - 音频扩展库

作者:梁健

一、概述

exaudio 是 audio 的扩展库,简化了使用方法,扩展了部分应用,建议使用此库. 音频框架如下:

合宙仅Air780EHV 内置音频编解码芯片,其他支持音频的功能需要外置音频编解码芯片。

目前合宙所有的型号均需要外置音频放大器(PA)才可将音频输出。

目前在支持播放的文件格式有mp3,amr,pcm,wav 支持流式播放(仅支持pcm 格式)

支持录音格式为amr,pcm 支持流式录音(仅支持pcm录音)

二、核心示例

2.1 播放

local audio_setup_param ={
    model= "es8311",          -- 音频编解码类型,可填入"es8311","es8211"
    i2c_id = 0,          -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
    pa_ctrl = 162,         -- 音频放大器电源控制管脚
    dac_ctrl = 164,        --  音频编解码芯片电源控制管脚    
}

local audio_play_param ={
    type= 0,                -- 播放类型,有0,播放文件,1.播放tts 2. 流式播放
                            -- 如果是播放文件,支持mp3,amr,wav格式
                            -- 如果是tts,内容格式见:https://docs.openluat.com/air780epm/common/tts/
                            -- 流式播放,仅支持PCM 格式音频,如果是流式播放,则sampling_rate, sampling_depth,signed_or_unsigned 必填写
    content = "/luadb/1.mp3",          -- 如果播放类型为0时,则填入string 是播放单个音频文件,如果是表则是播放多段音频文件,当播放类型为1的时候,表示的是播放路径
}
local function audio_task()
    if exaudio.setup(audio_setup_param) then
        exaudio.play_start(audio_play_param) -- 仅仅支持task 中运行
    end

end
sys.taskInitEx(audio_task, taskName)

2.2 录音

local audio_setup_param ={
    model= "es8311",          -- dac类型,可填入"es8311","es8211"
    i2c_id = 0,          -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
    pa_ctrl = 162,         -- 音频放大器电源控制管脚
    dac_ctrl = 164,        --  音频编解码芯片电源控制管脚
}
local recordPath = "/record.amr"

local audio_record_param ={
    format= exaudio.AMR_WB,    -- 录制格式,有exaudio.AMR_NB,exaudio.AMR_WB,exaudio.PCM_8000,exaudio.PCM_16000,exaudio.PCM_24000,exaudio.PCM_32000
    time = 5,               -- 录制时间,单位(秒)
    path = recordPath,             -- 如果填入的是字符串,则表示是文件路径,录音会传输到这个路径里
                                      -- 如果填入的是函数,则表示是流式录音,录音的数据会传输到此函数内,返回的是zbuf地址,以及数据长度
}

local taskName = "task_audio"
local function audio_task()
    sys.wait(100)
    if exaudio.setup(audio_setup_param) then
        exaudio.record_start(audio_record_param)
    end
end
sys.taskInitEx(audio_task, taskName)

三、常量详解

1、exaudio.PLAY_DONE : 当播放音频结束时,会在回调函数返回播放完成的时间

2、exaudio.RECORD_DONE : 当录音结束时,会在回调函数返回播放完成的时间

3、exaudio.AMR_NB : 仅录音时有用,表示使用AMR_NB 方式录音

4、exaudio.AMR_WB : 仅录音时有用,表示使用AMR_WB 方式录音

5、exaudio.PCM_8000/exaudio.PCM_16000/exaudio.PCM_24000/exaudio.PCM_32000 : 仅录音时有用,表示使用8000/16000/24000/32000/秒 的速度对音频进行采样

四、函数详解

exaudio.setup(audio_configs)

功能

初始化audio,配置关于编解码芯片,音频放大器的电源,编解码芯片的采样率,采样深度相关的功能

注意事项

1. 该接口只能也只需启动一次

2. 强烈建议编解码芯片以及音频放大器的电源由模组控制,这样才能有效降低pop 音,体验更好

3. 目前仅支持8311/8211 音频编解码,其中8211 不支持录音,也无需选择I2C 接口

4. 如果选择了8311 则必须填写I2C 的端口,并在pins 工具配置 luatio

5. 如果出现:"ES8311通讯失败,请检查硬件" 的打印,请检查硬件,很大可能是焊接不良,如果解决不了,可寻求合宙官方解决

6. audio_configs 入参是一个表,有如下参数:

    model = "es8311",         -- dac类型: "es8311","es8211"
    i2c_id = 0,               -- i2c_id: 0,1
    pa_ctrl = 0,              -- 音频放大器电源控制管脚
    dac_ctrl = 0,             -- 音频编解码芯片电源控制管脚
    dac_delay = 3,            -- DAC启动前冗余时间(单位100ms)
    pa_delay = 100,           -- DAC启动后延迟打开PA的时间(单位1ms)
    dac_time_delay = 600,     -- 播放完毕后PA与DAC关闭间隔(单位1ms)
    bits_per_sample = 16,     -- 采样位深
    pa_on_level = 1           -- PA打开电平 1:高 0:低  
下面将介绍各个参数的含义以及用法

参数 audio_configs

参数含义:音频的参数配置,参数为table类型table内容格式说明如下
{
model = ,
-- 参数含义:音频编解码芯片(音频的数模或者模数转换) 
-- 数据类型:string;
-- 取值范围:"es8311"/"es8211";
-- 是否必选:必选传入此参数;
-- 注意事项:注意大小写,必须为小写
i2c_id = ,
-- 参数含义:和音频编解码芯片通讯的I2C 接口;
-- 数据类型:number;
-- 取值范围:0,1
-- 是否必选:如果model 选择了"es8311" 则必填i2c_id,如果选择了"es8211",则不需要填写;
-- 注意事项:需要通过(https://docs.openluat.com/air780epm/common/luatio/) 配置自己使用的i2c 对应的管脚映射
pa_ctrl = ,
-- 参数含义:主控对音频放大器芯片电源控制的管脚;
-- 数据类型:number;
-- 取值范围:模块的GPIO 编号范围
-- 是否必选:非必须;
-- 注意事项:强烈建议使用IO 控制音频放大器的电源,配合编解码的电源,模块内的算法可-- 有效降低pop 音
dac_ctrl = ,
-- 参数含义:主控对音频编解码芯片电源控制的管脚;
-- 数据类型:number;
-- 取值范围:模块的GPIO 编号范围
-- 是否必选:非必须;
-- 注意事项:强烈建议使用IO 控制音频编解码的电源,配合音频放大器的电源,模块内的算法可有效降低pop 音

dac_delay = ,
-- 参数含义:DAC启动前冗余时间;
-- 数据类型:number;
-- 取值范围:> 0 
-- 是否必选:非必须;
-- 注意事项:DAC启动前冗余时间,单位为100ms,如果由pop 音根据实际的情况调整,一般不用设置。

pa_delay = ,
-- 参数含义:DAC启动后延迟打开PA的时间;
-- 数据类型:number;
-- 取值范围:> 0 
-- 是否必选:非必须;
-- 注意事项:DAC启动后延迟打开PA的时间,单位为1ms,如果由pop 音根据实际的情况调整,一般不用设置,常规来说是先打开音频编解码延迟一段时间后再打开音频放大器。

dac_time_delay = ,
-- 参数含义:播放完毕后PA与DAC关闭间隔;
-- 数据类型:number;
-- 取值范围:> 0 
-- 是否必选:非必须;
-- 注意事项:播放完毕后PA与DAC关闭间隔,单位为1ms,如果有pop 音,根据实际的情况调整,一般不用设置。

bits_per_sample = ,
-- 参数含义:采样位数;
-- 数据类型:number;
-- 取值范围:8,16,24 
-- 是否必选:非必须;
-- 注意事项:位深表示每个音频采样点用多少个二进制位(bit)来存储。它反映了数字音频对模拟信号振幅(音量)的量化精度
-- 位深越大,能表示的振幅等级越多,声音细节越丰富,但是对应的数据内容就越多,默认位16bit。

pa_on_level = ,
--参数含义:音频放大器芯片电源打开电平;
--数据类型:number;
--取值范围:1:高 0:低
--是否必选:非必须;
--注意事项:音频放大器芯片电源打开的电平高还是低,一般来说都是高。
}
数据类型:table
取值范围:参考参数含义内各字段说明    
是否必选:可选传入此参数;
注意事项:暂无;

返回值

返回true ,表示成功,返回false 表示失败

示例

local audio_configs ={
    model= "es8311",          -- 音频编解码类型,可填入"es8311","es8211"
    i2c_id = 0,          -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
    pa_ctrl = 162,         -- 音频放大器电源控制管脚
    dac_ctrl = 164,        --  音频编解码芯片电源控制管脚    
}
if exaudio.setup(audio_configs) then
    log.info("音频初始化成功")
end

exaudio.play_start(play_configs)

功能

播放文件,播放TTS,流式播放

注意事项

1. 支持MP3,WAV,AMR(含AMR_NB,AMR_WB)的格式的文件音频播放

2. 支持TTS 播放,但只支持中文的TTS

3. 支持流式播放,但仅仅支持PCM 数据流

6. play_configs 入参是一个表,有如下参数:

    type = 0,                 -- 0:文件 1:TTS 2:流式
    content = nil,            -- 播放内容/路径
    cbfnc = nil,              -- 播放完毕回调
    priority = 0,             -- 优先级(数值越大越高)
    sampling_rate = 16000,    -- 采样率(仅流式)
    sampling_depth = 16,      -- 采样位深(仅流式)
    signed_or_unsigned = true -- PCM是否有符号(仅流式)
下面将介绍各个参数的含义以及用法

参数

play_configs

参数含义:播放参数,参数为table类型table内容格式说明如下
{
type = ,
-- 参数含义:播放类型,有播放文件,播放TTS,流式播放三个方法 
-- 数据类型:number;
-- 取值范围:0(播放文件),1(播放TTS),2(流式播放);
-- 是否必选:必选传入此参数;

content = ,

-- 参数含义:播放的内容,或者回调函数地址 
-- 数据类型:string或者function或者table;
-- 取值范围:无;
-- 是否必选:必选传入此参数;
-- 注意事项:
-- 1. 当播放类型选择播放文件时候,content 内容必须填写string 或者table类型的播放路径
-- 1.1 当播放单个音频的时候,需要填入string 类型,表示播放路径
-- 1.2 当播放多个音频的时候,需要填入table 类型,table 的元素全为字符串,内容为播放路径
-- 2. 当播放类型为tts 的时候,content 内容必须填写string 类型,tts 仅支持文字转普通话,相关格式请见:https://wiki.luatos.com/chips/air780e/tts.html?highlight=tts
-- 3. 当播放类型为流式播放的时候,不需要填写此处

cbfnc = ,
-- 参数含义:当播放完成后,会触发此函数
-- 数据类型:function;
-- 取值范围:无;
-- 是否必选:非必须传入此参数;
-- 注意事项:目前仅会返回exaudio.PLAY_DONE(播放完成消息),不排除后面会增加其他的事件,回调函数如下:
-- local function cbfnc(event)
--    if event == exaudio.PLAY_DONE then
--        log.info("播放完成",exaudio.is_end())
--    end
-- end

priority = ,
-- 参数含义:播放优先级 
-- 数据类型:number;
-- 取值范围:大于等于0;
-- 是否必选:非必须传入此参数;
-- 注意事项:优先级高于或者正在播放的音频优先级,会让正在播放的音频停止播放,然后播放新的音频,如果小于或者等于正在播放的音频优先级,此次播放请求将被忽略。

sampling_rate = ,
-- 参数含义:采样率 
-- 数据类型:number;
-- 取值范围:8000,16000,24000,32000,48000,20050,44100;
-- 是否必选:当type 选择了流式播放(2),必须传入此参数,其他播放不传入此参数;
-- 注意事项:常规的音频都是8000,或者是16000

sampling_depth = ,
-- 参数含义:采样位深
-- 数据类型:number;
-- 取值范围:8,16,24;
-- 是否必选:当type 选择了流式播放(2),必须传入此参数,其他播放不传入此参数;

signed_or_unsigned = ,
-- 参数含义:PCM的编码类型
-- 数据类型:boolean;
-- 取值范围:true,false;
-- 是否必选:非必须传入此参数;
-- 注意事项:默认是true,即有符号
}
数据类型:table
取值范围:参考参数含义内各字段说明    
是否必选:可选传入此参数;
注意事项:暂无;

返回值

返回true ,表示成功,返回false 表示失败

示例

local audio_play_param ={

    type= 0,                -- 播放类型,有0,播放文件,1.播放tts 2. 流式播放
                            -- 如果是播放文件,支持mp3,amr,wav格式
                            -- 如果是tts,内容格式见:https://wiki.luatos.com/chips/air780e/tts.html?highlight=tts
                            -- 流式播放,仅支持PCM 格式音频,如果是流式播放,则sampling_rate, sampling_depth,signed_or_unsigned 必填写
    content = "/luadb/1.mp3",          -- 如果播放类型为0时,则填入string 是播放单个音频文件,如果是表则是播放多段音频文件。
    cbfnc = play_end,            -- 播放完毕回调函数
}

if exaudio.setup(audio_setup_param) then
    exaudio.play_start(audio_play_param) 
end

exaudio.record_start(recod_configs)

功能 开始录音,录音到文件功能以及支持PCM 的流式录音

注意事项

1. 仅仅支持AMR_NB,AMR_WB,PCM(8000,16000,24000,32000) 的格式

2. 流式录音仅仅支持PCM 格式

6. recod_configs 入参是一个表,有如下参数:

    format = exaudio.AMR_NB,               -- 录制格式,支持exaudio.AMR_NB,exaudio.AMR_WB,exaudio.PCM_8000,exaudio.PCM_16000,exaudio.PCM_24000,exaudio.PCM_32000
    time = 5,                 -- 录制时间(秒)
    path = nil,               -- 文件路径或流式回调
    cbfnc = nil               -- 录音完毕回调
下面将介绍各个参数的含义以及用法

参数

recod_configs

参数含义:播放参数,参数为table类型table内容格式说明如下
{
format = ,
-- 参数含义:录音格式
-- 数据类型:number;
-- 取值范围:exaudio.AMR_NB,exaudio.AMR_WB,exaudio.PCM_8000,exaudio.PCM_16000,exaudio.PCM_24000,exaudio.PCM_32000;
-- 是否必选:必须传入此参数;
-- 注意事项:
-- 1. 如果是录音到文件支持上述取值范围都支持,要注意的是,如果选择exaudio.AMR_WB,则需要固件支持volte 功能
-- 2. 如果要选择流式录音,仅支持(exaudio.PCM_8000,exaudio.PCM_16000,exaudio.PCM_24000,exaudio.PCM_32000)


time = ,
-- 参数含义:录音时长
-- 数据类型:number;
-- 取值范围:>0 (单位1s);
-- 是否必选:必须传入此参数;
-- 注意事项:时间越大,录制文件越大,在setup位数深为16的情况下:
-- 1. 如果选择AMR_NB,大约为1.2KB/S
-- 2. 如果选择AMR_WB,大约为2.4KB/S
-- 3. 如果选择PCM_8000,大约为15KB/S
-- 4. 如果选择PCM_16000,大约为30KB/S
-- 5. 如果选择PCM_24000,大约为45KB/S
-- 6. 如果选择PCM_32000,大约为60KB/S

path = ,
-- 参数含义:文件路径,或者流式录音的回调函数
-- 数据类型:string/function;
-- 取值范围:无;
-- 是否必选:必须传入此参数;
-- 注意事项:
-- 1. 如果是录音到文件,则传入文件路径
-- 2. 如果是流式录音,则传入回调函数地址,回调函数如下表示
-- local function  recode_data_callback(addr,data_len)
--    log.info("收到音频流,地址为:",addr,"有效数据长度为:",data_len)
-- end


cbfnc = ,
-- 参数含义:当录制完成后,会触发此函数
-- 数据类型:function;
-- 取值范围:无;
-- 是否必选:非必须传入此参数;
-- 注意事项:目前仅会返回exaudio.RECORD_DONE(录音完成消息),不排除后面会增加其他的事件,回调函数如下:
-- local function cbfnc(event)
--    if event == exaudio.PLAY_DONE then
--        log.info("播放完成",exaudio.is_end())
--    end
-- end
}
数据类型:table
取值范围:参考参数含义内各字段说明    
是否必选:可选传入此参数;
注意事项:暂无;

返回值

返回true ,表示成功,返回false 表示失败

示例

local audio_record_param ={
    format= exaudio.AMR_WB,    -- 录制格式,有exaudio.AMR_NB,exaudio.AMR_WB,exaudio.PCM_8000,exaudio.PCM_16000,exaudio.PCM_24000,exaudio.PCM_32000
    time = 5,               -- 录制时间,单位(秒)
    path = recordPath,             -- 如果填入的是字符串,则表示是文件路径,录音会传输到这个路径里
                                      -- 如果填入的是函数,则表示是流式录音,录音的数据会传输到此函数内,返回的是zbuf地址,以及数据长度
}

if exaudio.setup(audio_setup_param) then
    exaudio.record_start(audio_record_param)
end

exaudio.play_stream_write(data)

功能

流式播放时,写入音频数据接口

注意事项 流式音频数据,PCM格式,长度需要1024的倍数,可以一边网络下载音频数据,一边进行音频播放

参数 PCM 音频数据流

返回值

返回true ,表示成功,返回false 表示失败

exaudio.play_stop()

功能

停止播放

注意事项

参数

返回值

返回true ,表示成功,返回false 表示失败

exaudio.is_end()

功能

判断是否播放完成

注意事项

参数

返回值

返回true ,表示播放完成,返回false 表示播放未完成

exaudio.record_stop()

功能

停止录音

注意事项

参数

返回值

返回true ,表示成功,返回false 表示失败

exaudio.vol(play_volume)

功能

设置播放音量

注意事项

参数

参数含义:设置播放音量
数据类型:number
取值范围:0 - 100 
是否必选:必须传入此参数;
注意事项:音量太大可能会导致喇叭声音过爆,喇叭的功率需要和音频放大器的功率匹配

返回值

返回true ,表示成功,返回false 表示失败

exaudio.mic_vol(record_volume)

功能

设置录音音量

注意事项

参数

参数含义:设置录音音量
数据类型:number
取值范围:0 - 100 
是否必选:必须传入此参数;

返回值

返回true ,表示成功,返回false 表示失败

五、产品支持说明

780epm,780ehv,780eth,8000 全系列均支持