add speech recognition english examples.

This commit is contained in:
Bigbits
2019-05-15 14:16:15 +08:00
parent 4c78275e85
commit 4a56110cc8
6 changed files with 1408 additions and 23 deletions

View File

@@ -0,0 +1,71 @@
#include "Maix_Speech_Recognition.h"
#include "voice_model.h"
SpeechRecognizer rec;
void setup()
{
pinMode(LED_RED, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
rec.begin();
Serial.begin(115200);
Serial.println("init model...");
rec.addVoiceModel(0, 0, red_0, fram_num_red_0);
rec.addVoiceModel(0, 1, red_1, fram_num_red_1);
rec.addVoiceModel(0, 2, red_2, fram_num_red_2);
rec.addVoiceModel(0, 3, red_3, fram_num_red_3);
rec.addVoiceModel(1, 0, green_0, fram_num_green_0);
rec.addVoiceModel(1, 1, green_1, fram_num_green_1);
rec.addVoiceModel(1, 2, green_2, fram_num_green_2);
rec.addVoiceModel(1, 3, green_3, fram_num_green_3);
rec.addVoiceModel(2, 0, blue_0, fram_num_blue_0);
rec.addVoiceModel(2, 1, blue_1, fram_num_blue_1);
rec.addVoiceModel(2, 2, blue_2, fram_num_blue_2);
rec.addVoiceModel(2, 3, blue_3, fram_num_blue_3);
rec.addVoiceModel(3, 0, turnoff_0, fram_num_turnoff_0);
rec.addVoiceModel(3, 1, turnoff_1, fram_num_turnoff_1);
rec.addVoiceModel(3, 2, turnoff_2, fram_num_turnoff_2);
rec.addVoiceModel(3, 3, turnoff_3, fram_num_turnoff_3);
Serial.println("init model ok!");
}
void loop()
{
int res;
res = rec.recognize();
Serial.printf("res : %d ", res);
if (res > 0){
switch (res)
{
case 1:
digitalWrite(LED_RED, LOW); //power on red led
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH);
Serial.println("rec : red ");
break;
case 2:
digitalWrite(LED_GREEN, LOW); //power on green led
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_BLUE, HIGH);
Serial.println("rec : green ");
break;
case 3:
digitalWrite(LED_BLUE, LOW); //power on blue led
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, HIGH);
Serial.println("rec : blue ");
break;
case 4:
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH); //power off all leds
Serial.println("rec : turnoff ");
default:
break;
}
}else
{
Serial.println("recognize failed.");
}
delay(1000);
}

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,7 @@
#include "util/flash.h"
#include "util/ADC.h"
#define USART1_printf printf
#define USART1_printf Serial.printf
uint16_t VcBuf[atap_len];
atap_tag atap_arg;
@@ -118,6 +118,7 @@ SpeechRecognizer::begin()
int
SpeechRecognizer::record(uint8_t keyword_num, uint8_t model_num)
{
Serial.printf("debug: in record\n");
if (keyword_num > 10) return -1;
if (model_num > 4) return -2;
@@ -144,7 +145,6 @@ SpeechRecognizer::recognize()
{
u8 res;
u32 dis;
u32 recg_count = 0;
g_index = 0;
i2s_rec_flag = 0;
@@ -171,14 +171,14 @@ SpeechRecognizer::addVoiceModel(uint8_t keyword_num, uint8_t model_num, const in
int
SpeechRecognizer::print_model(uint8_t keyword_num, uint8_t model_num)
{
printf("frm_num=%d\n", ftr_save[keyword_num*4 + model_num].frm_num);
Serial.printf("frm_num=%d\n", ftr_save[keyword_num*4 + model_num].frm_num);
for (int i = 0; i < (vv_frm_max * mfcc_num); i++) {
if (((i + 1) % 35) == 0)
printf("%d,\n", ftr_save[keyword_num*4 + model_num].mfcc_dat[i]);
Serial.printf("%d,\n", ftr_save[keyword_num*4 + model_num].mfcc_dat[i]);
else
printf("%d, ", ftr_save[keyword_num*4 + model_num].mfcc_dat[i]);
Serial.printf("%d, ", ftr_save[keyword_num*4 + model_num].mfcc_dat[i]);
}
printf("\nprint model ok!\n");
Serial.printf("\nprint model ok!\n");
return 0;
}
@@ -186,7 +186,7 @@ uint8_t SpeechRecognizer::save_mdl(uint16_t *v_dat, uint32_t addr)
{
u16 i, num;
u16 frame_index;
Serial.printf("debug: in save_mdl\n");
get_noise1:
frame_index = 0;
num = atap_len / frame_mov;
@@ -207,13 +207,13 @@ get_noise1:
break;
}
// for(i = 0; i < atap_len; i++)
// printf("noise: %d\n", v_dat[i]);
// Serial.printf("noise: %d\n", v_dat[i]);
noise_atap(v_dat, atap_len, &atap_arg);
if (atap_arg.s_thl > 10000) {
printf("get noise again...\n");
Serial.printf("get noise again...\n");
goto get_noise1;
}
printf("speeking...\n");
Serial.printf("speeking...\n");
//wait for finish
while (i2s_rec_flag == 0)
continue;
@@ -246,13 +246,13 @@ get_noise1:
return MFCC_fail;
}
// if (valid_voice[0].end == ((void *)0)) {
// printf("VAD_fail\n");
// Serial.printf("VAD_fail\n");
// return VAD_fail;
// }
get_mfcc(&(valid_voice[0]), &ftr, &atap_arg);
if (ftr.frm_num == 0) {
//printf("MFCC_fail\n");
//Serial.printf("MFCC_fail\n");
return MFCC_fail;
}
// ftr.word_num = valid_voice[0].word_num;
@@ -295,11 +295,11 @@ get_noise2:
}
noise_atap(v_dat, atap_len, &atap_arg);
if (atap_arg.s_thl > 10000) {
printf("get noise again...\n");
Serial.printf("get noise again...\n");
goto get_noise2;
}
printf("speeking...\n");
Serial.printf("speeking...\n");
//wait for finish
while (i2s_rec_flag == 0)
@@ -331,11 +331,11 @@ get_noise2:
break;
if (receive_char == 's') {
*mtch_dis = dis_err;
printf("send 'c' to start\n");
Serial.printf("send 'c' to start\n");
return 0;
}
}
printf("vad ok\n");
Serial.printf("vad ok\n");
// if (valid_voice[0].end == ((void *)0)) {
// *mtch_dis=dis_err;
// USART1_printf("VAD fail ");
@@ -345,16 +345,16 @@ get_noise2:
get_mfcc(&(valid_voice[0]), &ftr, &atap_arg);
if (ftr.frm_num == 0) {
*mtch_dis = dis_err;
USART1_printf("MFCC fail ");
Serial.printf("MFCC fail ");
return 0;
}
// for (i = 0; i < ftr.frm_num * mfcc_num; i++) {
// if (i % 12 == 0)
// printf("\n");
// printf("%d ", ftr.mfcc_dat[i]);
// Serial.printf("\n");
// Serial.printf("%d ", ftr.mfcc_dat[i]);
// }
// ftr.word_num = valid_voice[0].word_num;
printf("mfcc ok\n");
Serial.printf("mfcc ok\n");
i = 0;
min_comm = 0;
min_dis = dis_max;
@@ -364,8 +364,8 @@ get_noise2:
ftr_mdl = (v_ftr_tag *)(&ftr_save[ftr_addr / size_per_ftr]);
cur_dis = ((ftr_mdl->save_sign) == save_mask) ? dtw(ftr_mdl, &ftr) : dis_err;
if ((ftr_mdl->save_sign) == save_mask) {
USART1_printf("no. %d, frm_num = %d, save_mask=%d", i + 1, ftr_mdl->frm_num, ftr_mdl->save_sign);
USART1_printf("cur_dis=%d\n", cur_dis);
Serial.printf("no. %d, frm_num = %d, save_mask=%d", i + 1, ftr_mdl->frm_num, ftr_mdl->save_sign);
Serial.printf("cur_dis=%d\n", cur_dis);
}
if (cur_dis < min_dis) {
min_dis = cur_dis;
@@ -374,7 +374,7 @@ get_noise2:
i++;
}
cycle1 = read_csr(mcycle) - cycle0;
printf("[INFO] recg cycle = 0x%08x\n", cycle1);
Serial.printf("[INFO] recg cycle = 0x%08x\n", cycle1);
if (min_comm % 4)
min_comm = min_comm / ftr_per_comm + 1;
else

View File

@@ -1,6 +1,7 @@
#ifndef __MAIX_SPEECH_RECOGNITION_H
#define __MAIX_SPEECH_RECOGNITION_H
#include "Arduino.h"
#include <stdint.h>
#include <stdlib.h>