Deskripsi Masalah
Saya ingin menggunakan pengenalan suara sebagai bagian dari proyek perangkat keras, yang saya ingin benar-benar mandiri (Saya menggunakan daya rendah kecil, perangkat kecepatan rendah seperti Arduino dan Raspberry Pi, Kinect dll, tidak menjalankan komputer tradisional dengan sebuah OS terlibat. Jadi proyek tertutup / mandiri).
Pengenalan suara bisa sangat rumit tergantung pada tingkat kecanggihan yang Anda inginkan. Saya memiliki apa yang saya yakini sebagai persyaratan yang relatif sederhana. Saya hanya ingin mengenali suara saya sendiri, dan saya memiliki kamus kecil berisi sekitar 20 kata yang ingin saya kenali. Jadi saya tidak memerlukan perpustakaan pengenal suara-ke-teks dan suara yang kompleks atau perangkat lunak pihak ke-3 yang luar biasa yang saya temukan melalui mesin pencari Internet (tidak ada kekurangan!). Saya percaya persyaratan saya "cukup sederhana" (masuk akal) bahwa saya dapat kode solusi saya sendiri. Saya bertanya-tanya apakah ada yang telah menulis proses mereka sendiri seperti ini, dan apakah metode saya cacat besar-besaran? Apakah ada cara yang lebih baik untuk melakukan ini tanpa memerlukan matematika tingkat tinggi atau harus menulis algoritma yang kompleks? Itulah solusi yang saya coba pikirkan di bawah ini.
Deskripsi Solusi
Saya akan menulis ini di C tetapi saya ingin membahas proses agnostik bahasa, dengan fokus pada proses itu sendiri. Jadi mari kita abaikan itu jika kita bisa.
1. Saya akan merekam kamus kata-kata saya untuk mencocokkan dengan yang diucapkan. Kita dapat membayangkan saya memiliki 20 rekaman dari 20 kata saya yang berbeda, atau mungkin frasa atau kalimat pendek dari dua atau tiga kata. Saya percaya ini membuat proses membandingkan dua file rekaman lebih mudah daripada benar-benar mengubah audio menjadi teks dan membandingkan dua string.
2. Mikrofon terhubung ke perangkat keras saya yang menjalankan kode saya. [1]. Kode terus mengambil contoh panjang tetap, katakanlah 10 msec panjang misalnya, dan menyimpan 10 sampel berturut-turut misalnya, dalam gaya logging melingkar. [2]. (Saya menemukan angka-angka ini dari atas kepala saya sehingga mereka hanya contoh untuk menggambarkan prosesnya).
[1] Ini kemungkinan akan dihubungkan melalui filter band-pass dan op-amp, seperti halnya rekaman kamus dibuat, untuk menjaga sampel audio yang disimpan dan dikumpulkan lebih kecil.
[2] Saya tidak yakin persis bagaimana saya akan mengambil sampel, saya perlu mencari metode meskipun saya menghasilkan angka numerik (integer / float / double) yang mewakili audio sampel 10msec (mungkin nilai CRC atau jumlah MD5 dll dari sampel audio), atau aliran angka (aliran pembacaan frekuensi audio mungkin). Akhirnya "sampel" akan menjadi angka atau angka. Bagian ini akan menjadi lebih banyak perangkat keras yang terlibat sehingga tidak benar-benar untuk diskusi di sini.
3. Kode melihat itu disimpan 10 sampel berturut-turut dan mencari peningkatan volume untuk menunjukkan kata atau frasa sedang dikatakan (istirahat dari keheningan) dan kemudian kenaikan adalah pengumpulan sampel berturut-turut untuk mengatakan 500 sampel misalnya. Itu berarti ia menangkap audio 5 detik dalam sampel 10 msec.
Sampel atau "irisan" inilah yang dibandingkan antara suara yang disimpan dan suara yang ditangkap. Jika persentase sampel yang diambil cukup tinggi dengan yang disimpan, kode menganggap kata yang sama.
The start of a store recording of the world "hello" for example,
stored words are split into 10 msec samples also
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming audio (me saying "hello") with some "blank" samples
at the start to symbolise silence
Incoming Sample No | 1| 2| 3| 4| 5| 6| 7| 8| 9|10| 11|12|
Incoming Sample Value | | | |20|27|38|46|16|59|77|200|78|
4. Setelah kode telah mengumpulkan aliran sampel penuh, itu kemudian memotong sampel kosong di awal untuk menghasilkan rekaman audio berikut. Itu juga bisa memindahkan set sampel mundur dan maju beberapa tempat untuk menyelaraskan lebih baik dengan sampel yang disimpan.
Ini menghasilkan set sampel seperti di bawah ini:
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming Sample No |-1| 1| 2| 3| 4| 5| 6| 7| 8|
Incoming Sample Value |20|27|38|46|16|59|81|201|78|
5. Saya percaya bahwa dengan memiliki nilai persentase untuk seberapa dekat setiap sampel harus, maka sampel 7 berbeda dengan nilai 1 yang kurang dari% 1, dan nilai persentase untuk jumlah total sampel yang harus berada dalam persentase pencocokan sampel mereka , kode ini memiliki tingkat akurasi yang mudah disesuaikan.
Saya belum pernah melakukan hal seperti ini dengan audio sebelumnya, itu bisa jadi banyak pekerjaan. Inilah mengapa saya mengajukan pertanyaan ini, jika Anda mungkin sudah tahu jawaban atas pertanyaan ini menjadi jelas (apa pun jawaban itu). Saya berharap ini tidak akan menjadi tugas komputasi besar karena beberapa perangkat keras yang akan saya gunakan akan menjadi hal-hal rendah. Dalam ratusan Megahertz (Mungkin 1Ghz menggunakan Rasp Pi over-clock). Jadi ini adalah cara yang agak kasar untuk mencocokkan sampel audio menggunakan daya komputasi yang lebih rendah. Saya tidak bertujuan untuk hasil instan, tetapi kurang dari 30 detik untuk bukti konsep yang layak.
PS Saya tidak memiliki perwakilan untuk memberi tag ini dengan tag baru seperti "audio", "audio recognition", "voice", "voice recognition" dll.
sumber
Jawaban:
Yah saya tidak percaya Arduino memiliki kekuatan kuda untuk melakukan ini. beroperasi di 16Mhz. Arduino memiliki sekitar 32 ribu memori. Bahkan 20 kata sampel dalam Mp3 (lebih kecil dari wav) tidak akan cocok di dalamnya, meskipun hanya suara Anda sendiri.
Pi rasberi dapat melakukan triknya, beroperasi pada 700Mhz tergantung pada versi yang mungkin memiliki memori 512MB. Itu masih belum banyak adonan.
Anda mungkin memerlukan fourier ( http://www.drdobbs.com/cpp/a-simple-and-efisien-fft-implementatio/199500857 )
Atau jika Anda bermaksud menggunakan volume, lakukan beberapa rata-rata dengan sampel sebelumnya seperti
x = (x + x [n-1] + x [n-2] + x [n-3]) / 4 // itu kekuatan yang cukup sederhana butuh lebih banyak
Hal berikutnya yang perlu Anda lakukan adalah saya pikir jika Anda akan memplot nilai-nilai X ini, maka Anda memerlukan semacam deteksi kemiringan garis itu. Karena mendeteksi perintah berdasarkan volume tergantung sebaliknya banyak pada jarak. Sementara Anda lebih suka untuk mendeteksi pola kata-kata
Maka itu sedikit tergantung bagaimana merekam kemiringan sehingga pola akan cocok di lain waktu. Maksud saya seseorang tidak berbicara dalam tempo yang tepat yang bisa ditandingi komputer dan kemiringannya bisa sedikit lebih curam. Pada akhirnya saya pikir ini sedikit seberapa curam garis-garis itu dan panjangnya sumbu y, harus dalam beberapa rata-rata
sumber
Arduino dan Raspberry Pi adalah papan prototyping dengan sedikit chip pada mereka. Anda harus fokus pada chip terlebih dahulu. Cari sesuatu dengan kotak alat DSP (pemrosesan sinyal digital), mungkin Anda sudah memiliki kotak alat DSP dan tidak mengetahuinya. Kotak alat DSP memiliki algoritma panggilan seperti fft (fast fourier transform) dan ifft (inverse fft) untuk analisis domain frekuensi cepat.
Fokus pada gaya programatik Anda: Apakah sampel Anda ada dalam tumpukan atau antrian? Anda akan menginginkan antrian untuk tipe data ini. Antrian terlihat seperti:
Iterasi berikutnya:
Perhatikan bagaimana hal-hal bergeser ke arah 'benar'? Saya pikir Anda menggambarkan algoritma "melingkar". Timpa sampel tertua dengan sampel terlama kedua, lalu timpa sampel terlama kedua dengan yang terlama ketiga, ..., sampai ke awal antrian tempat Anda memasukkan data terbaru.
"Kode secara terus menerus mengambil sampel dengan panjang tetap, katakan 10 msec" <- salah Pikirkan seperti ini: Kode secara terpisah mengambil sampel terkuantisasi (tinggi), pada tingkat pengambilan sampel 10.000 sampel per detik, yang membuat setiap sampel terpisah 0,1 ms.
Berapa frekuensi sampling Anda? Apa bitrate pada quantizer Anda? Angka yang lebih rendah akan membantu Anda mengosongkan memori. Saya menyarankan tingkat pengambilan sampel yang rendah seperti 6600 sampel per detik (Nyquist). Saya menduga 4 bit (16 level) akan cukup untuk pengakuan. Jadi, itu 3300 byte rekaman per detik. Sekarang lakukan fft dan hapus semua yang ada di atas 3300 Hz (filter telepon). Sekarang Anda memiliki 1650 byte yang digunakan untuk satu detik suara. Trik DSP ini akan menghemat banyak memori.
Saya tidak tahu siapa yang berpikir 512 MB itu kecil. Dengan info di atas yaitu 300.000+ detik perekaman ... lebih dari 3 hari.
Saya pikir Anda akan menemukan domain frekuensi (dengan menggunakan fft) menjadi lingkungan yang lebih baik untuk melakukan pengenalan suara.
Saya harap saya tidak membingungkan Anda lebih buruk :)
sumber