本章节讲解如何上手鼾声检测
示例代码的关键业务流程与二次开发所需的关键接口,由于本示例包含了对CSK6 NPU的使用,因此可以参考本示例来实现其它模型尤其是声音类模型的推理。
鼾声检测 示例工程包含在 语音视觉大模型AI开发板 SDK 的 apps
目录下,工程目录名称为 snoring_net
。
thinker_service_gcs_init (初始化服务)
↓
thinker_service_gcs_start (载入模型并申请资源)
↓
循环 {
thinker_service_gcs_forward (向引擎传入数据,推理,并得到结果)
}
↓
thinker_service_gcs_stop (释放资源、卸载模型)
↓
thinker_service_gcs_deinit (逆初始化服务)
通过 AudioRecord 组件录音的示例如下:
/* 初始化核间通讯组件 */
lsf_init();
lsf_connect();
/* 初始化音频子系统 */
AudioSystem_initialize();
/* 配置麦克风模拟增益为 6dB,数字增益为 20dB */
String8 param;
String8_ctor_char(¶m, "ADC_PDM_GAIN_A_LEFT=6;"
"ADC_PDM_GAIN_D_LEFT=20");
ret = AudioSystem_setParameters(0, ¶m);
String8_dtor(¶m);
/* 创建一个 16kHz 采样、16-bit 深度、单声道的录音对象 */
AudioRecord_ctor(&record, 0, 16000, PCM_16_BIT, CHANNEL_IN_MONO, 160, NULL);
/* 开始录音 */
AudioRecord_start(&record);
/* 读取 32768 字节的数据到 input 中 */
AudioRecord_read(&record, input, 32768);
模型文件位于 resources/images/model.bin
,它是使用 Linger 导出的。你可以将它替换为你自己的模型。替换后,你还需要修改 boards/csk6_duomotai_devkit.overlay
中定义的模型文件长度(字节数):
res_thinker_model_partition: partition@300000 {
label = "thinker_model";
reg = <0x00300000 862272>; /* 862272 是模型的长度(字节) */
};
在调用 thinker_service_gcs_start()
后,模型会在 CP 侧被自动载入到 Thinker 引擎。
服务的标准输入和输出数据类型为 tData
。服务提供了一个 thinker_service_gcs_forward(inputs, input_cnt, *outputs, *output_cnt)
接口,可以传入一个或同时传入多个 input,等待引擎推理,并返回一个或多个 output。
tData input;
input.dtype_ = Int8;
input.scale_ = 6;
input.shape_.ndim_ = 4;
input.shape_.dims_[0] = 1;
input.shape_.dims_[1] = 1;
input.shape_.dims_[2] = num_features;
input.shape_.dims_[3] = num_bins;
input.dptr_ = features;
uint32_t input_cnt = 1;
tData *output;
uint32_t output_cnt;
thinker_service_gcs_forward(&input, input_cnt, &output, &output_cnt);
// output_cnt 会被赋值为模型的 output 数,output 即为该次推理的结果
本示例所用 snoring_net 模型会输出 1 个大小为 1×2 的 output,两个数值根据 scale 从 int8 转换为 float 后可得到「不是鼾声」和「是鼾声」的概率(它们的和总是 1.0
)。