Ini adalah PocketSphinx, salah satu kosakata besar sumber terbuka Universitas Carnegie Mellon, mesin pengenalan ucapan berkelanjutan yang tidak bergantung pada pembicara.
Meskipun sistem ini dulunya merupakan sistem penelitian, pengembangan aktifnya sebagian besar telah terhenti dan menjadi sangat, sangat jauh dari yang terbaru. Saya membuat rilis, karena orang-orang masih menggunakannya, dan ada sejumlah kesalahan historis dalam sistem build dan API yang perlu diperbaiki.
Anehnya, nomor versinya besar karena ada "rilis" yang digunakan orang-orang yang disebut 5prealpha, dan kami akan menggunakan versi semantik yang tepat mulai sekarang.
Silakan lihat file LISENSI untuk ketentuan penggunaan.
Kami sekarang menggunakan CMake untuk membangun, yang seharusnya memberikan hasil yang wajar di Linux dan Windows. Tidak yakin tentang Mac OS X karena saya tidak punya itu. Selain itu, perpustakaan audio, yang tidak pernah benar-benar dibangun atau berfungsi dengan benar pada platform apa pun, telah dihapus begitu saja.
Tidak ada lagi ketergantungan pada SphinxBase. Tidak ada lagi Pangkalan Sphinx. Ini bukan Pangkalan Sphinx yang Anda cari. Semua SphinxBase Anda adalah milik kami.
Untuk menginstal modul Python di lingkungan virtual (ganti ~/ve_pocketsphinx
dengan lingkungan virtual yang ingin Anda buat), dari direktori tingkat atas:
python3 -m venv ~/ve_pocketsphinx . ~/ve_pocketsphinx/bin/activate pip install .
Untuk menginstal pustaka dan pengikatan C (dengan asumsi Anda memiliki akses ke /usr/local - jika tidak, gunakan -DCMAKE_INSTALL_PREFIX
untuk menyetel awalan berbeda pada perintah cmake
pertama di bawah):
cmake -S . -B build cmake --build build cmake --build build --target install
Program baris perintah pocketsphinx
membaca audio PCM 16-bit saluran tunggal dari input standar atau satu atau lebih file, dan mencoba mengenali ucapan di dalamnya menggunakan model akustik dan bahasa default. Ia menerima sejumlah besar opsi yang mungkin tidak Anda pedulikan, perintah yang defaultnya adalah live
, dan satu atau lebih input (kecuali dalam mode align
), atau -
untuk membaca dari input standar.
Jika Anda memiliki file WAV saluran tunggal bernama "speech.wav" dan Anda ingin mengenali ucapan di dalamnya, Anda dapat mencoba melakukan ini (hasilnya mungkin tidak terlalu bagus):
pocketsphinx single speech.wav
Jika masukan Anda dalam format lain, saya sarankan mengonversinya dengan sox
seperti dijelaskan di bawah.
Perintahnya adalah sebagai berikut:
help
: Cetak daftar panjang opsi yang tidak Anda pedulikan.
config
: Buang konfigurasi sebagai JSON ke keluaran standar (dapat dimuat dengan opsi -config
).
live
: Deteksi segmen ucapan di setiap masukan, jalankan pengenalan pada segmen tersebut (menggunakan opsi yang tidak Anda pedulikan), dan tulis hasilnya ke keluaran standar dalam JSON yang dibatasi baris. Saya menyadari ini bukan format tercantik, tapi jelas mengalahkan XML. Setiap baris berisi objek JSON dengan bidang berikut, yang memiliki nama pendek agar baris lebih mudah dibaca:
b
: Waktu mulai dalam hitungan detik, dari awal streaming
d
: Durasi dalam detik
p
: Perkiraan probabilitas hasil pengenalan, yaitu angka antara 0 dan 1 yang mewakili kemungkinan input sesuai model
t
: Teks lengkap hasil pengenalan
w
: Daftar segmen (biasanya kata), yang masing-masing berisi bidang b
, d
, p
, dan t
, untuk awal, akhir, probabilitas, dan teks kata. Jika -phone_align yes
telah dilewati, maka akan muncul kolom w
yang berisi segmentasi telepon, dalam format yang sama.
single
: Kenali setiap masukan sebagai satu ucapan, dan tulis objek JSON dalam format yang sama seperti yang dijelaskan di atas.
align
: Sejajarkan satu file masukan (atau -
untuk masukan standar) ke urutan kata, dan tulis objek JSON dalam format yang sama seperti dijelaskan di atas. Argumen posisi pertama adalah masukan, dan semua argumen berikutnya digabungkan untuk membuat teks, untuk menghindari kejutan jika Anda lupa mengutipnya. Anda bertanggung jawab untuk menormalkan teks untuk menghilangkan tanda baca, huruf besar, kelabang, dll. Misalnya:
pocketsphinx align goforward.wav "go forward ten meters"
Secara default, hanya penyelarasan tingkat kata yang dilakukan. Untuk mendapatkan penyelarasan telepon, berikan -phone_align yes
pada tandanya, misalnya:
pocketsphinx -phone_align yes align audio.wav $text
Ini tidak akan menghasilkan keluaran yang dapat dibaca, tetapi Anda dapat menggunakan jq untuk membersihkannya. Misalnya, Anda hanya bisa mendapatkan nama kata dan waktu mulai seperti ini:
pocketsphinx align audio.wav $text | jq '.w[]|[.t,.b]'
Atau Anda bisa mendapatkan nama telepon dan durasinya seperti ini:
pocketsphinx -phone_align yes align audio.wav $text | jq '.w[]|.w[]|[.t,.d]'
Tentu masih banyak kemungkinan lainnya.
soxflags
: Mengembalikan argumen ke sox
yang akan membuat format input yang sesuai. Perhatikan bahwa karena baris perintah sox
agak unik, baris perintah ini harus selalu muncul setelah nama file atau -d
(yang memberitahu sox
untuk membaca dari mikrofon). Anda dapat menjalankan pengenalan langsung seperti ini:
sox -d $(pocketsphinx soxflags) | pocketsphinx -
atau decode dari file bernama "audio.mp3" seperti ini:
sox audio.mp3 $(pocketsphinx soxflags) | pocketsphinx -
Secara default, hanya kesalahan yang dicetak ke kesalahan standar, tetapi jika Anda menginginkan informasi lebih lanjut, Anda dapat meneruskan -loglevel INFO
. Hasil sebagian tidak dicetak, mungkin di masa depan, tapi jangan menahan nafas.
Untuk pemrograman, lihat direktori contoh untuk sejumlah contoh penggunaan perpustakaan dari C dan Python. Anda juga dapat membaca dokumentasi untuk Python API atau C API
PocketSphinx pada akhirnya didasarkan pada Sphinx-II
yang pada gilirannya didasarkan pada beberapa sistem lama di Universitas Carnegie Mellon, yang dirilis sebagai perangkat lunak gratis di bawah lisensi mirip BSD berkat upaya Kevin Lenzo. Sebagian besar decoder khususnya ditulis oleh Ravishankar Mosur (cari "rkm" di komentar), tetapi berbagai orang lain juga berkontribusi, lihat file PENULIS untuk lebih jelasnya.
David Huggins-Daines (penulis dokumen ini) bertanggung jawab untuk membuat PocketSphinx
yang menambahkan berbagai optimasi kecepatan dan memori, komputasi titik tetap, dukungan JSGF, portabilitas ke berbagai platform, dan API yang agak koheren. Dia kemudian menghilang beberapa saat.
Nickolay Shmyrev mengambil alih pemeliharaan untuk waktu yang cukup lama setelahnya, dan banyak kode disumbangkan oleh Alexander Solovets, Vyacheslav Klimkov, dan lainnya.
Saat ini hal tersebut kembali dipertahankan oleh David Huggins-Daines.