Bot suara + telepon pada OpenSource penuh. Bagian 1 - membuat dan melatih bot teks RU



Saat ini, robot suara mendapatkan popularitas luar biasa, dari memesan taksi secara dangkal hingga menjual kepada pelanggan. Membuat bot suara turun ke tiga langkah dasar.



  1. Pengenalan suara ASR.
  2. Klarifikasi arti dari apa yang dikatakan dan mencari entitas yang diperlukan dalam teks (misalnya, alamat, jumlah, nama lengkap, dll.)
  3. Menghasilkan respon, mengubah teks menjadi TTS ucapan. Kami akan beralih dari cara membuat bot teks sederhana ke integrasi dengan sistem telepon freeswitch dengan pengenalan suara dan sulih suara dari respons yang disiapkan. Artikel ini menjelaskan alat yang digunakan dan cara mengintegrasikannya untuk membuat robot suara.


Di bagian pertama, kita akan berbicara tentang membuat bot teks sederhana yang dapat Anda sematkan dalam obrolan.



Contoh percakapan B-bot W-man



:       
:
: 

:    ?
: 

:  ?
:?     

:
:  


Sedikit teori



Bot bekerja berdasarkan prinsip maksud pengguna. Setiap niat memiliki daftar jawaban yang disiapkan. Agar bot dapat memahami maksud pengguna, maka perlu untuk melatih model pada dataset dengan maksud dan frase yang dapat mengaktifkan maksud ini



Misalnya



Niat: Katakan halo

Frase yang mungkin: halo, selamat siang, gratuti ...

Jawaban: Halo



Niat: Ucapkan selamat tinggal

Frase yang mungkin: Bye, bye , Selamat tinggal ...

Jawaban: Bye



Langkah 1: Memproses Dataset



Ini didasarkan pada kumpulan data dari pelatihan terbuka skillbox untuk menulis bot obrolan di telegram yang dapat berbicara dengan Anda tentang film. Saya tidak dapat mempostingnya karena alasan yang jelas.

Pra-pemrosesan adalah langkah yang sangat penting.



Langkah pertama adalah menghapus semua simbol dan angka dari teks dan memasukkan semuanya ke huruf kecil.



Selanjutnya, Anda perlu memperbaiki kesalahan ketik dan kesalahan kata.



 - 


Tugas ini tidak mudah, ada alat bagus dari Yandex bernama Speller, tetapi jumlah permintaannya terbatas per hari, jadi kami akan mencari alternatif gratis.Untuk

python ada perpustakaan jamspell yang bagus yang memperbaiki kesalahan ketik dengan baik. Ada model bahasa Rusia terlatih yang baik untuknya. Mari kita jalankan semua data masukan melalui pustaka ini. Untuk bot suara, langkah ini tidak terlalu relevan, karena sistem pengenalan ucapan tidak boleh memberikan kata-kata dengan kesalahan, itu dapat memberikan kata yang salah. Proses ini diperlukan untuk bot obrolan. Selain itu, untuk meminimalkan pengaruh kesalahan ketik, Anda dapat melatih jaringan tidak dalam kata-kata, tetapi dalam n-gram.



N-gram adalah n-huruf bagian kata. misalnya, 3-gram untuk kata halo akan menjadi

di, riv, willow, dokter hewan. Ini akan membantu Anda mengurangi ketergantungan pada kesalahan ketik dan meningkatkan akurasi pengenalan.



Selanjutnya, Anda perlu membawa kata ke bentuk normalnya, yang disebut proses lemmatization kata.



  -  


Perpustakaan rulemma sangat cocok untuk tugas ini .



Anda juga dapat menghapus kata-kata henti dari frasa yang memuat sedikit beban semantik, tetapi meningkatkan ukuran jaringan saraf (saya mengambil stopwords.words ("rusia") dari pustaka nltk), tetapi dalam kasus kami lebih baik tidak menghapusnya, karena pengguna dapat menjawab robot dengan hanya satu kata, tetapi bisa dari daftar kata berhenti.



Langkah 2: Mengubah dataset menjadi bentuk yang dapat dimengerti untuk NN



Pertama, Anda perlu membuat kamus dari semua kata dalam dataset.



Untuk melatih model, Anda perlu menerjemahkan semua kata menjadi oneHotVector

Ini adalah larik yang sama dengan panjang kamus kata, di mana semua nilai sama dengan 0 dan hanya satu yang sama dengan 1 pada posisi kata di kamus.



Selanjutnya, semua frasa masukan diubah menjadi larik 3 dimensi yang berisi semua frasa, frasa tersebut berisi daftar kata dalam format oneHotVector - ini akan menjadi set data masukan X_train kami.



Setiap frase masukan harus dicocokkan dengan maksud yang sesuai dalam format sameHotVector - ini adalah keluaran y_train kami.



Langkah 3: Membuat Model



Untuk bot kecil, model kecil dengan dua lapisan lstm dan dua lapisan yang terhubung sepenuhnya sudah cukup:



model = Sequential()
model.add(LSTM(64,return_sequences=True,input_shape=(description_length, num_encoder_tokens)))
model.add(LSTM(32))
model.add(Dropout(0.25))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(len(set(y)), activation='softmax'))


Kami menyusun model dan memilih pengoptimal, saya memilih adam karena memberikan hasil terbaik.



Langkah 4: Latih modelnya



Setelah menyiapkan set data dan mengompilasi model, Anda dapat mulai melatihnya. Karena set data kecil, saya harus melatih model untuk 250-500 epoch, setelah itu pelatihan ulang dilakukan.



Langkah 5: Mencoba berbicara dengan bot kami



Untuk berbicara dengan bot kami, Anda perlu mengirimkan data yang disiapkan dengan benar ke input model terlatih. Masukan pengguna perlu diproses dengan cara yang sama seperti set data dari langkah pertama. Kemudian mengubahnya menjadi bentuk yang dapat dimengerti NN seperti pada langkah kedua menggunakan kamus kata yang sama dan indeksnya sehingga kata-kata yang dimasukkan sesuai dengan kata-kata tempat pelatihan dilakukan.



Input yang diproses dimasukkan ke dalam model dan kami mendapatkan array nilai di mana probabilitas frasa kami mengenai niat tertentu ada, tetapi kami perlu memilih niat dengan probabilitas tertinggi, ini dapat dilakukan melalui perpustakaan numpy



np.argmax(results)


Penting untuk menilai kepercayaan jaringan dalam jawaban ini dan memilih ambang batas untuk mengeluarkan frasa kegagalan kepada pengguna, seperti - Saya tidak mengerti Anda. Untuk tujuan saya, saya menetapkan ambang batas kepercayaan 50%, di bawahnya bot akan mengatakan bahwa ia tidak memahami Anda.



Selanjutnya, dari daftar niat kami, kami memilih jawaban yang sesuai dan memberikannya kepada pengguna



NB: Model dapat dilatih tidak hanya berdasarkan kata, tetapi juga dengan membagi frasa menjadi huruf atau n-gram, dalam hal ini diperlukan model yang lebih serius.



model = Sequential()
model.add(LSTM(512,return_sequences=True,input_shape=(description_length, num_encoder_tokens)))
model.add(LSTM(256))
model.add(Dropout(0.25))
model.add(Dense(len(set(y)), activation='softmax'))



All Articles