Bộ phận nhận lệnh bằng âm thanh giọng nói - basic

Đăng lúc: Thứ năm - 14/01/2016 09:52 - Người đăng bài viết: SuperG
Teach the voice module

Teach the voice module

Giới thiệu module cơ bản "Nhận dạng lệnh bằng âm thanh", chúng tôi sử dụng một Arduino và một số loại module nhận dạng có sẵn. Dự án này sẽ giới thiệu bạn cách sử dụng các module xử lý âm thanh cho nhận dạng lệnh bằng giọng nói.
Lưu ý: Nhận dạng âm thanh khác với nhận dạng giọng nói, nhận dạng âm thanh dưới dạng giọng nói chỉ công nhận giọng nói của một người duy nhất, trong khi nhận dạng giọng nói có thể nhận ra giọng nói của mọi người.​
Video tham khảo: https://youtu.be/yerIVabBN4g
Giới thiệu phần cứng:
- Voice recognition module V2 Hoặc EasyVR cho Arduino (có trên Ebay)
- USB to com module
- Arduino kit (bất kỳ kit nào: nano, mini...)
- Bảng test mạch
- 3 bóng Led
- Ít dây nối (đực cái..)
 
Picture of Part list
ttl_to_usb.JPG
nano.JPGbreadboard.JPGRBG-LED.jpg
Công cụ
- Serial tool (Terminal hay hercule..)
- EasyVR thư viện sẵn: here!​​
 
Voice recognition V2:
Module này có thể học lệnh bằng giọng nói 3x5 nhóm. (3 nhóm, mỗi nhóm 5 lệnh, tối đa 1.300ms)
Để dạy, chúng ta cần một công cụ nối tiếp Serial: 
- Bắt đầu chương trình, cắm vào mô-đun với PC qua USB
- Config serial tool:
Baudrate: 9600
Parity bit: NONE
Bit dữ liệu: 8
Stop bit: 1
Gởi định dạng: HEX
Nhận dạng: Char
 
Các thiết lập khác:
- Đầu tiên, chúng ta cần phải chọn chế độ "common" hoặc "compact". VD này chọn Common mode.
- Gửi "0x36" cho kit: Nhập sau "00000000" AA36, và bấm vào "Send".
Nếu ok bạn có thể thấy thông báo "common mode".
Các modul đã sẵn sàng để học lệnh.
- Để dạy các lệnh, gửi "0x11" đến module. (ghi lại cho nhóm đầu tiên).
Nhập "00000000" aa11, và bấm "Send".
- Sau khi xuất hiện "START" thì bắt đầu đọc, lặp lại nếu vẫn hiện Start.
"Finish one" là đã xong, bạn nhập tiếp 4 lệnh khác tương tự.
"Group 1 finished" có nghĩa kết thúc nhóm 1, ngắt kết nối module.
Picture of Teach the voice module
acc1.png
acc2.png
EasyVR:

EasyVR-Arduino shield: here!
Hoặc EasyVR: here!

Picture of EasyVR Library

Arduino code

- Led cắm chân 9,10,11. (nhớ thêm trở)
- Kết nối modul:
  VCC to 5V
  GND to GND
  Rx vào Tx
  Tx vào Rx​
Code tham khảo:

int redPin = 9; 
int greenPin = 10;

int bluePin = 11; byte

com = 0; //reply from voice recognition

void setup() { Serial.begin(9600);

pinMode(redPin, OUTPUT);

pinMode(greenPin, OUTPUT);

pinMode(bluePin, OUTPUT);

delay(2000);

Serial.write(0xAA);

Serial.write(0x37);

delay(1000);

Serial.write(0xAA);

Serial.write(0x21);

}

void loop()

{

while(Serial.available())

{

com = Serial.read();

switch(com)

{

case 0x11:

digitalWrite(redPin, HIGH);

break;

case 0x12:

digitalWrite(greenPin, HIGH);

break;

case 0x13:

digitalWrite(bluePin, HIGH);

break;

case 0x14:

digitalWrite(redPin, HIGH);

digitalWrite(greenPin, HIGH);

digitalWrite(bluePin, HIGH);

break;

case 0x15:

digitalWrite(redPin, LOW);

digitalWrite(greenPin, LOW);

digitalWrite(bluePin, LOW);

break;

}

}

}
Tham khảo thêm:

 

 

easyvr-connection

Uart-easyvr

Giao tiếp UART. 

*detect()— checks if the EasyVr is connected
*setLanguage()— Sets input language, 0 default for English
*setTimeout()— Sets timeout for voice input
*recognizeCommand()— Pass group number of your command set and wait till recognised
*hasFinished()— Waits till the recognition is done, also gives out recognised value in variable _value
*getCommand()— retrieves the result from above function

EasyVR library cho dòng Atmega

#define CMD_BREAK       'b' // abort recog or ping#define CMD_SLEEP       's' // go to power down#define CMD_KNOB        'k' // set si knob #define CMD_LEVEL       'v' // set sd level #define CMD_LANGUAGE    'l' // set si language #define CMD_TIMEOUT     'o' // set timeout #define CMD_RECOG_SI    'i' // do si recog from ws #define CMD_TRAIN_SD    't' // train sd command at group  pos #define CMD_GROUP_SD    'g' // insert new command at group  pos #define CMD_UNGROUP_SD  'u' // remove command at group  pos #define CMD_RECOG_SD    'd' // do sd recog at group  (0 = trigger mixed si/sd)#define CMD_ERASE_SD    'e' // reset command at group  pos #define CMD_NAME_SD     'n' // label command at group  pos  with length  name #define CMD_COUNT_SD    'c' // get command count for group #define CMD_DUMP_SD     'p' // read command data at group  pos #define CMD_MASK_SD     'm' // get active group mask#define CMD_RESETALL    'r' // reset all commands and groups#define CMD_ID          'x' // get version id#define CMD_DELAY       'y' // set transmit delay  (log scale)#define CMD_BAUDRATE    'a' // set baudrate  (bit time, 1=>115200)#define CMD_QUERY_IO    'q' // configure, read or write I/O pin  of type #define CMD_PLAY_SX     'w' // wave table entry  (10-bit) playback at volume #define CMD_PLAY_DTMF   'w' // play (=-1) dial tone  for duration #define CMD_DUMP_SX     'h' // dump wave table entries#define CMD_DUMP_SI     'z' // dump si settings for ws  (or total ws count if -1)#define CMD_SEND_SN     'j' // send sonicnet token with bits  index  at time #define CMD_RECV_SN     'f' // receive sonicnet token with bits  rejection  timeout #define STS_MASK        'k' // mask of active groups #define STS_COUNT       'c' // count of commands  (or number of ws )#define STS_AWAKEN      'w' // back from power down mode#define STS_DATA        'd' // provide training , conflict , command label  (counted string)#define STS_ERROR       'e' // signal error code #define STS_INVALID     'v' // invalid command or argument#define STS_TIMEOUT     't' // timeout expired#define STS_INTERR      'i' // back from aborted recognition (see 'break')#define STS_SUCCESS     'o' // no errors status#define STS_RESULT      'r' // recognised sd command  - training similar to sd #define STS_SIMILAR     's' // recognised si  (in mixed si/sd) - training similar to si #define STS_OUT_OF_MEM  'm' // no more available commands (see 'group')#define STS_ID          'x' // provide version id #define STS_PIN         'p' // return pin state #define STS_TABLE_SX    'h' // table entries count  (10-bit), table name  (counted string)#define STS_GRAMMAR     'z' // si grammar: flags , word count , labels...  (n counted strings)#define STS_TOKEN       'f' // received sonicnet token // protocol arguments are in the range 0x40 (-1) to 0x60 (+31) inclusive#define ARG_MIN     0x40#define ARG_MAX     0x60#define ARG_ZERO    0x41#define ARG_ACK     0x20    // to read more status arguments#define DEF_TIMEOUT 100#define WAKE_TIMEOUT 200#define PLAY_TIMEOUT 5000#define NO_TIMEOUT 0      uint8_t _command = 1;      uint8_t _builtin = 1;      uint8_t _error = 1;      uint8_t _timeout = 1;      uint8_t _invalid = 1;      uint8_t _memfull = 1;      uint8_t _conflict = 1;      uint8_t _token = 1;   uint8_t _status = 1;        uint8_t _value , idx;  int isTimeout() { return _timeout; }void send(uint8_t c){  _delay_ms(1);  write(c);}void sendCmd(int8_t c){ _delay_ms(1); write(c);}void sendArg(int8_t c){  send(c + ARG_ZERO);}void sendGroup(int8_t c){  _delay_ms(1);  write(c + ARG_ZERO);  _delay_ms(19); // worst case time to cache a full group in memory}int recv(int16_t timeout) // negative means forever{  while (timeout != 0)  {    _delay_ms(1);    if (timeout > 0)      --timeout;  }  return read();}int recvArg(int8_t c, int16_t timeout){  send(ARG_ACK);  int r = recv(timeout);  c = r - ARG_ZERO;  return r >= ARG_MIN && r <= ARG_MAX;}/** Detects the connection is established or not**/int detect(){  uint8_t i;  for (i = 0; i < 5; ++i)  {    sendCmd(CMD_BREAK);    if (recv(WAKE_TIMEOUT) == STS_SUCCESS)      return 1;  }  return 0;}int stop(){  sendCmd(CMD_BREAK);  uint8_t rx = recv(WAKE_TIMEOUT);  if (rx == STS_INTERR || rx == STS_SUCCESS)    return 1;  return 0;}/** Sets Language for Recognition -- default 0 for English**/int setLanguage(int8_t lang){          sendCmd(CMD_LANGUAGE);  sendArg(lang);  if (recv(DEF_TIMEOUT) == STS_SUCCESS)    return 1;  return 0;}/**Sets timeout-- default is 5 for 5 seconds**/int setTimeout(int8_t seconds){  sendCmd(CMD_TIMEOUT);  sendArg(seconds);  if (recv(DEF_TIMEOUT) == STS_SUCCESS)    return 1;  return 0;}int changeBaudrate(int8_t baud){  sendCmd(CMD_BAUDRATE);  sendArg(baud);  if (recv(DEF_TIMEOUT) == STS_SUCCESS)    return 1;  return 0;}/**tells the Stamp to start recognising, a trigger command**/void recognizeCommand(int8_t group){  sendCmd(CMD_RECOG_SD);  sendArg(group);}void recognizeWord(int8_t wordset){  sendCmd(CMD_RECOG_SI);  sendArg(wordset);}/*** Waits till command isnt recognised, also obtains the command**/int hasFinished() {  int8_t rx = recv(NO_TIMEOUT);  if (rx < 0)  {    return 0;  }  _status = 0;  lcd_gotoxy2(8);  lcd_showvalue(rx);  switch (rx)  {  case STS_SUCCESS:    return 1;    case STS_SIMILAR:    _builtin = 1;    goto GET_WORD_INDEX;  case STS_RESULT:    _command = 1;    GET_WORD_INDEX:   /* if (recvArg(rx, DEF_TIMEOUT))    {      _value = rx;      return 1;    }*/ send(ARG_ACK); int r = recv(DEF_TIMEOUT); _value = r - ARG_ZERO;    break;      case STS_TOKEN:    _token = 1;      if (recvArg(rx, DEF_TIMEOUT))    {      _value = rx << 5;      if (recvArg(rx, DEF_TIMEOUT))      {        _value |= rx;        return 1;      }    }    break;      case STS_TIMEOUT:    _timeout = 1;    return 1;      case STS_INVALID:    _invalid = 1;    return 1;      case STS_ERROR:    _error = 1;    if (recvArg(rx, DEF_TIMEOUT))    {      _value = rx << 4;      if (recvArg(rx, DEF_TIMEOUT))      {        _value |= rx;        return 1;      }    }    break;  }  // unexpected condition (communication error)  _status = 0;  _error = 1;  return 1;}int8_t getCommand() { return _command ? _value : -1; }int8_t getWord() { return _builtin ? _value : -1; } 

Download code here : VR.zip

 
 
Từ khóa:

nhận dạng

Đánh giá bài viết
Tổng số điểm của bài viết là: 0 trong 0 đánh giá
Click để đánh giá bài viết
 

Giới thiệu sản phẩm dịch vụ

Giới thiệu sản phẩm dịch vụ Giới thiệu sản phẩm dịch vụ: -          Cung cấp giải pháp, thiết kế các sản phẩm Robot gia dụng -          Cung cấp các sản phẩm điện thông minh, nhà thông...

Thăm dò ý kiến

Bạn có muốn sở hữu một Robot trong nhà không?

Cần một Robot để dọn dẹp

Cần một Robot trông nhà

Cần một Robot để giải trí

Bạn cần một Robot theo cách khác

Bạn đã có rồi

Bạn không cần

Liên kết