K230音频API参考
1. 概述
1.1 概述
音频模块包括音频输入ai、音频输出ao、音频编码aenc、音频解码adec四个子模块以及对内置模拟audio codec的支持。音频输入模块包括i2s和pdm两种音频接口,配合pdma做内存拷贝,支持数字麦(pdm/i2s)和模拟audio codec(i2s)声源输入,内置模拟audio codec,支持对音频数据进行声音质量增强(VQE)处理:3A(AEC回声消除、ANR降噪、AGC自动增益)。音频输出模块支持i2s音频接口,配合pdma做内存拷贝,可外接数据喇叭或模拟audio codec作为声音输出。音频编码和解码模块暂支持对 G711格式的音频编解码功能,并支持外部编解码器的注册。
将音频模块拆分成多个子模块,模块间以低耦合的方式实现数据流的互传,这样的设计足以满足MAIX3下现有的多媒体业务。下图仅以语音对讲业务场景下音频模块使用方式来做分析。通过音频输入模块将采集到的音频数据通过音频编码模块编码后通过网络发送到远端,从远端获取到的音频编码数据经过音频解码模块解码后经音频输出模块即可播放远端声音。
1.2 功能描述
1.2.1 音频输入
音频输入模块(AI)主要实现配置及启用音频输入设备、获取音频帧数据等功能。
音频输入模块支持I2s和pdm协议接口。i2s 支持同时采集最多2路双声道音频,pdm支持同时采集最多8路单声道音频。详细的i2s、pdm特性如下:
-
I2s音频接口
-
数据采样率支持8kHz/12kHz/16kHz/24kHz/32kHz/44.1kHz/48kHz/96kHz/192kHz,采样精度支持16/24/32bit。
-
支持2组可配置IO用于输入/输出I2S音频数据,支持全双工模式。
-
-
pdm音频接口
-
支持PDM音频输入,1bit位宽,采样时钟频率为0.256MHz/0.384MHz/0.512MHz/0.768MHz/1.024MHz/1.4112MHz/1.536MHz/2.048MHz/2.8224MHz/3.072MHz/4.096MHz/5.6448MHz/6.144MHz/12.288MHz/24.576MHz,输入的PCM音频采样率为8kHz/12kHz/16kHz/24kHz/32kHz/44.1kHz/48kHz/96kHz/192kHz。采样精度支持16/24/32bit.
-
支持过采样率128、64、32倍过采样。
-
支持1-4个IO用于输入PDM音频数据。
-
输入支持可配置1-8个PDM声道,支持PDM左右单声道模式和双声道模式,各IO声道模式统一,PDM双声道模式最多使用4个IO
-
使能的声道序号从小到大并且连续,不支持各声道随机使能
-
1.2.2 音频输出
音频输出(AO)主要实现启用音频输出设备、发送音频帧到输出通道等功能。
音频输出模块支持I2s协议接口。i2s 支持同时输出最多2路双声道音频。
-
i2s音频接口
-
数据采样率支持8kHz/12kHz/16kHz/24kHz/32kHz/44.1kHz/48kHz/96kHz/192kHz,采样精度16/24/32bit。
-
支持2组可配置IO用于输入/输出I2S音频数据,支持全双工模式。
-
1.2.3 音频链路
-
audio codec从模拟麦克风接收到的信号,转变为I2S格式的PCM数据后,输入到audio中的I2S中;I2S输出的PCM数据,经过audio codec后,变为模拟信号发出,该模式不使用数字IO,固定使用I2S的sdi0和sdo0接口。
-
I2S的直接与片外的数字麦克风和PA连接。共有两组接口可以选择:sdi0、sdo0及sdi1、sdo1。
-
片外的PDM麦克风,输入最多8路PDM数据到audio的4个输入数据接口。
可供选择得链路包括:
-
3组pdm_in + 1组i2s_in + 2组i2s out,其中1组i2s_in可以使用内置audio codec或片外
-
4组pdm_in + 2组i2s out
-
2组i2s_in + 2组 pdm_in + 2组i2s out
可以使用内置codec或外接设备(音频子板)来测试音频相关功能。使用内置codec可以测试一组I2S音频输入和输出及audio codec相关功能,使用音频子板可以测试2组i2s音频输入输出和4组pdm音频输入功能。
1.2.4 声音质量增强
音频模块支持对音频数据进行声音质量增强处理 ,实现音频3A功能。目前支持的采样精度为16bit,支持的采样率为16k。
2. API 参考
2.1 音频输入
该功能模块提供以下API:
- kd_mpi_ai_set_pub_attr
- kd_mpi_ai_get_pub_attr
- kd_mpi_ai_enable
- kd_mpi_ai_disable
- kd_mpi_ai_enable_chn
- kd_mpi_ai_disable_chn
- kd_mpi_ai_get_frame
- kd_mpi_ai_release_frame
- kd_mpi_ai_set_vqe_attr
- kd_mpi_ai_get_vqe_attr
2.1.1 kd_mpi_ai_set_pub_attr
【描述】
设置AI设备属性。
【语法】
k_s32 kd_mpi_ai_set_pub_attr(k_audio_dev ai_dev, const k_aio_dev_attr *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
attr | AI设备属性指针。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
【注意】
无
【举例】
k_aio_dev_attr aio_dev_attr;
aio_dev_attr.audio_type = KD_AUDIO_INPUT_TYPE_I2S;
aio_dev_attr.kd_audio_attr.i2s_attr.sample_rate = 44100;
aio_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_16
aio_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2;
aio_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_STANDARD_MODE;
aio_dev_attr.kd_audio_attr.i2s_attr.frame_num = 25;
aio_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = 44100/25;
aio_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_INNERCODEC;
if (K_SUCCESS != kd_mpi_ai_set_pub_attr(0, &aio_dev_attr))
{
printf("kd_mpi_ai_set_pub_attr failed\n");
return K_FAILED;
}
if (K_SUCCESS != kd_mpi_ai_enable(0))
{
printf("kd_mpi_ai_set_pub_attr failed\n");
return K_FAILED;
}
if (K_SUCCESS != kd_mpi_ai_enable_chn(0, 0))
{
printf("kd_mpi_ai_set_pub_attr failed\n");
return K_FAILED;
}
2.1.2 kd_mpi_ai_get_pub_attr
【描述】
获取AI设备属性。
【语法】
k_s32 kd_mpi_ai_get_pub_attr(k_audio_dev ai_dev, k_aio_dev_attr *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
attr | AI设备属性指针。 | 输出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.3 kd_mpi_ai_enable
【描述】
使能ai设备。
【语法】
k_s32 kd_mpi_ai_enable(k_audio_dev ai_dev);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.4 kd_mpi_ai_disable
【描述】
禁用ai设备。
【语法】
k_s32 kd_mpi_ai_disable(k_audio_dev ai_dev);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.5 kd_mpi_ai_enable_chn
【描述】
使能ai通道。
【语法】
k_s32 kd_mpi_ai_enable_chn(k_audio_dev ai_dev,k_ai_chn ai_chn);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.6 kd_mpi_ai_disable_chn
【描述】
禁用ai通道。
【语法】
k_s32 kd_mpi_ai_disable_chn(k_audio_dev ai_dev,k_ai_chn ai_chn);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.7 kd_mpi_ai_get_frame
【描述】
获取音频帧。
【语法】
k_s32 kd_mpi_ai_get_frame(k_audio_dev ai_dev,k_ai_chn ai_chn,k_audio_frame*frame, k_u32 milli_sec);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
frame | 音频帧数据。 | 输出 |
milli_sec | 获取数据的超时时间。 -1表示阻塞模式,无数据时一直等待; 0表示非阻塞模式,无数据时则报错返回; >0表示阻塞milli_sec毫秒,超时则报错返回。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
【注意】
- milli_sec的值必须大于等于-1,等于-1时采用阻塞模式获取数据,等于0时采用非
阻塞模式获取数据,大于0时,阻塞milli_sec毫秒后,没有数据则返回超时并报错。
- 获取音频帧数据前,必须先使能对应的AI通道。
【举例】
k_audio_frame audio_frame;
while(true)
{
//get frame
if (K_SUCCESS != kd_mpi_ai_get_frame(dev_num, channel, &audio_frame, 1000))
{
printf("=========kd_mpi_ai_get_frame timeout\n");
continue ;
}
//process frame
process_frame(&audio_frame);
//release frame
kd_mpi_ai_release_frame(dev_num, channel, &audio_frame);
}
2.1.8 kd_mpi_ai_release_frame
【描述】
释放音频帧。
【语法】
k_s32 kd_mpi_ai_release_frame(k_audio_dev ai_dev,k_ai_chn ai_chn,const k_audio_frame *frame);【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
frame | 音频帧数据。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.9 kd_mpi_ai_set_vqe_attr
【描述】
设置AI的声音质量增强功能相关属性。
【语法】
k_s32 kd_mpi_ai_set_vqe_attr(k_audio_dev ai_dev, k_ai_chn ai_chn, const k_bool *vqe_enable);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
vqe_enable | 声音质量增强使能标志位。 K_TRUE:使能。 K_FALSE:不使能。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
库文件:libai.a
【注意】
目前支持的采样精度为16bit,支持的采样率为8k和16k。
2.1.10 kd_mpi_ai_get_vqe_attr
【描述】
获取AI的声音质量增强功能相关属性。
【语法】
k_s32 kd_mpi_ai_get_vqe_attr(k_audio_dev ai_dev, k_ai_chn ai_chn, k_bool *vqe_enable);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
vqe_enable | 声音质量增强使能标志位指针。 K_TRUE:使能。 K_FALSE:不使能。 | 输出 |
【 返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.2 音频输出
该功能模块提供以下API:
- kd_mpi_ao_set_pub_attr
- kd_mpi_ao_get_pub_attr
- kd_mpi_ao_enable
- kd_mpi_ao_disable
- kd_mpi_ao_enable_chn
- kd_mpi_ao_disable_chn
- kd_mpi_ao_send_frame
2.2.1 kd_mpi_ao_set_pub_attr
【描述】
设置AO设备属性。
【语法】
k_s32 kd_mpi_ao_set_pub_attr(k_audio_dev ao_dev, const k_aio_dev_attr *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ao_dev | 音频设备号。 | 输入 |
attr | AO设备属性指针。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【 需求】
- 头文件:mpi_ao_api.h
- 库文件:libao.a
【注意】
无
【举例】
k_aio_dev_attr ao_dev_attr;
ao_dev_attr.audio_type = KD_AUDIO_OUTPUT_TYPE_I2S;
ao_dev_attr.kd_audio_attr.i2s_attr.sample_rate = 48000;
ao_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_24;
ao_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2;
ao_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_RIGHT_JUSTIFYING_MODE;
ao_dev_attr.kd_audio_attr.i2s_attr.frame_num = 15;
ao_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = 48000/25;
ao_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_EXTERN;
if (K_SUCCESS != kd_mpi_ao_set_pub_attr(0, &ao_dev_attr))
{
printf("kd_mpi_ao_set_pub_attr failed\n");
return K_FAILED;
}
if (K_SUCCESS != kd_mpi_ai_enable(0))
{
printf("kd_mpi_ai_enable failed\n");
return K_FAILED;
}
if (K_SUCCESS != kd_mpi_ai_enable_chn(0,1))
{
printf("kd_mpi_ai_enable_chn failed\n");
return K_FAILED;
}
2.2.2 kd_mpi_ao_get_pub_attr
【描述】
获取AO设备属性。
【语法】
k_s32 kd_mpi_ao_get_pub_attr(k_audio_dev ao_dev, k_aio_dev_attr *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ao_dev | 音频设备号。 | 输入 |
attr | AO设备属性指针。 | 输出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ao_api.h
- 库文件:libao.a
2.2.3 kd_mpi_ao_enable
【描述】
使能ao设备。
【语法】
k_s32 kd_mpi_ao_enable(k_audio_dev ao_dev);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ao_dev | 音频设备号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |