ESP-ADF asr例子只能识别唤醒词而不能识别其他命令

一直在留意关于离线式语音识别的新方案,一次偶然的机会发现esp出了ASR的架构就忍不住想要测试它的效果到底如何。在某宝上买了块安信可的ESP32-A1S AudioKit,然后ESP-ADF开发环境搭建,最终成功烧录到了开发板。开始测试了。。。可是死活只能识别“HI乐鑫”的唤醒词,默认添加的如“打开空调”等命令词怎么都不能识别。
一开始一直认为是配置问题,make menuconfig各种操作,因为我想官方给的例子怎么会不行呢?Read me写的很清楚呀,唤醒后就可以识别“打开空调”,”打开电灯“的命令呀。然后各种搜索,最终决定静下心来看乐鑫官网的资料。终于功夫不负有心人,唤醒词和命令词不是用的同一个模型。ASR的例子只是实现了wakenet唤醒词模型,multinet才是实现其他命令的模型。
找到问题就加上这些个代码。最终实现了一个语音识别控制的蓝牙播放器的程序。连上手机后播放音乐,然后可以实现“上一曲”,“下一曲”,“音量加”,“音量减”语音控制。核心代码如下:

raw_stream_read(raw_read, (char *)buff_for_asr, audio_chunksize * sizeof(short));
	if(wakeUpFlag){//other commands
		wakeUpTimeCount++;
		if(wakeUpTimeCount >= chunk_num){
			wakeUpTimeCount = 0;
			wakeUpFlag = false;
			ESP_LOGI(TAG, "Sleep again!");
		}

		command_id = multinet->detect(model_data_mn, buff_for_asr);
		if(command_id > -1) {
			switch(command_id){
			case 0:
				ESP_LOGI(TAG, "Turn on air conditioner!");
				break;
			case 1:
				ESP_LOGI(TAG, "Turn off air conditioner!");
				break;
			case 17:
				ESP_LOGI(TAG, "One hour timer!");
				break;
			case 18:
				ESP_LOGI(TAG, "Turn on the light!");
				break;

			case 20:
				periph_bluetooth_prev(bt_periph);
				ESP_LOGI(TAG, "[ * ] Play preview...");
				break;
			case 21:
				periph_bluetooth_next(bt_periph);
				ESP_LOGI(TAG, "[ * ] Play next...");
				break;
			case 22:
				playVolume+=10;
				if(playVolume>100){
					playVolume=100;
				}
				audio_hal_set_volume(board_handle->audio_hal, playVolume);
				ESP_LOGI(TAG, "[ * ] Volume set to %d %%", playVolume);
				break;
			case 23:
				if(playVolume>=10){
					playVolume-=10;
				}else{
					playVolume=0;
				}
				audio_hal_set_volume(board_handle->audio_hal, playVolume);
				ESP_LOGI(TAG, "[ * ] Volume set to %d %%", playVolume);
				break;
			case 24:
				ESP_LOGI(TAG, "[ * ] Pause [Set] touch tap event");
				periph_bluetooth_pause(bt_periph);
				break;

			case 25:
				ESP_LOGI(TAG, "[ * ] Play [Play] touch tap event");
				periph_bluetooth_play(bt_periph);
				break;


			default:
				ESP_LOGI(TAG, "Other command %d!",command_id);
				break;
			}
			wakeUpFlag = false;
			wakeUpTimeCount = 0;
			ESP_LOGI(TAG, "Sleep again!");
		}
	}else{//wake up
		command_id = wakenet->detect(model_data, buff_for_asr);
		if(command_id == 1){
			wakeUpFlag = true;
			wakeUpTimeCount = 0;
			ESP_LOGI(TAG, "Wake up!");
		}
	}//wake up

源码已上传。
https://download.csdn.net/download/m0_46660895/12272858

你可能感兴趣的:(ESP-ADF asr例子只能识别唤醒词而不能识别其他命令)