산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino 및 BitVoicer 서버로 음성 인식

구성품 및 소모품

Arduino Micro
× 1
Sparkfun Electret 마이크 브레이크아웃
× 1
비트보이서 서버
× 1
비트보이서 서버 1.0
× 1
LED(일반)
× 3
저항 330옴
× 3

이 프로젝트 정보

이 게시물에서는 Arduino 보드와 BitVoicer Server를 사용하여 음성 명령으로 몇 개의 LED를 제어하는 ​​방법을 보여 드리겠습니다. 이번 포스트에서는 아두이노 마이크로를 사용하겠지만 가지고 있는 아두이노 보드라면 아무거나 사용해도 됩니다.

음성 명령을 LED 활동으로 변환하기 위해 다음 절차가 실행됩니다.


<울>
  • 오디오 웨이브는 Sparkfun Electret Breakout 보드에서 캡처 및 증폭됩니다.
  • 증폭된 신호는 아날로그-디지털 변환기(ADC)를 사용하여 Arduino에서 디지털화되고 버퍼링됩니다.
  • Theaudio 샘플은 Arduino 직렬 포트를 사용하여 BitVoicer 서버로 스트리밍됩니다.
  • BitVoiderServer는 오디오 스트림을 처리하고 포함된 음성을 인식합니다.
  • 인식된 음성은 Arduino로 다시 전송될 사전 정의된 명령에 매핑됩니다.
  • TheArduino는 명령을 식별하고 적절한 작업을 수행합니다.
  • 위의 비디오는 이 게시물의 최종 결과를 보여줍니다. BitVoider Server는 합성된 음성 피드백도 제공한다는 점에 유의하십시오. 이 음성 피드백은 서버에서 정의되고 서버 오디오 어댑터에 의해 재생되지만 합성된 오디오는 Arduino로 전송되어 DAC(디지털-아날로그 변환기)를 사용하여 재생할 수도 있습니다. 다음 포스팅에서는 아두이노 자체를 사용하여 합성된 음성을 재생하기 위해 증폭 하나와 스피커 하나인 Arduino DUE를 사용하는 방법을 보여 드리겠습니다.

    자료 목록:


    <울>
  • Arduino Micro(또는 기타 Arduino 보드):~U$ 20.00
  • Sparkfun Electret 마이크 브레이크아웃:U$ 7.95
  • 비트보이서 서버 1.0 :9.90달러
  • 브레드보드:~U$ 10.00
  • xLED 3개:~U$ 1.00
  • 3 x330 Ohms 저항:~U$ 0.75
  • 점퍼와이어:~U$ 0.30

  • 1단계:배선


    첫 번째 단계는 아두이노와 브레드보드를 ​​아래 그림과 같이 구성 요소와 연결하는 것입니다.

    여기서 가장 중요한 세부 사항은 Arduino ADC에 제공되는 아날로그 참조를 나타냅니다. 내 테스트에서 Sparkfun Electret Breakout과 함께 3.3V를 사용하여 더 나은 결과를 얻었습니다. 그래서 3.3V 핀과 AREF 핀 사이에 점퍼를 추가했습니다. AREF 핀에 3.3V가 인가되는 동안 analogRead 기능을 사용하기로 결정했다면 analogRead 기능을 사용하기 전에 반드시 analogReference(EXTERNAL)를 호출해야 합니다. 그렇지 않으면 활성 기준 전압(내부적으로 생성됨)과 AREF 핀이 함께 단락되어 Arduino 보드의 마이크로컨트롤러가 손상될 수 있습니다.


    2단계:Arduino에 코드 업로드


    이제 아래 코드를 Arduino에 업로드해야 합니다. 편의를 위해 이 게시물 하단의 첨부 파일 섹션에서도 Arduino 스케치를 사용할 수 있습니다. 코드를 업로드하기 전에 BitVoicer 서버 라이브러리를 Arduino IDE에 올바르게 설치해야 합니다(.zip 라이브러리 가져오기).

    BVS_Demo1.ino

    이 스케치는 네 가지 주요 부분으로 구성되어 있습니다.


    <울>
  • 라이브러리 참조 및 변수 선언:처음 두 줄에는 BVSP 및 BVSMic 라이브러리에 대한 참조가 포함됩니다. 이러한 라이브러리는 BitSophia에서 제공하며 BitVoicer Server 설치 폴더에서 찾을 수 있습니다. 다른 라인은 스케치 전체에서 사용되는 상수와 변수를 선언합니다. BVSP 클래스는 BitVoicer Server와 통신하는 데 사용되며 BVSMic 클래스는 오디오 샘플을 캡처하고 저장하는 데 사용됩니다.
  • 설정 기능:이 함수는 직렬 통신, BVSP 클래스, BVSMic 클래스를 초기화하고 frameReceived 이벤트에 대한 "이벤트 핸들러"(실제로는 함수 포인터)를 설정합니다.
  • 루프 기능:이 기능은 서버에 상태 정보 요청(keepAlive() 기능), 서버가 데이터를 전송했는지 확인하고 수신된 데이터 처리(receive() 기능), 오디오 녹음 및 전송 제어의 세 가지 중요한 작업을 수행합니다. 스트림(isSREAvailable(), startRecording(), stopRecording() 및 sendStream() 함수).
  • BVSP_frameReceivedfunction:이 함수는 하나의 완전한 프레임이 수신되었음을 receive() 함수가 식별할 때마다 호출됩니다. 여기에서 BitVoider Server에서 보낸 명령을 실행합니다. 명령에는 2바이트가 포함됩니다. 첫 번째 바이트는 핀을 나타내고 두 번째 바이트는 핀 값을 나타냅니다. analogWrite() 함수를 사용하여 핀에 적절한 값을 설정합니다.

  • 3단계:BitVoicer 서버 솔루션 개체 가져오기


    이제 Arduino와 함께 작동하도록 BitVoicer 서버를 설정해야 합니다. BitVoider Server에는 위치, 장치, BinaryData 및 음성 스키마의 4가지 주요 솔루션 개체가 있습니다.

    위치는 장치가 설치된 물리적 위치를 나타냅니다. 제 경우에는 Home이라는 위치를 만들었습니다.

    장치는 BitVoicer 서버 클라이언트입니다. 나는 ArduinoMicro라는 이름의 혼합 장치를 만들고 통신 설정을 입력했습니다. ARDUINO MICRO에 대한 참고 사항 :RTS 및 DTR을 사용하므로 통신 탭에서 이러한 설정을 활성화해야 합니다. 또한 서버 오디오 어댑터를 사용하여 음성을 합성하는 SystemSpeaker 장치를 만들었습니다.

    BinaryData는 BitVoicer Server가 클라이언트 장치에 보낼 수 있는 명령 유형입니다. 실제로는 명령에 연결할 수 있는 바이트 배열입니다. BitVoider Server는 해당 명령과 관련된 음성을 인식하면 바이트 배열을 대상 장치로 보냅니다. 각 핀 값에 대해 하나의 BinaryData 개체를 만들고 ArduinoMicroGreenLedOn, ArduinoMicroGreenLedOff 등으로 이름을 지정했습니다. 내 솔루션에 18개의 BinaryData 개체가 있으므로 VoiceSchema.sof에서 개체를 다운로드하여 가져오는 것이 좋습니다. 아래 파일.

    음성 스키마는 모든 것이 결합되는 곳입니다. 그들은 어떤 문장을 인식하고 실행할 명령을 정의합니다. 각 문장에 대해 필요한 만큼 명령과 실행 순서를 정의할 수 있습니다. 명령 사이의 지연을 정의할 수도 있습니다. 그렇게 해서 동영상에서 볼 수 있는 일련의 작업을 수행할 수 있었습니다.

    아래 파일에서 이 게시물에서 사용한 모든 솔루션 개체를 가져올 수 있습니다(솔루션 개체 가져오기). 하나는 장치를 포함하고 다른 하나는 음성 스키마와 해당 명령을 포함합니다.

    장치.소프


    VoiceSchema.sof

    4단계:결론


    그게 다야! 마음에 드셨길 바랍니다.

    비디오에 표시된 데모를 실행하는 데 필요한 모든 것이 있습니다. 비디오에서 BitVoicer 서버 관리자에서 ArduinoMicro 장치를 활성화하여 시작했습니다. 활성화되는 즉시 Arduino는 사용 가능한 음성 인식 엔진을 식별하고 BitVoicer 서버로 오디오 스트리밍을 시작합니다.

    BitVoicer 서버 관리자에서 사용할 수 있는 서버 모니터 도구에서 인식 결과를 따를 수 있습니다.

    다음 게시물에서는 Arduino DUE를 사용하여 합성된 음성을 재생하는 방법을 보여 드리겠습니다.


    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • BVS_Demo1.ino
  • BVS_Demo1.ino아두이노
    #include #include // 오디오 캡처에 사용할 Arduino 핀 정의 #define BVSM_AUDIO_INPUT 5// LED 핀 정의#define RED_LED_PIN 6#define YELLOW_LED_PIN 9#define GREEN_LED_PIN 10// BVSP.begin 함수에 // 매개변수로 전달될 상수를 정의합니다. const unsigned long STATUS_REQUEST_TIMEOUT =1000;const unsigned long STATUS_REQUEST_INTERVAL =2000;//// 오디오 버퍼의 크기를 정의합니다. const int AUD_4 / 수신 버퍼의 크기를 정의합니다. const int RECEIVE_BUFFER_SIZE =2;// BVSP 클래스의 새 전역 인스턴스를 초기화합니다. BVSP bvsp =BVSP();// BVSMic 클래스의 새 전역 인스턴스를 초기화합니다. BVSMic bvsm =BVSMic();/ / 기록된 샘플을 읽는 데 사용할 버퍼를 만듭니다. // BVSMic 클래스 byte audioBuffer[AUDIO_BUFFER_SIZE];// BitVoicer Server에서 보낸 명령을 읽는 데 사용할 버퍼를 만듭니다.// Byte 0 =pin number// 바이트 1 =핀 값 바이트 수신 버퍼[RECEIVE_BUFFER _SIZE];void setup() { // 핀 모드 설정 pinMode(RED_LED_PIN, OUTPUT); 핀모드(YELLOW_LED_PIN, 출력); 핀모드(GREEN_LED_PIN, 출력); // 115200 bps에서 직렬 통신을 시작합니다. Serial.begin(115200); // 통신에 사용될 Arduino 직렬 포트, // 상태 요청이 시간 초과되기까지 걸리는 시간 및 // 상태 요청이 BitVoicer 서버로 전송되어야 하는 // 빈도를 설정합니다. bvsp.begin(시리얼, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // frameReceived를 처리할 함수를 정의합니다. // 이벤트 bvsp.frameReceived =BVSP_frameReceived; // BVSMic 클래스 타이머를 준비합니다. bvsm.begin();}void loop() { // 상태 요청 간격이 경과했는지 확인하고 // 경과한 경우 BitVoicer 서버에 상태 요청을 보냅니다. bvsp.keepAlive(); // 직렬 포트 버퍼에 사용 가능한 데이터가 있는지 확인하고 // BitVoicer 서버 프로토콜 사양에 따라 해당 내용을 처리합니다. bvsp.receive(); // 사용 가능한 SRE가 하나 있는지 확인합니다. 있는 경우 // 녹음을 시작합니다. if (bvsp.isSREAvailable()) { // BVSMic 클래스가 녹음 중이 아니면 // 오디오 입력을 설정하고 녹음을 시작합니다. if (!bvsm.isRecording) { bvsm.setAudioInput(BVSM_AUDIO_INPUT, EXTERNAL); bvsm.startRecording(); } // BVSMic 클래스에 사용 가능한 샘플이 있는지 확인합니다. if (bvsm.available) { // 스트림을 전송하기 전에 // 인바운드 모드가 STREAM_MODE인지 확인합니다. if (bvsp.inboundMode ==FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE); // BVSMic 클래스에서 오디오 샘플을 읽습니다. int bytesRead =bvsm.read(audioBuffer, AUDIO_BUFFER_SIZE); // 오디오 스트림을 BitVoicer 서버로 보냅니다. bvsp.sendStream(audioBuffer, bytesRead); } } else { // 사용 가능한 SRE가 없습니다. BVSMic 클래스가 녹음 중이면 // 중지합니다. if (bvsm.isRecording) bvsm.stopRecording(); }}// frameReceived 이벤트 처리 void BVSP_frameReceived(byte dataType, int payloadSize) { // 수신된 프레임에 바이너리 데이터가 포함되어 있는지 확인 // 0x07 =바이너리 데이터(바이트 배열) if (dataType ==DATA_TYPE_BINARY) { // If 2 바이트가 수신되면 명령을 처리하십시오. if (bvsp.getReceivedBytes(receiveBuffer, RECEIVE_BUFFER_SIZE) ==RECEIVE_BUFFER_SIZE) { analogWrite(receiveBuffer[0], receiveBuffer[1]); } }}

    회로도


    제조공정

    1. Python과 함께 Arduino 및 RFID를 사용한 출석 시스템
    2. DHT11 센서(LED 및 피에조 스피커 포함)
    3. Arduino Temp. 3.2 디스플레이가 있는 모니터 및 실시간 시계
    4. Arduino 및 Android 기기로 Roomba 로봇 제어
    5. Arduino 및 Nokia 5110 디스플레이가 있는 DIY 전압계
    6. Arduino 및 MPU6050으로 서보 모터 제어
    7. U-blox LEA-6H 02 GPS 모듈(Arduino 및 Python 포함)
    8. DHT11로 Blynk에서 온도와 습도를 읽는 방법
    9. Arduino를 사용한 음성 인식 및 합성
    10. 4x4x4 LED 큐브(Arduino Uno 및 1쉴드 포함