Proyek LED Kendali Suara: Arduino Micro + BitVoicer Server untuk Pengenalan Ucapan
Komponen dan Perlengkapan
Arduino Micro
×
1
Sparkfun Electret Microphone Breakout
×
1
BitVoicer Server
×
1
BitVoicer Server 1.0
×
1
LED (generik)
×
3
Resistor 330 ohm
×
3
Tentang Proyek Ini
Dalam postingan ini saya akan menunjukkan cara menggunakan papan Arduino dan BitVoicer Server untuk mengontrol beberapa LED dengan perintah suara. Saya akan menggunakan Arduino Micro dalam postingan ini, tetapi Anda dapat menggunakan papan Arduino apa pun yang Anda miliki.
Berikut prosedur yang akan dieksekusi untuk mengubah perintah suara menjadi aktivitas LED:
Gelombang suara akan ditangkap dan diperkuat oleh papan Sparkfun Electret Breakout;
Sinyal yang diperkuat akan di-digitalkan dan ditampung di Arduino menggunakan konverter analog-ke-digital (ADC);
Sampel audio akan di-stream ke BitVoicer Server menggunakan port serial Arduino;
BitVoicer Server akan memproses aliran audio dan mengenali ucapan yang terkandung di dalamnya;
Ucapan yang dikenali akan dipetakan ke perintah yang telah ditentukan yang akan dikirim kembali ke Arduino;
Arduino akan mengidentifikasi perintah dan melakukan tindakan yang sesuai.
Video di atas menunjukkan hasil akhir dari postingan ini. Perhatikan dalam video bahwa BitVoicer Server juga memberikan masukan suara sintesis. Masukan suara sintesis ini didefinisikan di server dan direproduksi oleh adapter audio server, tetapi audio sintesis juga dapat dikirim ke Arduino dan direproduksi menggunakan konverter digital-ke-analog (DAC). Dalam postingan saya selanjutnya, saya akan menunjukkan cara menggunakan Arduino DUE, satu pemampul dan satu speaker untuk mereproduksi suara sintesis menggunakan Arduino itu sendiri.
Daftar Bahan:
Arduino Micro (atau papan Arduino lainnya): ~U$ 20.00
Sparkfun Electret Microphone Breakout: U$ 7.95
BitVoicer Server 1.0: U$ 9.90
Breadboard: ~U$ 10.00
3 x LED: ~U$ 1.00
3 x Resistor 330 Ohm: ~U$ 0.75
Kabel Jumper: ~U$ 0.30
STEP 1: Pemasangan
Langkah pertama adalah memasang Arduino dan breadboard dengan komponen seperti yang ditunjukkan dalam gambar di bawah ini.
Detail terpenting di sini adalah referensi analog yang diberikan ke ADC Arduino. Dalam pengujian saya, saya mendapatkan hasil yang lebih baik menggunakan 3,3V dengan Sparkfun Electret Breakout. Itulah sebabnya saya menambahkan kabel jumper antara pin 3,3V dan pin AREF. Jika Anda memutuskan untuk menggunakan fungsi analogRead (alasan apa pun) saat 3,3V diberikan ke pin AREF, Anda HARUS memanggil analogReference(EXTERNAL) sebelum Anda menggunakan fungsi analogRead. Jika tidak, Anda akan menyambungkan tegangan referensi aktif (yang dihasilkan secara internal) dan pin AREF, yang dapat merusak mikrokontroler pada papan Arduino Anda.
STEP 2: Mengunggah Kode ke Arduino
Sekarang Anda harus mengunggah kode di bawah ini ke Arduino Anda. Untuk kenyamanan, sketsa Arduino juga tersedia di bagian Lampiran di bagian bawah postingan ini. Sebelum Anda mengunggah kode, Anda harus menginstal perpustakaan BitVoicer Server ke Arduino IDE dengan benar (Mengimpor Perpustakaan .zip).
BVS_Demo1.ino
Sketsa ini memiliki empat bagian utama:
Referensi perpustakaan dan deklarasi variabel: Dua baris pertama menyertakan referensi ke perpustakaan BVSP dan BVSMic. Perpustakaan ini disediakan oleh BitSophia dan dapat ditemukan di folder instalasi BitVoicer Server. Baris lain mendeklarasikan konstanta dan variabel yang digunakan di seluruh sketsa. Kelas BVSP digunakan untuk berkomunikasi dengan BitVoicer Server dan kelas BVSMic digunakan untuk menangkap dan menyimpan sampel audio.
Fungsi setup: Fungsi ini menginisialisasi komunikasi serial, kelas BVSP, kelas BVSMic dan mengatur “event handler” (sebenarnya itu pointer fungsi) untuk peristiwa frameReceived.
Fungsi loop: Fungsi ini melakukan tiga tindakan penting: meminta informasi status ke server (fungsi keepAlive()), memeriksa apakah server telah mengirim data apa pun dan memproses data yang diterima (fungsi receive()), dan mengontrol perekaman serta pengiriman aliran audio (fungsi isSREAvailable(), startRecording(), stopRecording() dan sendStream()).
Fungsi BVSP_frameReceived: Fungsi ini dipanggil setiap kali fungsi receive() mengidentifikasi bahwa satu frame lengkap telah diterima. Di sini saya menjalankan perintah yang dikirim dari BitVoicer Server. Perintah berisi 2 byte. Byte pertama menunjukkan pin dan byte kedua menunjukkan nilai pin. Saya menggunakan fungsi analogWrite() untuk mengatur nilai yang sesuai ke pin.
STEP 3: Mengimpor Objek Solusi BitVoicer Server
Sekarang Anda harus menyiapkan BitVoicer Server untuk bekerja dengan Arduino. BitVoicer Server memiliki empat objek solusi utama: Lokasi, Perangkat, BinaryData dan Skema Suara.
Lokasi mewakili lokasi fisik di mana suatu perangkat dipasang. Dalam kasus saya, saya membuat lokasi bernama Home.
Perangkat adalah klien BitVoicer Server. Saya membuat perangkat Mixed, menamainya ArduinoMicro dan memasukkan pengaturan komunikasi. CATATAN TENTANG ARDUINO MICRO: ia menggunakan RTS dan DTR jadi Anda harus mengaktifkan pengaturan ini di tab komunikasi. Saya juga membuat perangkat SystemSpeaker untuk sintesis suara menggunakan adapter audio server.
BinaryData adalah jenis perintah yang dapat dikirim BitVoicer Server ke perangkat klien. Mereka sebenarnya adalah array byte yang dapat Anda hubungkan ke perintah. Ketika BitVoicer Server mengenali ucapan yang terkait dengan perintah tersebut, itu mengirim array byte ke perangkat target. Saya membuat satu objek BinaryData untuk setiap nilai pin dan menamainya ArduinoMicroGreenLedOn, ArduinoMicroGreenLedOff dan seterusnya. Saya akhirnya memiliki 18 objek BinaryData dalam solusi saya, jadi saya sarankan Anda mengunduh dan mengimpor objek dari file VoiceSchema.sof di bawah ini.
Skema Suara adalah di mana semuanya berkumpul. Mereka mendefinisikan kalimat apa yang harus dikenali dan perintah apa yang akan dijalankan. Untuk setiap kalimat, Anda dapat mendefinisikan sebanyak mungkin perintah yang Anda butuhkan dan urutan eksekusinya. Anda juga dapat mendefinisikan jeda antara perintah. Itulah bagaimana saya berhasil melakukan urutan tindakan yang Anda lihat dalam video.
Anda dapat mengimpor (Mengimpor Objek Solusi) semua objek solusi yang saya gunakan dalam postingan ini dari file di bawah ini. Salah satu berisi Perangkat dan yang lainnya berisi Skema Suara dan Perintahnya.
Devices.sof
VoiceSchema.sof
STEP 4: Kesimpulan
Itu saja! Saya harap Anda menyukainya.
Anda memiliki semua yang Anda butuhkan untuk menjalankan demo yang ditunjukkan dalam video. Perhatikan bahwa dalam video saya mulai dengan mengaktifkan perangkat ArduinoMicro di BitVoicer Server Manager. Segera setelah diaktifkan, Arduino mengidentifikasi Engine Pengenalan Ucapan yang tersedia dan mulai streaming audio ke BitVoicer Server.
Anda dapat mengikuti hasil pengenalan di alat Server Monitor yang tersedia di BitVoicer Server Manager.
Dalam postingan saya selanjutnya saya akan menunjukkan bagaimana Anda dapat mereproduksi suara sintesis menggunakan Arduino DUE.
Kode
BVS_Demo1.ino
BVS_Demo1.inoArduino
#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]); } } }