아두이노와 BitVoicer Server를 활용한 음성인식(1)

by 강종구 | 2017-07-17 15:01
아두이노 음성 음성인식

이번에는  아두이노와 BitVoicer Server를 사용해서 몇개의 LED를 음성 명령을 통해 컨트롤 해보겠습니다.


아두이노 Micro 를 통해서 이번 프로젝트를 진행하겠지만, 가지고 계신 어떤 보드를 사용하셔도 이 프로젝트를 진행하실 수 있습니다.


1. 준비물

아두이노 마이크로, 마이크, BitVoicer Server 1.0, 빵판, LED 3개, 330옴 레지스터 3개, 점퍼선


2. 음성인식의 순서

1) Sparkfun Electret Breakout board에 의해 오디오 파동이 측정되고 증폭되어진다.

2) 증폭된 신호가 analog-to-digital converter(ADC)를 사용해서 아두이노 내에 디지털화되고 버퍼화된다.

3) 오디오 샘플이 아두이노 시리얼 포트를 이용해서 BitVoice Server에 스트림된다

4) BitVoicer Server 오디오 스트림 과정을 수행하고 음성을 인식한다.

5) 인식된 음성이 미리 지정된 명령에 대해서 매칭되고 그것은 다시 아두이노로 전송된다.

6) 아두이노가 명령어들을 인식해서 적절한 행동을 수행한다.


3. 연결방법

1) 전체 연결 방법

2) 아두이노 Micro 부분


3) LED 부분

 

4) 완성된 연결


연결할 때 가장 중요한 것은 아두이노 ADC가 제공하는 analog reference와 관련있습니다. Sparkfun Electrect Breakout을 3.3V로 사용했을 때 더 좋은 결과를 얻었습니다. 그래서 사진에서 보다시피 점퍼선을 3.3V핀과 AREF핀 사이에 연결했습니다. 만약에 3.3V가 AREF 핀에 연결되어있는 동안, analogRead 함수를 사용하려 하신다면, analogRead 함수를 사용하기 전에 analogReference를 콜 해야 합니다.


4. 소스 코드

이 코드를 업로드 하기 전에, Arduino IDE 라이브러리 안에 BitVoicer Server 라이브러리를 설치해야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <BVSP.h>
#include <BVSMic.h>
 
// Defines the Arduino pin that will be used to capture audio 
#define BVSM_AUDIO_INPUT 5
 
// Defines the LED pins
#define RED_LED_PIN 6
#define YELLOW_LED_PIN 9
#define GREEN_LED_PIN 10
 
// Defines the constants that will be passed as parameters to 
// the BVSP.begin function
const unsigned long STATUS_REQUEST_TIMEOUT = 1000;
const unsigned long STATUS_REQUEST_INTERVAL = 2000;
 
// Defines the size of the audio buffer 
const int AUDIO_BUFFER_SIZE = 64;
 
// Defines the size of the receive buffer
const int RECEIVE_BUFFER_SIZE = 2;
 
// Initializes a new global instance of the BVSP class 
BVSP bvsp = BVSP();
 
// Initializes a new global instance of the BVSMic class 
BVSMic bvsm = BVSMic();
 
// Creates a buffer that will be used to read recorded samples 
// from the BVSMic class 
byte audioBuffer[AUDIO_BUFFER_SIZE];
 
// Creates a buffer that will be used to read the commands sent
// from BitVoicer Server.
// Byte 0 = pin number
// Byte 1 = pin value
byte receiveBuffer[RECEIVE_BUFFER_SIZE];
 
void setup() 
{
  // Sets up the pin modes
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(YELLOW_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);
  
  // Starts serial communication at 115200 bps 
  Serial.begin(115200); 
  
  // Sets the Arduino serial port that will be used for 
  // communication, how long it will take before a status request 
  // times out and how often status requests should be sent to 
  // BitVoicer Server. 
  bvsp.begin(Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL);
    
  // Defines the function that will handle the frameReceived 
  // event 
  bvsp.frameReceived = BVSP_frameReceived; 
  
  // Prepares the BVSMic class timer 
  bvsm.begin();
}
 
void loop() 
{
  // Checks if the status request interval has elapsed and if it 
  // has, sends a status request to BitVoicer Server 
  bvsp.keepAlive();
  
  // Checks if there is data available at the serial port buffer 
  // and processes its content according to the specifications 
  // of the BitVoicer Server Protocol 
  bvsp.receive();
 
  // Checks if there is one SRE available. If there is one, 
  // starts recording.
  if (bvsp.isSREAvailable()) 
  {
    // If the BVSMic class is not recording, sets up the audio 
    // input and starts recording 
    if (!bvsm.isRecording)
    {
      bvsm.setAudioInput(BVSM_AUDIO_INPUT, EXTERNAL); 
      bvsm.startRecording();
    }
 
    // Checks if the BVSMic class has available samples 
    if (bvsm.available)
    {
      // Makes sure the inbound mode is STREAM_MODE before 
      // transmitting the stream
      if (bvsp.inboundMode == FRAMED_MODE)
        bvsp.setInboundMode(STREAM_MODE); 
        
      // Reads the audio samples from the BVSMic class
      int bytesRead = bvsm.read(audioBuffer, AUDIO_BUFFER_SIZE);
      
      // Sends the audio stream to BitVoicer Server
      bvsp.sendStream(audioBuffer, bytesRead);
    }
  }
  else
  {
    // No SRE is available. If the BVSMic class is recording, 
    // stops it.
    if (bvsm.isRecording)
      bvsm.stopRecording();
  }
}
 
// Handles the frameReceived event 
void BVSP_frameReceived(byte dataType, int payloadSize) 
{
  // Checks if the received frame contains binary data
  // 0x07 = Binary data (byte array)
  if (dataType == DATA_TYPE_BINARY)
  {
    // If 2 bytes were received, process the command
    if (bvsp.getReceivedBytes(receiveBuffer, RECEIVE_BUFFER_SIZE) == 
      RECEIVE_BUFFER_SIZE)
    {
      analogWrite(receiveBuffer[0], receiveBuffer[1]);
    }
  }
}
 
cs


5. BitVoicer Server 솔루션 오브젝트들 입력하기


Arduino와 BItVoicer Server를 함께 구동하기 위해서는 BitVoicer Server를 설치해야 한다. BitVoicer server는 4개의 주요 솔루션 오브젝트들을 가지고 있다(Locations, Devices, Binary Data 그리고 Voice Schemas)


1) Location

Location은 디바이스가 설치되는 실제 장소를 나타낸다. 이 프로젝트에서는 Home이라는 장소를 지정하였다.


2) Devices

디바이스는 BitVoicer Server의 Client들을 말한다. 이 프로젝트는 아두이노 Micro라 불리면서 의사소통 세팅들을 가진 혼합된 디바이스를 만들었다. 아두이노 Micro는 RTS와 DTR을 사용하는데, 이를 위해서는 communication 탭에서 이러한 세팅들을 사용할 수 있게 설정해줘야 한다.


3) Binary Data

이진 데이터는 Bitvoicer Server가 client 장치에게 전송하는 명령어의 한 타입이다. 그것들은 명령어들을 연결할 수 있는 Byte array들이다. BitVoicer Server가 명령어와 관계된 음성을 인식할 때, 그것은 Target 장치에 byte array형태로 전송된다. 이 프로젝트에서는 1핀당 1개의 Binary Data를 만들었고, 그것들은 ArduinoMicroGreenLedOn, ArduinoMicroGreenLedoff 등으로 설정해주었다. 총 18개의 Binary Data를 사용했고, 아래의 VoiceSchema.sof 파일을 다운 받아서 오브젝트에 추가하시길 추천합니다.


4) Voice Schema

음성 스키마는 어떤 문장이 인식되어야 하고 어떤 명령어들이 실행되어야 하는지를 결정합니다. 각각의 문장에 있어서 작성자가 필요한 만큼, 또 실행되어지길 원하는 순서대로 많은 명령들을 결정합니다. 또한 명령들 간의 delay를 설정할 수도 있습니다.


- Voice Schema.sof 다운

- Devices.sof 다운


6. 완성


자세한 사항을 보기 원하시면 원문을 참조하시기 바랍니다.



댓글 0

아두이노를 활용한 음성인식

아두이노와 BitVoicer Server를 활용한 음성인식(1)

by 강종구
아두이노와 MIT 음성인식기를 사용한 LED 컨트롤 다음글 아두이노와 BitVoicer Server를 활용한 음성인식(1)현재글