录音机

简介

SPV1x的录音库,提供音频录制和压缩存储功能。该录音库有如下特性:

  1. 音频采样率支持16KHz和24KHz。

  2. 使用MP3编码器压缩音频,压缩后的音频码率支持8kbps、16kbps、24kbps、32kbps、40kbps、48kbps、56kbps、64kbps。

  3. 向应用提供回调函数接口:录音开始回调、录音结束回调、帧采集完成回调、VAD计算完成回调。

  4. 提供音频回溯功能,在16kbps码率下,最长支持1秒的音频回溯。

相关的数据结构说明

enum recorder_lowpass_t

不同码率下,低通滤波器截止频率配置。

  • Recommended_Lowpass_for_8kbps: 配置8kbps下,低通滤波器的截止频率。

  • Recommended_Lowpass_for_16kbps: 配置16kbps下,低通滤波器的截止频率。

  • Recommended_Lowpass_for_24bps: 配置24kbps下,低通滤波器的截止频率。

  • Recommended_Lowpass_for_32kbps: 配置32kbps下,低通滤波器的截止频率。

  • Recommended_Lowpass_for_40kbps: 配置40kbps下,低通滤波器的截止频率。

  • Recommended_Lowpass_for_48kbps: 配置48kbps下,低通滤波器的截止频率。

  • Recommended_Lowpass_for_56kbps: 配置56kbps下,低通滤波器的截止频率。

  • Recommended_Lowpass_for_64kbps: 配置64kbps下,低通滤波器的截止频率。

enum recorder_sample_rate_t

录音的音频采样率选择。

  • Sample_Rate_16khz: 选择16KHz采样率。

  • Sample_Rate_24khz: 选择24KHz采样率。

enum recorder_bitrate_t

录音编码后的码率选择。

  • Bitrate_8Kbps: 选择8kbps码率,1秒钟的录音将占用1KB flash空间。

  • Bitrate_16Kbps: 选择16kbps码率,1秒钟的录音将占用2KB flash空间。

  • Bitrate_24Kbps: 选择24kbps码率,1秒钟的录音将占用3KB flash空间。

  • Bitrate_32Kbps: 选择32kbps码率,1秒钟的录音将占用4KB flash空间。

  • Bitrate_40Kbps: 选择40kbps码率,1秒钟的录音将占用5KB flash空间。

  • Bitrate_48Kbps: 选择48kbps码率,1秒钟的录音将占用6KB flash空间。

  • Bitrate_56Kbps: 选择56kbps码率,1秒钟的录音将占用7KB flash空间。

  • Bitrate_64Kbps: 选择64kbps码率,1秒钟的录音将占用8KB flash空间。

struct recorder_init_parameter_t

录音初始化参数结构体。

uint32_t flash_addr

录音数据在flash中的起始地址。

uint32_t flash_size

录音数据最大可占用的flash空间。

recorder_bitrate_t bitrate_kbps

录音码率选择。

recorder_sample_rate_t sample_rate

录音采样率选择。

recorder_lowpass_t lowpass

录音低通滤波器截止频率选择。

uint32_t mic_single_end : 1

mic_single_end : flags结构体成员。为0选择差分麦克风模式。为1选择单端麦克风模式。

API说明

uint32_t recorder_init(recorder_init_parameter_t *recorder_init_parameter)

录音库初始化。

参数
  • recorder_init_parameter – 录音初始化参数结构体 。。

返回

录音库占用的SRAM大小(字节数),该值用于评估项目内存使用情况。

void recorder_set_start_hook(void (*start)(void))

设置录音开始回调函数。

参数
  • start – 录音开始回调函数指针。

返回

Note

用户调用 recorder_start() 后,录音并不是立即开始。因此录音开始回调函数的执行会相对 recorder_start() 有一定的延迟。

void recorder_set_stop_hook(void (*stop)(void))

设置录音结束回调函数。

参数
  • stop – 录音结束回调函数指针。

返回

Note

用户调用 recorder_stop() 后,录音并不是立即结束。因此录音结束回调函数的执行会相对 recorder_stop() 有一定的延迟。

void recorder_set_vad_hook(void (*vad)(uint32_t *energy, uint32_t len))

设置VAD计算完成回调函数。

参数
  • vad – VAD计算完成回调函数指针。该回调函数带2个形参,energy指向音频能量值数组,len表示音频能量值数组的长度。

返回

void recorder_set_frame_hook(void (*frame)(int16_t *pcm, uint32_t len))

设置帧采集完成回调函数。

参数
  • frame – 帧采集完成回调函数指针。该回调函数第一个参数为当前帧PCM数据的内存地址,第二个参数为PCM数据的长度(采样点数目)。

返回

void recorder_deinit(void)

录音库去初始化。

返回

void recorder_start(uint32_t pre_time_ms)

请求开始录音。

参数
  • pre_time_ms – 录音需要回溯的时间,0ms ≤ pre_time_ms ≤ 1000ms。

返回

Note

录音库在初始化后就开始缓存音频数据,在16kbps码率下,最多缓存1秒的音频,码率增大时,缓存的时间会线性缩短。如果在初始化录音库后立即开始录音,则没有音频数据可以回溯。

void recorder_stop(void)

请求停止录音。

返回

录音数据在flash中的存放

../../_images/recorder_data_area.png
  1. 录用功能使用的flash区域由调用 recorder_init() 时,传入的recorder_init_parameter中的参数 flash_addrflash_size 决定。

  2. flash区域的第一个word(0~4字节,小端格式)保存着实际录音数据的长度信息。

  3. flash区域的第二个word(4~8字节,小端格式)保存着 RECORDER_MAGIC 常数,其值为0x00444352。该值用于确定flash区域是否存在有效的录音数据。

  4. 从第9字节开始,用于存放MP3编码后的录音数据。

录音库使用方法

  1. 确认ADC和麦克风引脚已初始化就绪。ADC和麦克风引脚的初始化见本章注意事项。

  2. 调用 recorder_init() 初始化录音功能需要用到的资源,并传入用于保存录音数据的flash区域参数以及码率。

  3. 根据需求,设置对应的回调函数。未设置的回调函数默认为NULL,录音库会跳过对NULL回调函数的调用。

  4. 调用 recorder_start() 开始录音:SPV1x对ADC采集的音频数据进行编码压缩,然后写入flash。 当指定长度的flash空间用尽后,SPV1x自动停止录音。

  5. 用户也可以根据场景需求,主动调用 recorder_stop() 手动停止录音。

  6. 如果需要进行VAD录音,用户可以在VAD回调函数中对音频帧的能量参数进行判断,并决定是否调用 recorder_start() 启动录音或者调用 recorder_stop() 停止录音。

  7. 调用 recorder_deinit() 去初始化:释放录音功能需要用到的资源,结束录音机场景。

注意事项

  1. 录音功能需要配合SPV1x的 事件驱动型用户程序框架 使用。

  2. 录音功能用会用到一些外设资源,用户应避免这些资源的使用,以免因为资源冲突导致录音功能无法正常工作。录音用到外设资源如下:

  1. ADC:采集音频数据。

  2. DMA:通道3,录音过程中音频数据的搬运。

  3. 软件中断(MSIP):音频数据的编码和其他处理。

  4. SPI0:操作flash进行录音数据的保存。

  5. GPIO10~13:作为SPI0的功能引脚。

  1. 录音开始回调、录音结束回调、帧采集完成回调、VAD计算完成回调都在中断函数中调用,因此回调函数的内容需要简短。

  2. flash的擦写时间对录音功能影响较大,普冉flash的擦除时间比较能满足录音功能的需求。

  3. 使用录音功能前,需要先调用 adc_sys_init() 初始化ADC,以及调用 adc_diff_mic_pin_init() (差分麦克风接线方式)或调用 adc_single_end_mic_pin_init() (单端麦克风接线方式)设置麦克风相关引脚的复用功能。 麦克风相关引脚首次初始化后,其引脚连接的相关电容需要一定的时间(约300~500ms)进行充电并稳定。因此在应用中,建议麦克风引脚初始化后,就一直保持其为初始化后的状态,不再对其进行去初始化。