本章节介绍 GK7206 的音频处理应用示例 —— sample_audio。该应用包含了 9 个独立的音频处理程序,涵盖了音频采集、播放、编解码、录音、双讲等完整的音频功能链路。
应用源码位于 SDK 目录 sample/audio/,提供了全面的音频功能演示,是开发音频相关应用的参考模板。
本应用包含 9 个独立的音频处理程序:
| 参数 | 值 |
|---|---|
采样率 |
8000/16000/32000/44100/48000 Hz |
声道数 |
1(单声道)/ 2(立体声) |
采样位深 |
16 bit |
编码格式 |
G711A/U、AAC |
音频质量增强 |
VQE(Voice Quality Enhancement) |
回声消除 |
AEC(Acoustic Echo Cancellation) |
输入输出文件 |
PCM 文件(放 /sd_card) |
sample/audio/
├── Makefile # 构建脚本
├── sample_audio_ai # 音频采集程序
├── sample_audio_ai.c # 音频采集源码
├── sample_audio_ao # 音频输出程序
├── sample_audio_ao.c # 音频输出源码
├── sample_audio_encoder # 音频编码程序
├── sample_audio_encoder.c # 音频编码源码
├── sample_audio_decoder # 音频解码程序
├── sample_audio_decoder.c # 音频解码源码
├── sample_audio_record_v1 # 录音程序 v1
├── sample_audio_record_v2 # 录音程序 v2
├── sample_audio_record_v3 # 录音程序 v3
├── sample_audio_record_detect # 录音 + 检测程序
├── sample_audio_doubletalk_v1 # 双讲程序 v1
├── sample_audio_doubletalk_v2 # 双讲程序 v2
└── record_board/ # 板级录音
├── sample_record_board_detect
└── sample_record_board_record
在编译本应用之前,请确保已完成以下准备工作:
# 进入 sample 目录
cd <SDK_PATH>/sample
# 编译 audio 示例
make -C audio clean && make -C audio
或者从顶层编译:
make -C sample all
# 使用 SCP 传输到开发板
scp sample/audio/sample_audio_* root@<板端IP>:/sd_card/
# 或通过 TFTP 下载
tftp -g -r sample_audio_ai <板端IP>
相关信息
音频文件通常较大,建议放在 SD 卡上运行。
sample_audio_ai 演示了音频采集功能,将麦克风输入的音频数据保存为 PCM 文件。
./sample_audio_ai [dev] [send_object] [binder_mode] [samplerate] [usr_samplerate] [channels] [workmode] [outfile] [vqe_type]
参数说明:
| 参数 | 说明 | 取值 |
|---|---|---|
dev |
音频设备号 | 0/1 |
send_object |
发送对象 | 0=AO, 1=编码器, 2=两者 |
binder_mode |
绑定模式 | 0/1 |
samplerate |
采样率 | 8000/16000/32000/44100/48000 |
usr_samplerate |
用户采样率 | 8000/16000/32000/44100/48000 |
channels |
声道数 | 1/2 |
workmode |
工作模式 | 0/1 |
outfile |
输出文件路径 | /sd_card/ai.pcm |
vqe_type |
音频质量增强类型 | 0/1 |
# 8 kHz 单声道采集,保存到 /sd_card/ai.pcm
./sample_audio_ai 0 0 0 8000 8000 1 0 /sd_card/ai.pcm 0
# 16 kHz 单声道采集,启用 VQE
./sample_audio_ai 0 0 0 16000 16000 1 0 /sd_card/ai.pcm 1
程序运行后会打印以下信息:
audio ai sample running
ai dev: 0
samplerate: 8000
channels: 1
...
recording to /sd_card/ai.pcm
采集过程中会持续打印帧计数,按 Ctrl+C 停止采集。
sample_audio_ao 演示了音频播放功能,从 PCM 文件读取音频数据并通过喇叭播放。
./sample_audio_ao [infile] [dev] [dev_rate] [dev_chn] [frm_rate] [frm_chn] [mode] [pcm_sample] [vqe]
参数说明:
| 参数 | 说明 | 取值 |
|---|---|---|
infile |
输入 PCM 文件路径 | /sd_card/in.pcm |
dev |
音频设备号 | 0/1 |
dev_rate |
设备采样率 | 8000/16000/32000/44100/48000 |
dev_chn |
设备声道数 | 1/2 |
frm_rate |
帧采样率 | 8000/16000/32000/44100/48000 |
frm_chn |
帧声道数 | 1/2 |
mode |
播放模式 | 0/1 |
pcm_sample |
PCM 采样位深 | 16 |
vqe |
音频质量增强 | 0/1 |
# 8 kHz 单声道播放
./sample_audio_ao /sd_card/in.pcm 0 8000 1 30 0 0 16 0
# 16 kHz 单声道播放,启用 VQE
./sample_audio_ao /sd_card/in.pcm 0 16000 1 30 0 0 16 1
程序运行后会打印以下信息:
audio ao sample running
ao dev: 0
samplerate: 8000
channels: 1
...
playing /sd_card/in.pcm
播放过程中会持续打印帧计数,播放完成后自动退出。
功能:将 PCM 文件编码为 G711/AAC 格式。
命令格式:
./sample_audio_encoder [infile_samplerate] [infile_channels] [infile] [outfile]
典型用法:
# 编码为 G711
./sample_audio_encoder 8000 1 /sd_card/in.pcm /sd_card/out.g711
# 编码为 AAC
./sample_audio_encoder 8000 1 /sd_card/in.pcm /sd_card/out.aac
功能:将 G711/AAC 文件解码为 PCM 格式。
命令格式:
./sample_audio_decoder [mode] [infile_samplerate] [infile]
典型用法:
# 解码 G711
./sample_audio_decoder 0 8000 /sd_card/in.g711
# 解码 AAC
./sample_audio_decoder 1 8000 /sd_card/in.aac
录音应用有三个版本,主要差异在于参数和功能:
| 版本 | 特点 |
|---|---|
sample_audio_record_v1 |
基础录音功能 |
sample_audio_record_v2 |
支持更多参数 |
sample_audio_record_v3 |
支持更多音频质量增强选项 |
# v1
./sample_audio_record_v1 [samplerate] [usr_samplerate] [binder_mode] [codec_input_vol] [outfile] [vqe_type]
# v2
./sample_audio_record_v2 [samplerate] [usr_samplerate] [binder_mode] [codec_input_vol] [outfile] [vqe_type] [aec_mode]
# v3
./sample_audio_record_v3 [samplerate] [usr_samplerate] [binder_mode] [codec_input_vol] [outfile] [vqe_type] [aec_mode] [agc_mode]
# 基础录音
./sample_audio_record_v1 8000 8000 0 0 /sd_card/rec.pcm 0
# 启用 VQE 和 AEC 的录音
./sample_audio_record_v2 16000 16000 0 0 /sd_card/rec.pcm 1 1
sample_audio_doubletalk_v1/v2 演示了双讲功能,即同时进行音频采集和播放,并启用 AEC(回声消除)。
./sample_audio_doubletalk_v1 [samplerate] [usr_samplerate] [channels] [binder_mode] [outfile] [infile] [infile_samplerate]
# 双讲测试
./sample_audio_doubletalk_v1 8000 8000 1 0 /sd_card/out.pcm /sd_card/in.pcm 8000
程序同时进行采集和播放,AEC 算法会消除回声,保证双向通话质量。
VQE(Voice Quality Enhancement)提供以下功能:
| 功能 | 说明 |
|---|---|
| ANR | 自适应噪声抑制 |
| AGC | 自动增益控制 |
| AEC | 声学回声消除 |
| EQ | 均衡器 |
在命令中将 vqe_type 参数设为 1 即可启用 VQE:
./sample_audio_ai 0 0 0 8000 8000 1 0 /sd_card/ai.pcm 1
// 步骤 1:初始化 AI 模块
xmedia_ai_set_dev_attr(dev, &attr);
xmedia_ai_enable(dev);
// 步骤 2:获取音频帧
xmedia_ai_get_frame(dev, &frame, timeout);
// 步骤 3:处理音频帧
// ... 写入文件或送编码器 ...
// 步骤 4:释放音频帧
xmedia_ai_release_frame(dev, &frame);
// 步骤 5:禁用 AI 模块
xmedia_ai_disable(dev);
// 步骤 1:初始化 AO 模块
xmedia_ao_set_dev_attr(dev, &attr);
xmedia_ao_enable(dev);
// 步骤 2:发送音频帧
xmedia_ao_send_frame(dev, &frame, timeout);
// 步骤 3:禁用 AO 模块
xmedia_ao_disable(dev);
// 编码
xmedia_acodec_create_encoder(&chn, &type);
xmedia_acodec_send_frame(chn, &pcm_frame);
xmedia_acodec_get_stream(chn, &encoded_stream);
// 解码
xmedia_acodec_create_decoder(&chn, &type);
xmedia_acodec_send_stream(chn, &encoded_stream);
xmedia_acodec_get_frame(chn, &pcm_frame);
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 无声音输出 | 喇叭未连接或音量过低 | 检查硬件连接,调节音量 |
| 采集无数据 | 麦克风未连接 | 检查硬件连接 |
| 声音失真 | 采样率不匹配 | 检查采样率设置 |
| 回声严重 | AEC 未启用 | 启用 VQE 和 AEC |
| 编解码失败 | 编码格式不支持 | 检查编码格式是否支持 |