9.14. 语音活动检测(VAD)
概述
提供语音活动检测的配置和使用说明
9.14.1. 配置说明
进入 demo_DevKitBoard/include/app_config.h ,开启宏 CONFIG_VAD_ENC_ENABLE ,app_main.c任务列表需要增加vad_encoder任务,否则会打开失败
union audio_req req = {0};
req.enc.channel_bit_map = BIT(CONFIG_AUDIO_ADC_CHANNEL_L);
req.enc.frame_size = sample_rate / 100 * 4 * channel;
req.enc.output_buf_len = req.enc.frame_size * 3;
req.enc.cmd = AUDIO_ENC_OPEN;
req.enc.channel = channel;
req.enc.volume = __this->gain;
req.enc.sample_rate = sample_rate;
req.enc.format = "pcm";
req.enc.sample_source = "mic";
if (channel == 1 && !strcmp(req.enc.sample_source, "mic") && (sample_rate == 8000 || sample_rate == 16000)) {
    req.enc.use_vad = 1;                    //打开VAD断句功能
    req.enc.vad_auto_refresh = 1;   //VAD自动刷新
}
if(req.enc.use_vad == 1){
    req.enc.vad_start_threshold = 0;    //ms
    req.enc.vad_stop_threshold  = 0;    //ms
}
Note
- 关于语音活动检测的配置的几个说明:
- req.enc.use_vad : 1:使用第三方VAD算法库,需要链接libvad.a库;2:使用JLVAD算法库,需要链接lib_dvad.a、libjlsp.a库。
- eq.enc.vad_auto_refresh: 1:使能VAD自动刷新,检测到语音停止后会自动刷新算法;0:关闭VAD自动刷新,语音停止后不刷新算法。
- 语音检测开始会下发AUDIO_SERVER_EVENT_SPEAK_START事件,语音检测结束会下发AUDIO_SERVER_EVENT_SPEAK_STOP。 
 
9.14.2. 常见问题
- 语音活动检测能使用多少采样率?
- VAD目前只支持采样率8000 或 16000,且输入通道数只支持1个通道。
 
- 这两个算法库算法的区别是什么,各有什么优缺点?
- 1. 第三方VAD库的灵敏度相比于JLVAD库会低一点,检测语音活动启动的时候会有一定的延时,但抗干扰会比JLVAD库强,在人多嘈杂的环境误唤醒率比JLVAD库低; 第三方库多两个参数可以设置,详情查看API注释2. JLVAD库的灵敏度相比于第三方VAD库高一点,检测语音活动启动延时低,抗干扰会弱一点,人多嘈杂环境误唤醒比第三方VAD库高。
 
9.14.3. API参考
音频编解码请求操作类型
- 
AUDIO_REQ_DEC
- 解码请求 
- 
AUDIO_REQ_ENC
- 编码请求 
- 
AUDIO_REQ_IOCTL
- 命令控制 
- 
AUDIO_DEC_OPEN
- 打开解码 
- 
AUDIO_DEC_START
- 开始解码 
- 
AUDIO_DEC_PAUSE
- 暂停解码 
- 
AUDIO_DEC_STOP
- 停止解码 
- 
AUDIO_DEC_FF
- 快进 
- 
AUDIO_DEC_FR
- 快退 
- 
AUDIO_DEC_GET_BREAKPOINT
- 获取断点数据 
- 
AUDIO_DEC_PP
- 暂停/播放 
- 
AUDIO_DEC_SET_VOLUME
- 设置解码音量 
- 
AUDIO_DEC_DIGITAL_MUTE_SET
- 设置当前解码的MUTE状态 
- 
AUDIO_DEC_PS_PARM_SET
- 设置变速变调的参数 
- 
AUDIO_DEC_GET_STATUS
- 获取当前解码器状态 
- 
AUDIO_DEC_AB_REPEAT_SET
- 设置AB点复读播放 
- 
AUDIO_DEC_AB_REPEAT_CLOSE
- 关闭AB点复读播放 
- 
AUDIO_DEC_GET_EFFECT_HANDLE
- 获取对应音效算法的句柄 
- 
AUDIO_DEC_REPEAT_SET
- 设置循环播放 
- 
AUDIO_ENC_OPEN
- 打开编码 
- 
AUDIO_ENC_START
- 开始编码 
- 
AUDIO_ENC_PAUSE
- 暂停编码 
- 
AUDIO_ENC_STOP
- 停止编码 
- 
AUDIO_ENC_CLOSE
- 关闭解码 
- 
AUDIO_ENC_SET_VOLUME
- 设置编码模拟增益 
- 
AUDIO_ENC_GET_STATUS
- 获取当前编码器状态 
- 
AUDIO_ENC_PP
- 暂停/编码 
- 
enum [anonymous]
- AB点复读设置状态 - Values: - 
enumerator AB_REPEAT_STA_NON
- 未设置AB点 
 - 
enumerator AB_REPEAT_STA_ASTA
- 已设置A点 
 - 
enumerator AB_REPEAT_STA_BSTA
- 已设置B点 
 
- 
enumerator AB_REPEAT_STA_NON
- 
enum [anonymous]
- AB点复读模式 - Values: - 
enumerator AB_REPEAT_MODE_BP_A
- 设置A点参数 
 - 
enumerator AB_REPEAT_MODE_BP_B
- 设置B点参数 
 - 
enumerator AB_REPEAT_MODE_CUR
- 设置取消AB点参数 
 
- 
enumerator AB_REPEAT_MODE_BP_A
- 
enum [anonymous]
- 解码器控制命令 - Values: - 
enumerator AUDIO_IOCTRL_CMD_SET_BREAKPOINT_A
- 设置复读A点 
 - 
enumerator AUDIO_IOCTRL_CMD_SET_BREAKPOINT_B
- 设置复读B点 
 - 
enumerator AUDIO_IOCTRL_CMD_SET_BREAKPOINT_MODE
- 设置AB点取消复读模式 
 - 
enumerator AUDIO_IOCTRL_CMD_REPEAT_PLAY
- 设置循环播放 
 - 
enumerator AUDIO_IOCTRL_CMD_SET_DEC_SR
- 设置采样率或者码率 
 - 
enumerator AUDIO_IOCTRL_CMD_SET_DEST_PLAYPOS
- 设置指定位置播放 
 - 
enumerator AUDIO_IOCTRL_CMD_GET_PLAYPOS
- 获取毫秒级时间 
 
- 
enumerator AUDIO_IOCTRL_CMD_SET_BREAKPOINT_A
Enums
- 
enum [anonymous]
- enum AUDIO_SERVER事件回调 - Values: - 
enumerator AUDIO_SERVER_EVENT_CURR_TIME
- AUDIO_SERVER编/解码当前时间 
 - 
enumerator AUDIO_SERVER_EVENT_END
- AUDIO_SERVER编/解码结束 
 - 
enumerator AUDIO_SERVER_EVENT_ERR
- AUDIO_SERVER编/解码错误 
 - 
enumerator AUDIO_SERVER_EVENT_SPEAK_START
- VAD检测到开始说话 
 - 
enumerator AUDIO_SERVER_EVENT_SPEAK_STOP
- VAD检测到停止说话 
 
- 
enumerator AUDIO_SERVER_EVENT_CURR_TIME
- 
enum [anonymous]
- 解码附加属性 - Values: - 
enumerator AUDIO_ATTR_REAL_TIME
- 保证解码的实时性,解码读数不能堵塞,仅限于蓝牙播歌时时钟同步使用 
 - 
enumerator AUDIO_ATTR_LR_SUB
- 伴奏功能,只支持双声道 
 - 
enumerator AUDIO_ATTR_PS_EN
- 变速变声功能开关 
 - 
enumerator AUDIO_ATTR_LR_ADD
- 解码器左右通道数据叠加 
 - 
enumerator AUDIO_ATTR_DECRYPT_DEC
- 文件解密播放,需要配合对应的加密工具 
 - 
enumerator AUDIO_ATTR_FADE_INOUT
- 模拟音量淡入淡出,解码开始和暂停时使用 
 - 
enumerator AUDIO_ATTR_EQ_EN
- EQ功能开关 
 - 
enumerator AUDIO_ATTR_DRC_EN
- DRC功能开关,使能时需要打开EQ功能 
 - 
enumerator AUDIO_ATTR_EQ32BIT_EN
- EQ 32bit输出 
 - 
enumerator AUDIO_ATTR_BT_AAC_EN
- 蓝牙AAC解码 
 - 
enumerator AUDIO_ATTR_DEC_MUTE_EN
- 当前解码输出mute使能 
 - 
enumerator AUDIO_ATTR_UNLIMITED_REPEAT
- 当前解码无限循环播放使能 
 - 
enumerator AUDIO_ATTR_DEC_SOLO
- 当前解码强制不走叠音流程 
 - 
enumerator AUDIO_ATTR_DIGITAL_FADE_INOUT
- 数字音量淡入淡出,解码开始时使用 
 - 
enumerator AUDIO_ATTR_SDRAM_PROMPT
- 播放存储在sdram的提示音 
 - 
enumerator AUDIO_ATTR_NO_WAIT_READY
- 当前解码开始时不需等待解码数据缓存 
 
- 
enumerator AUDIO_ATTR_REAL_TIME
- 
enum [anonymous]
- 音效附加属性 - Values: - 
enumerator AUDIO_EFFECT_SPECTRUM_FFT
- 对音频解码数据进行频谱运算 
 - 
enumerator AUDIO_EFFECT_DIGITAL_VOL
- 对音频解码数据进行数字音量调整 
 - 
enumerator AUDIO_EFFECT_VIRTUAL_BASS
- 对音频解码数据进行虚拟低音 
 
- 
enumerator AUDIO_EFFECT_SPECTRUM_FFT
- 
struct audio_cbuf_t
- #include <audio_server.h>解码虚拟输出时的cbuf读写参数结构体 Public Members - 
void *cbuf
- cbuf句柄 
 - 
void *wr_sem
- 写信号量指针 
 - 
void *rd_sem
- 读信号量指针 
 - 
volatile u16 end
- 读写结束 
 - 
volatile u8 state
- 是否正在解码状态 
 
- 
void *cbuf
- 
struct audio_dec_breakpoint
- #include <audio_server.h>解码断点播放信息结构体 Public Members - 
int len
- buf长度 
 - 
u32 fptr
- 断点位置偏移量 
 - 
u8 *data
- 断点数据指针 ape格式断点最大2036字节 
 
- 
int len
- 
struct audio_finfo
- #include <audio_server.h>获取audio解码器信息 Public Members - 
u8 channel
- 通道 
 - 
u8 name_code
- 名称编码 0:ansi, 1:unicode_le, 2:unicode_be 
 - 
int sample_rate
- 采样率 
 - 
int bit_rate
- 比特率 
 - 
int total_time
- 总时间 
 
- 
u8 channel
- 
struct audio_ioctl
- #include <audio_server.h>audio命令控制 Public Members - 
u32 cmd
- 请求操作类型 
 - 
void *priv
- 传入指针 
 
- 
u32 cmd
- 
struct audio_dest_time_play_param
- #include <audio_server.h>指定位置播放参数 Public Members - 
u32 start_time
- 要跳转过去播放的起始时间。单位:ms。设置后跳到start_time开始播放 
 - 
u32 dest_time
- 要跳转过去播放的目标时间。单位:ms。播放到dest_time后如果callback_func存在,则调用callback_func 
 - 
u32 (*callback_func)(void *priv)
- 到达目标时间后回调 
 - 
void *callback_priv
- 回调参数,可以在callback_func回调中实现对应需要的动作 
 
- 
u32 start_time
- 
struct audio_vfs_ops
- #include <audio_server.h>音频虚拟文件操作句柄 Public Members - 
void *(*fopen)(const char *path, const char *mode)
- 打开创建路径文件 
 - 
int (*fread)(void *file, void *buf, u32 len)
- 读文件 
 - 
int (*fwrite)(void *file, void *buf, u32 len)
- 写文件 
 - 
int (*fseek)(void *file, u32 offset, int seek_mode)
- 寻址文件 
 - 
int (*ftell)(void *file)
- 返回给定流stream的当前文件位置 
 - 
int (*flen)(void *file)
- 获取文件长度 
 - 
int (*fclose)(void *file)
- 关闭文件 
 
- 
void *(*fopen)(const char *path, const char *mode)
- 
struct fixphase_repair_obj
- Public Members - 
short fifo_buf[18 + 12][32][2]
- 相位修复buf 
 
- 
short fifo_buf[18 + 12][32][2]
- 
struct audio_repeat_mode_param
- Public Members - 
int flag
- 置1使能 
 - 
int headcut_frame
- 砍掉前面几帧,仅mp3格式有效 
 - 
int tailcut_frame
- 砍掉后面几帧,仅mp3格式有效 
 - 
int (*repeat_callback)(void*)
- 循环播放回调,返回0-正常循环;返回非0-结束循环 
 - 
void *callback_priv
- 回调参数指针 
 - 
struct fixphase_repair_obj *repair_buf
- 相位修复buf指针 
 
- 
int flag
- 
struct audio_dec_req
- #include <audio_server.h>解码请求参数 Public Members - 
u8 cmd
- 请求操作类型 
 - 
u8 status
- 请求后返回的解码状态 
 - 
u8 channel
- 解码通道数 
 - 
u8 volume
- 模拟音量(0-100) 
 - 
u8 digital_volume
- 数字音量初始值(0-100) 
 - 
u8 priority
- 解码优先级,暂时没用到 
 - 
u8 speedV
- >80是变快,<80是变慢,建议范围:30到130 
 - 
u16 repeat_num
- 循环播放次数 
 - 
u16 pitchV
- >32768是音调变高,<32768音调变低,建议范围20000到50000 
 - 
u16 attr
- 解码附加属性 
 - 
u16 effect
- 音效附加属性 
 - 
u32 output_buf_len
- 解码buffer大小 
 - 
u32 orig_sr
- 强制变采样前的原始采样率,当混响使能强制变采样时才使用 
 - 
u32 force_sr
- 强制变采样的目标采样率 
 - 
u32 sample_rate
- 实际的解码采样率 
 - 
u32 ff_fr_step
- 快进快退级数 
 - 
u32 total_time
- 解码的总共时长 
 - 
u32 play_time
- 断点恢复时的当前播放时间 
 - 
void *output_buf
- 解码缓存buffer,默认填NULL,由解码器自己实现分配和释放 
 - 
FILE *file
- 需要解码的文件句柄 
 - 
const char *dec_type
- 解码格式 
 - 
const char *sample_source
- 播放源,支持”dac”,”iis0”,”iis1” 
 - 
struct audio_dec_breakpoint *bp
- 断点播放信息句柄 
 - 
const struct audio_vfs_ops *vfs_ops
- 虚拟文件操作句柄 
 - 
void *eq_attr
- eq属性设置 
 - 
void *eq_hdl
- 预先申请好的的eq句柄 
 - 
struct audio_cbuf_t *virtual_audio
- 虚拟解码句柄,供外部读写使用 
 - 
int (*dec_callback)(u8 *buf, u32 len, u32 sample_rate, u8 ch_num)
- 解码后的PCM数据回调 
 - 
int (*dec_sync)(void *priv, u32 data_size, u16 *in_rate, u16 *out_rate)
- 解码对端采样率同步,常用于蓝牙解码 
 - 
void *get_hdl
- 获取私有句柄 
 - 
void *sync_priv
- 解码对端采样率同步私有指针 
 
- 
u8 cmd
- 
struct audio_enc_req
- #include <audio_server.h>编码请求参数 Public Members - 
u8 cmd
- 请求操作类型 
 - 
u8 status
- 编码器状态 
 - 
u8 channel
- 同时编码的通道数 
 - 
u8 channel_bit_map
- ADC通道选择 
 - 
u8 volume
- ADC增益(0-100),编码过程中可以通过AUDIO_ENC_SET_VOLUME动态调整增益 
 - 
u8 priority
- 编码优先级,暂时没用到 
 - 
u8 use_vad
- 0:关闭vad功能 1:使用旧vad算法 2:使用JL新vad算法 
 - 
u8 vad_auto_refresh
- 是否自动刷新VAD状态,赋值1表示SPEAK_START->SPEAK_STOP- >SPEAK_START->SPEAK_STOP->….循环 
 - 
u8 direct2dac
- AUDIO_AD直通DAC功能 
 - 
u8 high_gain
- 直通DAC时是否打开模拟增益调整 
 - 
u8 amr_src
- amr编码时的强制16k变采样为8kpcm数据,因为amr编码器暂时只支持8k编码 
 - 
u8 aec_enable
- AEC回声消除功能开关,常用于蓝牙通话 
 - 
u8 ch_data_exchange
- 用于AEC差分回采时和MIC的通道数据交换 
 - 
u8 no_header
- 用于opus编码时是否需要添加头部格式 
 - 
u8 vir_data_wait
- 虚拟编码时是否允许丢失数据 
 - 
u8 no_auto_start
- 请求AUDIO_ENC_OPEN时不自动运行编码器,需要主动调用AUDIO_ENC_START 
 - 
u8 sample_depth
- 采样深度16bit或者24bit 
 - 
u8 dns_enable
- dns降噪算法 0:不使用 1:使用 
 - 
u8 wait_sem
- 编码器数据输出时如果缓存已满即等待信号量 
 - 
u16 vad_start_threshold
- VAD连续检测到声音的阈值,表示开始说话,回调AUDIO_SERVER_EVENT_SPEAK_START,单位ms,填0使用库内默认值 
 - 
u16 vad_stop_threshold
- VAD连续检测到静音的阈值, 表示停止说话,回调AUDIO_SERVER_EVENT_SPEAK_STOP,单位ms,填0使用库内默认值 
 - 
u16 frame_size
- 编码器输出的每一帧帧长大小,只有pcm格式编码时才有效 
 - 
u16 frame_head_reserve_len
- 编码输出的帧预留头部的大小 
 - 
u32 bitrate
- 编码码率大小 
 - 
u32 delay_ms
- 当编码器读写不到数据后的延时等待 
 - 
u32 output_buf_len
- 编码buffer大小 
 - 
u32 sample_rate
- 编码采样率 
 - 
u32 msec
- 编码时长,填0表示一直编码,单位ms,编码结束会回调AUDIO_SERVER_EVENT_END消息 
 - 
FILE *file
- 编码输出文件句柄 
 - 
u8 *output_buf
- 编码buffer,默认填NULL,由编码器自动分配和释放资源 
 - 
const char *format
- 编码格式 
 - 
const char *sample_source
- 采样源,支持”mic”,”linein”,”plnk0”,”plnk1”,”virtual”,”iis0”,”iis1”,”spdif” 
 - 
const struct audio_vfs_ops *vfs_ops
- 虚拟文件操作句柄 
 - 
int (*read_input)(u8 *buf, u32 len)
- 用于虚拟采样源”virtual”编码时的数据读取操作读输入buf及其长度,返回负值自动停止编码并回调编码结束的事件 
 - 
void *aec_attr
- AEC回声消除算法配置参数 
 
- 
u8 cmd
- 
union audio_req
- #include <audio_server.h>audio服务请求参数 Public Members - 
struct audio_dec_req dec
- 解码请求 
 - 
struct audio_enc_req enc
- 编码请求 
 - 
struct audio_ioctl ioctl
- 命令控制 
 - 
struct audio_finfo info
- 音频信息 
 
- 
struct audio_dec_req dec