Proyek ini terdiri dari dua bagian - bot suara dan server RESTful untuk berinteraksi dengannya.
Untuk menjalankan bot secara lokal, Anda perlu menjalankan python3 bot.py
(atau run_bot.sh
) dan memilih opsi operasi yang diinginkan di menu yang diusulkan (detail lebih lanjut di sini).
Untuk memulai server RESTful yang menyediakan antarmuka untuk berinteraksi dengan modul bot suara, Anda perlu menjalankan python3 rest_server.py
(atau run_rest_server.sh
) (detail lebih lanjut di sini).
Untuk membuat image buruh pelabuhan berdasarkan server RESTful, jalankan sudo docker build -t voice_chatbot:0.1 .
(detail lebih lanjut di sini).
PERHATIAN! Ini adalah proyek kelulusan saya, jadi arsitektur dan kode di sini tidak terlalu bagus, saya memahaminya, dan segera setelah saya punya waktu, saya akan memperbarui semuanya.
Daftar lengkap semua dependensi yang diperlukan untuk pengoperasian:
Voice_ChatBot_data.zip
(3Gb) secara manual dari Google Drive dan membongkarnya ke root proyek ( folder data
dan install_files
). Jika Anda menggunakan Ubuntu 16.04 atau lebih tinggi, Anda dapat menggunakan install_packages.sh
(diuji pada Ubuntu 16.04 dan 18.04) untuk menginstal semua paket. Secara default, TensorFlow untuk CPU akan diinstal. Jika Anda memiliki kartu grafis nvidia dengan driver resmi versi 410 terinstal, Anda dapat menginstal TensorFlowGPU. Untuk melakukan ini, Anda harus meneruskan parameter gpu
saat menjalankan install_packages.sh
. Misalnya:
./install_packages.sh gpu
Dalam hal ini, 2 arsip akan diunduh dari Google Drive saya:
Install_CUDA10.0_cuDNN_for410.zip
(2.0Gb) dengan CUDA 10.0 dan cuDNN 7.5.0 (jika parameter gpu
dilewati). Instalasi akan selesai secara otomatis, tetapi jika terjadi kesalahan, terdapat instruksi Install.txt
di arsip yang diunduh.Voice_ChatBot_data.zip
(3Gb) dengan data pelatihan dan model siap pakai. Ini akan secara otomatis dibongkar ke dalam folder data
dan install_files
di root proyek. Jika Anda tidak dapat atau tidak ingin menggunakan skrip untuk menginstal semua paket yang diperlukan, Anda harus menginstal RHVoice dan CMUclmtk_v0.7 secara manual menggunakan petunjuk di install_files/Install RHVoice.txt
dan install_files/Install CMUclmtk.txt
. Anda juga perlu menyalin file bahasa, model akustik, dan kamus untuk PocketSphinx dari temp/
ke /usr/local/lib/python3.6/dist-packages/pocketsphinx/model
(jalur Anda ke python3.6
mungkin berbeda). File model bahasa prepared_questions_plays_ru.lm
dan kamus prepared_questions_plays_ru.dic
harus diganti namanya menjadi ru_bot_plays_ru.lm
dan ru_bot_plays_ru.dic
(atau ubah namanya menjadi speech_to_text.py
jika Anda memiliki model bahasa dan kamus sendiri).
Bot ini didasarkan pada jaringan saraf berulang, model AttentionSeq2Seq. Pada implementasi saat ini terdiri dari 2 sel LSTM dua arah di encoder, satu lapisan perhatian, dan 2 sel LSTM di decoder. Penggunaan model perhatian memungkinkan Anda membuat korespondensi “lunak” antara urutan masukan dan keluaran, yang meningkatkan kualitas dan produktivitas. Dimensi masukan pada konfigurasi terakhir adalah 500 dan panjang urutannya adalah 26 (yaitu, panjang maksimum kalimat dalam set pelatihan). Kata-kata diubah menjadi vektor menggunakan encoder word2vec (dengan kamus 445.000 kata) dari perpustakaan gensim. Model seq2seq diimplementasikan menggunakan Keras dan RecurrentShop. Model seq2seq yang dilatih (bobotnya terletak di data/plays_ru/model_weights_plays_ru.h5
) dengan parameter yang ditentukan dalam file sumber memiliki akurasi 99,19% (yaitu bot akan menjawab 1577 dari 1601 pertanyaan dengan benar).
Saat ini terdapat 3 set data untuk melatih bot: 1601 pasang tanya jawab dari berbagai drama ( data/plays_ru
), 136.000 pasang dari berbagai karya ( data/conversations_ru
, terima kasih kepada NLP Datasets) dan 2.500.000 pasang dari subtitle untuk 347 serial TV ( data/subtitles_ru
, detail selengkapnya di kumpulan data subtitle Rusia). Model word2vec dilatih pada semua kumpulan data, tetapi jaringan saraf hanya dilatih pada kumpulan data playset.
Melatih model word2vec dan jaringan saraf pada kumpulan data pemutaran tanpa mengubah parameter memerlukan waktu sekitar 7,5 jam di nvidia GTX1070 dan intel core i7. Pelatihan kumpulan data dari karya dan subtitle pada perangkat keras ini akan berlangsung setidaknya beberapa hari.
Bot dapat bekerja dalam beberapa mode:
Set pelatihan terdiri dari 1600 pasangan pertanyaan %% jawaban yang diambil dari berbagai drama Rusia. Itu disimpan dalam file data/plays_ru/plays_ru.txt
. Setiap pasangan pertanyaan %% jawaban ditulis pada baris baru, mis. Hanya ada satu pasangan dalam satu baris.
Semua tahapan yang diperlukan untuk pelatihan dilakukan dengan metode prepare()
atau load_prepared()
dan train()
dari kelas TextToText
dari modul text_to_text.py
dan metode build_language_model()
dari kelas LanguageModel
dari modul preparing_speech_to_text.py
. Atau Anda dapat menggunakan fungsi train()
dari modul bot.py
Untuk menjalankan bot dalam mode pelatihan, Anda perlu menjalankan bot.py
dengan parameter train
. Misalnya seperti ini:
python3 bot.py train
Atau Anda cukup menjalankan bot.py
(atau run_bot.sh
) dan memilih mode 1 dan 1 dari menu yang diusulkan.
Proses pembelajaran terdiri dari beberapa tahap:
1. Persiapan sampel pelatihan.
Untuk mempersiapkan sampel pelatihan, modul source_to_prepared.py
, yang terdiri dari kelas SourceToPrepared
, digunakan. Kelas ini membaca set pelatihan dari file, memisahkan pertanyaan dan jawaban, menghapus karakter dan tanda baca yang tidak didukung, dan mengubah pertanyaan dan jawaban yang dihasilkan menjadi urutan berukuran tetap (menggunakan kata pengisi <PAD>
). Kelas ini juga menyiapkan pertanyaan untuk jaringan dan memproses tanggapannya. Misalnya:
Input: "Зачем нужен этот класс? %% Для подготовки данных"
Keluaran: [['<PAD>', ..., '<PAD>', '?', 'класс', 'этот', 'нужен', 'Зачем', '<GO>'], ['Для', 'подготовки', 'данных', '<EOS>', '<PAD>', ..., '<PAD>']]
Sampel pelatihan dibaca dari file data/plays_ru/plays_ru.txt
, pasangan [pertanyaan, jawaban] yang dikonversi disimpan dalam file data/plays_ru/prepared_plays_ru.pkl
. Histogram ukuran pertanyaan dan jawaban juga dibuat, yang disimpan di data/plays_ru/histogram_of_sizes_sentences_plays_ru.png
.
Untuk menyiapkan sampel pelatihan dari kumpulan data berdasarkan permainan, cukup berikan nama file terkait ke metode prepare_all()
. Untuk menyiapkan sampel pelatihan dari kumpulan data berdasarkan karya atau subjudul, Anda harus memanggil combine_conversations()
atau combine_subtitles()
terlebih dahulu, lalu memanggil preapre_all()
.
2. Penerjemahan kata menjadi vektor nyata.
Modul word_to_vec.py
, yang terdiri dari kelas WordToVec
, bertanggung jawab untuk tahap ini. Kelas ini mengkodekan urutan berukuran tetap (yaitu pertanyaan dan jawaban kita) menjadi vektor nyata. Encoder word2vec dari perpustakaan gensim digunakan. Kelas mengimplementasikan metode untuk menyandikan semua pasangan [pertanyaan, jawaban] dari set pelatihan ke dalam vektor sekaligus, serta untuk menyandikan pertanyaan ke jaringan dan mendekode jawabannya. Misalnya:
Masukan: [['<PAD>', ..., '<PAD>', '?', 'класс', 'этот', 'нужен', 'Зачем', '<GO>'], ['Для', 'кодирования', 'предложений', '<EOS>', '<PAD>', ..., '<PAD>']]
Keluaran: [[[0.43271607, 0.52814275, 0.6504923, ...], [0.43271607, 0.52814275, 0.6504923, ...], ...], [[0.5464854, 1.01612, 0.15063584, ...], [0.88263285, 0.62758327, 0.6659863, ...], ...]]
(yaitu setiap kata dikodekan sebagai vektor dengan panjang 500 (nilai ini dapat diubah, argumen size
dalam metode build_word2vec()
))
Pasangan [pertanyaan, jawaban] dibaca dari file data/plays_ru/prepared_plays_ru.pkl
(yang diperoleh pada tahap sebelumnya; untuk memperluas dan meningkatkan kualitas model, disarankan untuk meneruskan kumpulan data yang telah diproses sebelumnya dari data/subtitles_ru/prepared_subtitles_ru.pkl
subtitle data/subtitles_ru/prepared_subtitles_ru.pkl
ke metode build_word2vec()
) , pasangan yang dikodekan disimpan ke file data/plays_ru/encoded_plays_ru.npz
. Juga, selama proses kerja, daftar semua kata yang digunakan dibuat, mis. kamus, yang disimpan dalam file data/plays_ru/w2v_vocabulary_plays_ru.txt
. Model word2vec yang dilatih juga disimpan di data/plays_ru/w2v_model_plays_ru.bin
.
Untuk menerjemahkan kata dari set pelatihan menjadi vektor, cukup berikan nama file yang sesuai ke metode build_word2vec()
dan atur parameter yang diinginkan.
3. Pelatihan jaringan.
Pada tahap ini, model seq2seq dilatih berdasarkan data yang telah disiapkan sebelumnya. Modul text_to_text.py
, yang terdiri dari kelas TextToText
, bertanggung jawab untuk ini. Kelas ini melatih jaringan, menyimpan model jaringan dan koefisien bobot, serta memungkinkan Anda berinteraksi dengan mudah dengan model yang dilatih.
Untuk pelatihan, Anda memerlukan file data/plays_ru/encoded_plays_ru.npz
yang berisi pasangan [pertanyaan, jawaban] yang dikodekan ke dalam vektor yang diperoleh pada tahap sebelumnya. Selama proses pelatihan, setelah setiap epoch ke-5 (nilai ini dapat diubah), hasil antara pelatihan jaringan yang ekstrem disimpan dalam file data/plays_ru/model_weights_plays_ru_[номер_итерации].h5
, dan pada iterasi terakhir dalam file data/plays_ru/model_weights_plays_ru.h5
(iterasi - satu siklus pelatihan jaringan, sejumlah periode tertentu, setelah itu bobot disimpan ke file dan Anda dapat, misalnya, mengevaluasi keakuratan jaringan atau menampilkan lainnya parameter. Secara default, jumlah epoch adalah 5, dan jumlah total iterasi adalah 200). Model jaringan disimpan dalam file data/plays_ru/model_plays_ru.json
.
Setelah jaringan dilatih, kualitas pelatihan dinilai dengan mengajukan semua pertanyaan ke masukan jaringan yang dilatih dan membandingkan jawaban jaringan dengan jawaban standar dari set pelatihan. Jika keakuratan model estimasi lebih tinggi dari 75%, maka jawaban yang salah dari jaringan disimpan ke file data/plays_ru/wrong_answers_plays_ru.txt
(sehingga dapat dianalisis nanti).
Untuk melatih jaringan, cukup berikan nama file terkait ke metode train()
dan atur parameter yang diinginkan.
4. Membangun model bahasa dan kamus untuk PocketSphinx.
Tahap ini diperlukan jika pengenalan suara akan digunakan. Pada tahap ini, model bahasa statis dan kamus fonetik untuk PocketSphinx dibuat berdasarkan pertanyaan dari set pelatihan (perhatian: semakin banyak pertanyaan di set pelatihan, semakin lama waktu yang dibutuhkan PocketSphinx untuk mengenali ucapan). Untuk melakukan hal ini, gunakan metode build_language_model()
(yang mengakses text2wfreq, wfreq2vocab, text2idngram
dan idngram2lm
dari CMUclmtk_v0.7) kelas LanguageModel
dari modul preparing_speech_to_text.py
. Metode ini menggunakan pertanyaan dari file dengan set pelatihan asli (sebelum disiapkan oleh modul source_to_prepared.py
), menyimpan model bahasa dalam file temp/prepared_questions_plays_ru.lm
, dan kamus di temp/prepared_questions_plays_ru.dic
( plays_ru
may berubah tergantung pada set pelatihan apa yang digunakan). Di akhir pekerjaan, model bahasa dan kamus akan disalin ke /usr/local/lib/python3.х/dist-packages/pocketsphinx/model
dengan nama ru_bot_plays_ru.lm
dan ru_bot_plays_ru.dic
( plays_ru
dapat berubah di sama seperti pada tahap sebelumnya, Anda harus memasukkan kata sandi pengguna root).
Untuk berinteraksi dengan model seq2seq yang dilatih, fungsi predict()
dimaksudkan (yang merupakan pembungkus metode predict()
kelas TextToText
dari modul text_to_text.py
) dari modul bot.py
Fungsi ini mendukung beberapa mode pengoperasian. Dalam mode teks, mis. Saat pengguna memasukkan pertanyaan dari keyboard dan jaringan merespons dengan teks, hanya metode predict()
kelas TextToText
dari modul text_to_text.py
yang digunakan. Metode ini menerima string berisi pertanyaan ke jaringan dan mengembalikan string dengan respons jaringan. Agar berfungsi, Anda memerlukan: file data/plays_ru/w2v_model_plays_ru.bin
dengan model word2vec yang dilatih, file data/plays_ru/model_plays_ru.json
dengan parameter model jaringan, dan file data/plays_ru/model_weights_plays_ru.h5
dengan bobot jaringan yang dilatih.
Untuk menjalankan bot dalam mode ini, Anda perlu menjalankan bot.py
dengan parameter predict
. Misalnya seperti ini:
python3 bot.py predict
Anda juga dapat menjalankan bot.py
(atau menjalankan run_bot.sh
) dan memilih mode 2 dan 1 di menu yang diusulkan.
Mode ini berbeda dari mode sebelumnya karena parameter speech_synthesis = True
diteruskan ke fungsi predict()
modul bot.py
Artinya, interaksi dengan jaringan akan berjalan dengan cara yang sama seperti pada mode 2, namun respons jaringan juga akan disuarakan.
Menyuarakan jawaban, mis. sintesis ucapan, diimplementasikan dalam metode get()
kelas TextToSpeech
dari modul text_to_speech.py
. Kelas ini memerlukan RHVoice-client untuk diinstal dan, menggunakan argumen baris perintah, meneruskan parameter yang diperlukan untuk sintesis ucapan (Anda dapat melihat tentang menginstal RHVoice dan contoh mengakses RHVoice-client di install_files/Install RHVoice.txt
). Metode get()
mengambil input string yang perlu diubah menjadi ucapan, dan, jika diperlukan, nama file .wav tempat ucapan yang disintesis akan disimpan (dengan laju pengambilan sampel 32 kHz dan kedalaman 16 bit, mono; jika tidak ditentukan, ucapan akan diputar segera setelah sintesis). Saat membuat objek kelas TextToSpeech
, Anda bisa menentukan nama suara yang akan digunakan. 4 suara didukung: Aleksandr laki-laki dan tiga perempuan - Anna, Elena dan Irina (detail lebih lanjut di RHVoice Wiki).
Untuk menjalankan bot dalam mode ini, Anda perlu menjalankan bot.py
dengan parameter predict -ss
. Misalnya seperti ini:
python3 bot.py predict -ss
Anda juga dapat menjalankan bot.py
(atau menjalankan run_bot.sh
) dan memilih mode 3 dan 1 di menu yang diusulkan.
Untuk bekerja dalam mode ini, Anda perlu meneruskan parameter speech_recognition = True
ke fungsi predict()
modul bot.py
Artinya interaksi dengan jaringan, atau lebih tepatnya memasukkan pertanyaan, akan dilakukan menggunakan suara.
Pengenalan ucapan diimplementasikan dalam metode get()
kelas SpeechToText
dari modul speech_to_text.py
. Kelas ini menggunakan PocketSphinx dan model bahasa dengan kamus ( ru_bot_plays_ru.lm
dan ru_bot_plays_ru.dic
), yang dibangun dalam mode pelatihan jaringan. Metode get()
dapat bekerja dalam dua mode: from_file
- pengenalan ucapan dari file .wav atau .opus dengan frekuensi sampling >=16 kHz, 16bit, mono (nama file diteruskan sebagai argumen fungsi) dan from_microphone
- ucapan pengenalan dari mikrofon. Mode operasi diatur saat membuat instance kelas SpeechRecognition
, karena Memuat model bahasa memerlukan waktu (semakin besar model, semakin lama waktu yang dibutuhkan untuk memuat).
Untuk menjalankan bot dalam mode ini, Anda perlu menjalankan bot.py
dengan parameter predict -sr
. Misalnya seperti ini:
python3 bot.py predict -sr
Anda juga dapat menjalankan bot.py
(atau menjalankan run_bot.sh
) dan memilih mode 4 dan 1 di menu yang diusulkan.
Ini adalah kombinasi mode 3 dan 4.
Untuk bekerja dalam mode ini, Anda perlu meneruskan parameter speech_recognition = True
dan speech_synthesis = True
ke fungsi predict()
modul bot.py
Artinya, pertanyaan akan dimasukkan menggunakan suara, dan tanggapan jaringan akan diucapkan. Penjelasan mengenai modul yang digunakan dapat dilihat pada deskripsi mode 3 dan 4.
Untuk menjalankan bot dalam mode ini, Anda perlu menjalankan bot.py
dengan parameter predict -ss -sr
. Misalnya seperti ini:
python3 bot.py predict -sr -ss
atau
python3 bot.py predict -ss -sr
Anda juga dapat menjalankan bot.py
(atau menjalankan run_bot.sh
) dan memilih mode 5 dan 1 di menu yang diusulkan.
Server ini menyediakan api REST untuk berinteraksi dengan bot. Saat server dimulai, jaringan saraf yang dilatih pada kumpulan data dari permainan dimuat. Kumpulan data dari karya dan subtitel belum didukung.
Server diimplementasikan menggunakan Flask, dan mode multi-threaded (versi produksi) menggunakan gevent.pywsgi.WSGIServer. Server juga memiliki batasan ukuran data yang diterima di badan permintaan sebesar 16 MB. Implementasinya ada di modul rest_server.py
.
Anda dapat memulai server WSGI dengan menjalankan run_rest_server.sh
(memulai server WSGI pada 0.0.0.0:5000
).
Server mendukung argumen baris perintah, yang membuat permulaannya sedikit lebih mudah. Argumennya memiliki struktur berikut: [ключ(-и)] [адрес:порт]
.
Kunci yang mungkin:
-d
- meluncurkan server uji Flask (jika kunci tidak ditentukan, server WSGI akan diluncurkan)-s
- memulai server dengan dukungan https (menggunakan sertifikat yang ditandatangani sendiri, diperoleh menggunakan openssl) адрес:порт
:
host:port
- diluncurkan pada host
dan port
yang ditentukanlocaladdr:port
- diluncurkan dengan deteksi otomatis alamat mesin di jaringan lokal dan port
yang ditentukanhost:0
atau localaddr:0
- jika port = 0
, maka port apa pun yang tersedia akan dipilih secara otomatisDaftar kemungkinan kombinasi argumen baris perintah dan deskripsinya:
5000
. Misalnya: python3 rest_server.py
host:port
- meluncurkan server WSGI pada host
dan port
yang ditentukan. Misalnya: python3 rest_server.py 192.168.2.102:5000
-d
- meluncurkan server percobaan Flask pada 127.0.0.1:5000
. Misalnya: python3 rest_server.py -d
-d host:port
- meluncurkan server uji Flask pada host
dan port
yang ditentukan. Misalnya: python3 rest_server.py -d 192.168.2.102:5000
-d localaddr:port
- meluncurkan server uji Flask dengan deteksi otomatis alamat mesin di jaringan lokal dan port
port . Misalnya: python3 rest_server.py -d localaddr:5000
-s
- meluncurkan server WSGI dengan dukungan https, deteksi otomatis alamat mesin di jaringan lokal dan port 5000
. Misalnya: python3 rest_server.py -s
-s host:port
- meluncurkan server WSGI dengan dukungan https pada host
dan port
yang ditentukan. Misalnya: python3 rest_server.py -s 192.168.2.102:5000
-s -d
- meluncurkan server percobaan Flask dengan dukungan https pada 127.0.0.1:5000
. Misalnya: python3 rest_server.py -s -d
-s -d host:port
- meluncurkan server percobaan Flask dengan dukungan https pada host
dan port
yang ditentukan. Misalnya: python3 rest_server.py -s -d 192.168.2.102:5000
-s -d localaddr:port
- meluncurkan server uji Flask dengan dukungan https, deteksi otomatis alamat mesin di jaringan lokal dan port port
. Misalnya: python3 rest_server.py -s -d localaddr:5000
Server dapat memilih sendiri port yang tersedia; untuk melakukan ini, Anda perlu menentukan port 0
di host:port
atau localaddr:port
(misalnya: python3 rest_server.py -d localaddr:0
).
Total 5 kueri didukung:
/chatbot/about
akan mengembalikan informasi tentang proyek/chatbot/questions
akan mengembalikan daftar semua pertanyaan yang didukung/chatbot/speech-to-text
, menerima file .wav/.opus dan mengembalikan string yang dikenali/chatbot/text-to-speech
, mengambil string dan mengembalikan file .wav dengan ucapan yang disintesis/chatbot/text-to-text
, menerima string dan mengembalikan respons bot sebagai string 1. Server memiliki otorisasi http dasar. Itu. Untuk mendapatkan akses ke server, Anda perlu menambahkan header ke setiap permintaan yang berisi login:password, dikodekan menggunakan base64
(login: bot
, password: test_bot
). Contoh dalam python:
import requests
import base64
auth = base64.b64encode('testbot:test'.encode())
headers = {'Authorization' : "Basic " + auth.decode()}
Ini akan terlihat seperti ini:
Authorization: Basic dGVzdGJvdDp0ZXN0
2. Dalam permintaan pengenalan suara (yaitu nomor 3), server mengharapkan file .wav atau .opus (>=16kHz 16bit mono) dengan rekaman ucapan, yang juga ditransmisikan ke json menggunakan pengkodean base64
(yaitu membuka .wav / File .opus, dibaca ke dalam array byte, kemudian dikodekan base64
, array yang dihasilkan didekodekan dari bentuk byte menjadi string utf-8
dan ditempatkan di json), dengan python tampilannya seperti ini:
# Формирование запроса
auth = base64.b64encode('testbot:test'.encode())
headers = {'Authorization' : "Basic " + auth.decode()}
with open('test.wav', 'rb') as audio:
data = audio.read()
data = base64.b64encode(data)
data = {'wav' : data.decode()}
# Отправка запроса серверу
r = requests.post('http://' + addr + '/chatbot/speech-to-text', headers=headers, json=data)
# Разбор ответа
data = r.json()
data = data.get('text')
print(data)
3. Dalam permintaan sintesis ucapan (yaitu nomor 4), server akan mengirimkan respons json dengan file .wav (16bit 32kHz mono) dengan ucapan yang disintesis, yang dikodekan seperti dijelaskan di atas (untuk mendekodekannya kembali, Anda perlu melakukannya dapatkan dari json string yang diinginkan ke dalam array byte, lalu dekode menggunakan base64
dan tulis ke file atau aliran untuk diputar nanti), contoh dengan python:
# Формирование запроса
auth = base64.b64encode('testbot:test'.encode())
headers = {'Authorization' : "Basic " + auth.decode()}
data = {'text':'который час'}
# Отправка запроса серверу
r = requests.post('http://' + addr + '/chatbot/text-to-speech', headers=headers, json=data)
# Разбор ответа
data = r.json()
data = base64.b64decode(data.get('wav'))
with open('/home/vladislav/Проекты/Voice chat bot/temp/answer.wav', 'wb') as audio:
audio.write(data)
Semua data yang dikirimkan dibungkus dalam json (termasuk respons dengan kesalahan).
{
"text" : "Информация о проекте."
}
{
"text" : ["Вопрос 1",
"Вопрос 2",
"Вопрос 3"]
}
{
"wav" : "UklGRuTkAABXQVZFZm10IBAAAAABAAEAAH..."
}
atau
{
"opus" : "ZFZm10IBUklQVZFZm10IBARLASBAAEOpH..."
}
Server akan mengirimnya:
{
"text" : "который час"
}
{
"text" : "который час"
}
Server akan mengirimnya:
{
"wav" : "UklGRuTkAABXQVZFZm10IBAAAAABAAEAAH..."
}
{
"text" : "прощай"
}
Server akan mengirimnya:
{
"text" : "это снова я"
}
1. DAPATKAN permintaan ke /chatbot/about
Contoh permintaan yang dihasilkan oleh python-requests
:
GET /chatbot/about HTTP/1.1
Host: 192.168.2.83:5000
Connection: keep-alive
Accept-Encoding: gzip, deflate
Authorization: Basic dGVzdGJvdDp0ZXN0
User-Agent: python-requests/2.9.1
Contoh permintaan yang dihasilkan curl ( curl -v -u testbot:test -i http://192.168.2.83:5000/chatbot/about
):
GET /chatbot/about HTTP/1.1
Host: 192.168.2.83:5000
Authorization: Basic dGVzdGJvdDp0ZXN0
User-Agent: curl/7.47.0
Dalam kedua kasus tersebut, server merespons:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 305
Date: Fri, 02 Nov 2018 15:13:21 GMT
{
"text" : "Информация о проекте."
}
2. DAPATKAN permintaan ke /chatbot/questions
Contoh permintaan yang dihasilkan oleh python-requests
:
GET /chatbot/questions HTTP/1.1
Host: 192.168.2.83:5000
Authorization: Basic dGVzdGJvdDp0ZXN0
User-Agent: python-requests/2.9.1
Connection: keep-alive
Accept-Encoding: gzip, deflate
Contoh permintaan yang dihasilkan curl ( curl -v -u testbot:test -i http://192.168.2.83:5000/chatbot/questions
):
GET /chatbot/questions HTTP/1.1
Host: 192.168.2.83:5000
Authorization: Basic dGVzdGJvdDp0ZXN0
User-Agent: curl/7.47.0
Dalam kedua kasus tersebut, server merespons:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1086
Date: Fri, 02 Nov 2018 15:43:06 GMT
{
"text" : ["Что случилось?",
"Срочно нужна твоя помощь.",
"Ты уезжаешь?",
...]
}
3. POST permintaan ke /chatbot/speech-to-text
Contoh permintaan yang dihasilkan oleh python-requests
:
POST /chatbot/speech-to-text HTTP/1.1
Host: 192.168.2.83:5000
User-Agent: python-requests/2.9.1
Accept: */*
Content-Length: 10739
Connection: keep-alive
Content-Type: application/json
Authorization: Basic dGVzdGJvdDp0ZXN0
Accept-Encoding: gzip, deflate
{
"wav" : "UklGRuTkAABXQVZFZm10IBAAAAABAAEAAH..."
}
Contoh permintaan yang dihasilkan curl ( curl -v -u testbot:test -i -H "Content-Type: application/json" -X POST -d '{"wav":"UklGRuTkAABXQVZFZm10IBAAAAABAAEAAH..."}' http://192.168.2.83:5000/chatbot/speech-to-text
):
POST /chatbot/speech-to-text HTTP/1.1
Host: 192.168.2.83:5000
Authorization: Basic dGVzdGJvdDp0ZXN0
User-Agent: curl/7.47.0
Accept: */*
Content-Type: application/json
Content-Length: 10739
{
"wav" : "UklGRuTkAABXQVZFZm10IBAAAAABAAEAAH..."
}
Server menjawab:
HTTP/1.1 200 OK
Content-Length: 81
Date: Fri, 02 Nov 2018 15:57:13 GMT
Content-Type: application/json
{
"text" : "Распознные слова из аудиозаписи"
}
4. POST permintaan ke /chatbot/text-to-speech
Contoh permintaan yang dihasilkan oleh python-requests
:
POST /chatbot/text-to-speech HTTP/1.1
Host: 192.168.2.83:5000
Connection: keep-alive
Accept: */*
User-Agent: python-requests/2.9.1
Accept-Encoding: gzip, deflate
Content-Type: application/json
Content-Length: 73
Authorization: Basic dGVzdGJvdDp0ZXN0
{
"text" : "который час"
}
Contoh permintaan yang dihasilkan curl ( curl -v -u testbot:test -i -H "Content-Type: application/json" -X POST -d '{"text":"который час"}' http://192.168.2.83:5000/chatbot/text-to-speech
):
POST /chatbot/text-to-speech HTTP/1.1
Host: 192.168.2.83:5000
Authorization: Basic dGVzdGJvdDp0ZXN0
User-Agent: curl/7.47.0
Accept: */*
Content-Type: application/json
Content-Length: 32
{
"text" : "который час"
}
Server menjawab:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 78151
Date: Fri, 02 Nov 2018 16:36:02 GMT
{
"wav" : "UklGRuTkAABXQVZFZm10IBAAAAABAAEAAH..."
}
5. POST permintaan ke /chatbot/text-to-text
Contoh permintaan yang dihasilkan oleh python-requests
:
POST /chatbot/text-to-text HTTP/1.1
Host: 192.168.2.83:5000
Accept-Encoding: gzip, deflate
Content-Type: application/json
User-Agent: python-requests/2.9.1
Connection: keep-alive
Content-Length: 48
Accept: */*
Authorization: Basic dGVzdGJvdDp0ZXN0
{
"text" : "прощай"
}
Contoh permintaan yang dihasilkan oleh curl ( curl -v -u testbot:test -i -H "Content-Type: application/json" -X POST -d '{"text":"прощай"}' http://192.168.2.83:5000/chatbot/text-to-text
):
POST /chatbot/text-to-text HTTP/1.1
Host: 192.168.2.83:5000
Authorization: Basic dGVzdGJvdDp0ZXN0
User-Agent: curl/7.47.0
Accept: */*
Content-Type: application/json
Content-Length: 23
{
"text" : "прощай"
}
Server menjawab:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 68
Date: Fri, 02 Nov 2018 16:41:22 GMT
{
"text" : "это снова я"
}
Proyek ini berisi Dockerfile, yang memungkinkan Anda membuat image buruh pelabuhan berdasarkan proyek ini. Jika Anda menggunakan install_packages.sh
untuk menginstal semua dependensi dan Anda belum menginstal Docker sebelumnya, Anda perlu menginstalnya secara manual. Misalnya seperti ini (diuji pada Ubuntu 16.04-18.04):
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main' -y
sudo apt-get -y update
sudo apt-get install -y docker-engine
Setelah instalasi, jalankan sudo systemctl status docker
untuk memastikan semuanya terinstal dan berfungsi (dalam output perintah ini Anda akan menemukan baris dengan teks hijau active (running)
).
Untuk membuat image, Anda perlu membuka folder dengan proyek di terminal dan menjalankan ( -t
- luncurkan terminal, .
- direktori tempat pembuatan docker dipanggil (titik - ini berarti semua file untuk image ada di direktori saat ini), voice_chatbot:0.1
- label gambar dan versinya):
sudo docker build -t voice_chatbot:0.1 .
Setelah berhasil menyelesaikan operasi ini, Anda dapat membuat daftar gambar yang tersedia dengan menjalankan:
sudo docker images
Dalam daftar yang dihasilkan Anda akan melihat gambar kami - voice_chatbot:0.1
.
Sekarang Anda dapat menjalankan gambar ini ( -t
- memulai terminal, -i
- mode interaktif, --rm
- menghapus wadah setelah selesai, -p 5000:5000
- meneruskan semua koneksi pada port 5000 ke mesin host ke wadah pada port 5000 (Anda juga dapat secara eksplisit menentukan alamat lain yang perlu Anda sambungkan secara eksternal, misalnya: -p 127.0.0.1:5000:5000
)):
sudo docker run -ti --rm -p 5000:5000 voice_chatbot:0.1
Hasilnya, server RESTful akan dimulai pada 0.0.0.0:5000
dan Anda dapat mengaksesnya di alamat yang ditentukan di terminal (jika Anda tidak menentukan alamat lain saat memulai image).
Catatan : gambar buruh pelabuhan yang dirakit berbobot 5,2 GB. File sumber proyek juga menyertakan file .dockerignore
, yang berisi nama file yang tidak perlu ditambahkan ke gambar. Untuk meminimalkan ukuran gambar akhir, semua file yang terkait dengan kumpulan data dari cerita dan subtitle, file dengan hasil antara pemrosesan data dan pelatihan jaringan saraf dikeluarkan darinya. Artinya, gambar hanya berisi file jaringan terlatih dan kumpulan data sumber mentah.
Untuk berjaga-jaga, file sumber proyek berisi file command_for_docker.txt
yang berisi kumpulan perintah minimum yang diperlukan untuk bekerja dengan buruh pelabuhan.
Jika Anda memiliki pertanyaan atau ingin berkolaborasi, Anda dapat menulis kepada saya di [email protected] atau di LinkedIn.