該專案由兩部分組成 - 語音機器人和用於與其互動的 RESTful 伺服器。
要在本機上運行機器人,您需要運行python3 bot.py
(或run_bot.sh
)並在建議的選單中選擇所需的操作選項(更多詳細資訊請參見此處)。
要啟動提供與語音機器人模組互動的介面的 RESTful 伺服器,您需要執行python3 rest_server.py
(或run_rest_server.sh
)(更多詳細資訊請參閱此處)。
若要建置基於 RESTful 伺服器的 docker 映像,請執行sudo docker build -t voice_chatbot:0.1 .
(更多詳細資訊請參閱此處)。
注意力!這是我的畢業設計,所以這裡的架構和程式碼不是很好,我理解這一點,一旦有時間,我會更新所有內容。
操作所需的所有依賴項的完整清單:
Voice_ChatBot_data.zip
(3Gb),並將其解壓縮到專案的根目錄( data
和install_files
資料夾)。如果您使用的是 Ubuntu 16.04 或更高版本,則可以使用install_packages.sh
(在 Ubuntu 16.04 和 18.04 上測試)來安裝所有軟體套件。預設情況下,將安裝適用於 CPU 的 TensorFlow。如果您有安裝了官方驅動程式版本410的nvidia顯示卡,則可以安裝TensorFlowGPU。為此,您需要在執行install_packages.sh
時傳遞gpu
參數。例如:
./install_packages.sh gpu
在這種情況下,將從我的 Google 雲端硬碟下載 2 個檔案:
Install_CUDA10.0_cuDNN_for410.zip
(2.0Gb)(如果傳遞了gpu
參數)。安裝會自動完成,但如果出現問題,下載的檔案中有一個Install.txt
指令。Voice_ChatBot_data.zip
(3Gb) 包含訓練資料和現成的模型。它將自動解壓縮到專案根目錄中的data
和install_files
資料夾中。如果您無法或不想使用腳本安裝所有必要的軟體包,則必須使用install_files/Install RHVoice.txt
和install_files/Install CMUclmtk.txt
中的說明手動安裝 RHVoice 和 CMUclmtk_v0.7。您還需要將 PocketSphinx 的語言、聲學模型和字典檔案從temp/
複製到/usr/local/lib/python3.6/dist-packages/pocketsphinx/model
(您的python3.6
路徑可能不同)。語言模型prepared_questions_plays_ru.lm
和字典prepared_questions_plays_ru.dic
的檔案必須重新命名為ru_bot_plays_ru.lm
和ru_bot_plays_ru.dic
(如果您有自己的語言模型和字典,則將其名稱更改為speech_to_text.py
)。
該機器人基於循環神經網路 AttentionSeq2Seq 模型。在目前的實作中,它由編碼器中的 2 個雙向 LSTM 單元、一個注意力層和解碼器中的 2 個 LSTM 單元組成。使用注意力模型可以讓您在輸入和輸出序列之間建立「軟」對應關係,從而提高品質和生產力。最後一個配置中的輸入維度為500,序列長度為26(即訓練集中句子的最大長度)。使用 gensim 庫中的 word2vec 編碼器(帶有 445,000 個單字的字典)將單字轉換為向量。 seq2seq 模型是使用 Keras 和 RecurrentShop 來實現的。使用原始檔案中指定的參數訓練的 seq2seq 模型(其權重位於data/plays_ru/model_weights_plays_ru.h5
)的準確度為 99.19%(即機器人將正確回答 1601 個問題中的 1577 個問題)。
目前,有 3 組資料用於訓練機器人:來自各種戲劇的 1601 個問答對( data/plays_ru
)、來自各種作品的 136,000 對( data/conversations_ru
,感謝 NLP 資料集)和來自字幕的 2,500,000 對347部電視劇( data/subtitles_ru
,更多詳細資訊請參閱俄語字幕資料集)。 word2vec 模型在所有資料集上進行訓練,但神經網路僅在 playsets 資料集上進行訓練。
在 nvidia gtx1070 和 intel core i7 上,在不更改參數的情況下在戲劇資料集上訓練 word2vec 模型和神經網路大約需要 7.5 小時。在該硬體上對作品和字幕資料集的訓練將持續至少幾天。
該機器人可以在多種模式下工作:
訓練集由取自各種俄羅斯戲劇的 1600 個問題 %% 答案對組成。它儲存在檔案data/plays_ru/plays_ru.txt
中。每對問題 %% 答案都寫在一個新行上,即一條線上只有一對。
訓練所需的所有階段均由text_to_text.py
模組中TextToText
類別的prepare()
或load_prepared()
和train()
方法以及preparing_speech_to_text.py
模組中LanguageModel
類別的build_language_model()
方法執行。或者您可以使用bot.py
模組的train()
函數。
要在訓練模式下運行機器人,您需要使用train
參數來運行bot.py
例如,像這樣:
python3 bot.py train
或者您可以簡單地執行bot.py
(或run_bot.sh
)並從建議的選單中選擇模式 1 和 1。
學習過程由幾個階段組成:
1.訓練樣本的準備。
為了準備訓練樣本,使用了由SourceToPrepared
類別組成的source_to_prepared.py
模組。此類別從檔案中讀取訓練集,分離問題和答案,刪除不支援的字元和標點符號,並將生成的問題和答案轉換為固定大小的序列(使用<PAD>
填充詞)。此類也為網路準備問題並處理其回應。例如:
輸入: "Зачем нужен этот класс? %% Для подготовки данных"
輸出: [['<PAD>', ..., '<PAD>', '?', 'класс', 'этот', 'нужен', 'Зачем', '<GO>'], ['Для', 'подготовки', 'данных', '<EOS>', '<PAD>', ..., '<PAD>']]
訓練樣本從檔案data/plays_ru/plays_ru.txt
中讀取,轉換後的[問題,答案]對保存在檔案data/plays_ru/prepared_plays_ru.pkl
中。此外,還建立了問題和答案大小的直方圖,並將其保存在data/plays_ru/histogram_of_sizes_sentences_plays_ru.png
中。
要從基於播放的資料集中準備訓練樣本,只需將對應檔案的名稱傳遞給prepare_all()
方法即可。若要從基於作品或字幕的資料集準備訓練樣本,您必須先呼叫combine_conversations()
或combine_subtitles()
,然後呼叫preapre_all()
。
2. 將單字翻譯成實數向量。
由WordToVec
類別組成的word_to_vec.py
模組負責此階段。此類別將固定大小的序列(即我們的問題和答案)編碼為真實向量。使用 gensim 庫中的 word2vec 編碼器。該類別實現了將訓練集中的所有[問題,答案]對一次性編碼為向量的方法,以及將問題編碼到網路並解碼其答案的方法。例如:
輸入: [['<PAD>', ..., '<PAD>', '?', 'класс', 'этот', 'нужен', 'Зачем', '<GO>'], ['Для', 'кодирования', 'предложений', '<EOS>', '<PAD>', ..., '<PAD>']]
輸出: [[[0.43271607, 0.52814275, 0.6504923, ...], [0.43271607, 0.52814275, 0.6504923, ...], ...], [[0.5464854, 1.01612, 0.15063584, ...], [0.88263285, 0.62758327, 0.6659863, ...], ...]]
(即每個單字被編碼為長度為500的向量(這個值可以改變, build_word2vec()
方法中的size
參數))
[問題,答案]對從檔案data/plays_ru/prepared_plays_ru.pkl
中讀取(在前一階段獲得;為了擴展和提高模型質量,建議額外傳遞來自字幕data/subtitles_ru/prepared_subtitles_ru.pkl
到build_word2vec()
方法),編碼對儲存到檔案data/plays_ru/encoded_plays_ru.npz
。此外,在工作過程中,會建立所有使用過的單字的列表,即字典,保存在檔案data/plays_ru/w2v_vocabulary_plays_ru.txt
中。訓練好的 word2vec 模型也保存在data/plays_ru/w2v_model_plays_ru.bin
中。
要將訓練集中的單字轉換為向量,只需將對應檔案的名稱傳遞給build_word2vec()
方法並設定所需的參數即可。
3、網路培訓。
在此階段,seq2seq 模型根據先前準備的資料進行訓練。由TextToText
類別組成的text_to_text.py
模組負責此操作。此類訓練網絡,保存網絡模型和權重係數,並允許您方便地與訓練好的模型進行互動。
對於訓練,您需要一個檔案data/plays_ru/encoded_plays_ru.npz
,其中包含編碼為在前一階段獲得的向量的[問題,答案]對。訓練過程中,每隔 5 個 epoch(該值可以改變),網路訓練的極端中間結果保存在檔案data/plays_ru/model_weights_plays_ru_[номер_итерации].h5
中,最後一次迭代時保存在檔案data/ plays_ru data/plays_ru/model_weights_plays_ru.h5
(迭代 - 一個網路訓練週期,一定數量的 epoch,之後將權重保存到文件中,例如,您可以評估網路的準確性或顯示其他預設情況下,epoch 數為 5,迭代總數為 200)。網路模型保存在檔案data/plays_ru/model_plays_ru.json
中。
訓練網路後,透過將所有問題提交到訓練網路的輸入並將網路的答案與訓練集中的標準答案進行比較來評估訓練品質。如果估計模型的準確率高於 75%,則來自網路的錯誤答案將保存到檔案data/plays_ru/wrong_answers_plays_ru.txt
(以便稍後分析)。
要訓練網絡,只需將對應文件的名稱傳遞給train()
方法並設定所需的參數即可。
4. 為PocketSphinx 建立語言模型和字典。
如果要使用語音識別,則需要此階段。在此階段,根據訓練集中的問題創建 PocketSphinx 的靜態語言模型和語音詞典(注意:訓練集中的問題越多,PocketSphinx 識別語音所需的時間就越長)。為此,請使用preparing_speech_to_text.py
模組中LanguageModel
類別的build_language_model()
方法(該方法從 CMUclmtk_v0.7 存取text2wfreq, wfreq2vocab, text2idngram
和idngram2lm
)。此方法使用帶有原始訓練集的文件中的問題(在由source_to_prepared.py
模組準備之前),將語言模型保存在文件temp/prepared_questions_plays_ru.lm
中,並將字典保存在temp/prepared_questions_plays_ru.dic
中( plays_ru
可能會根據使用的訓練集而變化)。工作結束時,語言模型和字典將複製到/usr/local/lib/python3.х/dist-packages/pocketsphinx/model
,名稱為ru_bot_plays_ru.lm
和ru_bot_plays_ru.dic
( plays_ru
可以在與上一階段相同,您需要輸入root用戶密碼)。
為了與經過訓練的 seq2seq 模型進行交互,需要使用bot.py
模組的predict()
函數(它是text_to_text.py
模組中TextToText
類別的predict()
方法的包裝器)。此功能支援多種操作模式。在文字模式下,即當使用者從鍵盤輸入問題並且網路以文字回應時,僅使用text_to_text.py
模組中TextToText
類別的predict()
方法。此方法接受帶有網路問題的字串,並傳回帶有網路回應的字串。要工作,您需要:包含經過訓練的 word2vec 模型的文件data/plays_ru/w2v_model_plays_ru.bin
、包含網絡模型參數的文件data/plays_ru/model_plays_ru.json
以及包含網絡模型參數的文件data/plays_ru/model_weights_plays_ru.h5
.後網路的權重。
要在此模式下運行機器人,您需要使用predict
參數來執行bot.py
例如,像這樣:
python3 bot.py predict
您也可以簡單地執行bot.py
(或執行run_bot.sh
)並在建議的選單中選擇模式 2 和 1。
這種模式與前一種模式的不同之處在於,參數speech_synthesis = True
被傳遞給bot.py
模組的predict()
函數。這意味著與網路的互動將以與模式 2 相同的方式進行,但網路的回應將另外是語音的。
說出答案,即語音合成,在text_to_speech.py
模組的TextToSpeech
類別的get()
方法中實作。此類需要安裝 RHVoice-client,並使用命令列參數向其傳遞語音合成所需的參數(您可以在install_files/Install RHVoice.txt
中查看有關安裝 RHVoice 以及存取 RHVoice-client 的範例)。 get()
方法將需要轉換為語音的字串作為輸入,如果需要,還將保存合成語音的 .wav 檔案的名稱(取樣率為 32 kHz,深度為16 位,單聲道;如果未指定,語音將在合成後立即播放)。建立TextToSpeech
類別的物件時,您可以指定要使用的語音名稱。支援 4 種聲音:男性 Aleksandr 和三種女性聲音 - Anna、Elena 和 Irina(更多詳細資訊請參閱 RHVoice Wiki)。
要在此模式下運行機器人,您需要使用predict -ss
參數運行bot.py
例如,像這樣:
python3 bot.py predict -ss
您也可以簡單地執行bot.py
(或執行run_bot.sh
)並在建議的選單中選擇模式 3 和 1。
要在此模式下工作,您需要將參數speech_recognition = True
傳遞給bot.py
模組的predict()
函數。這意味著與網路的交互,或者更確切地說,輸入問題,將使用語音進行。
語音辨識是在speech_to_text.py
模組的SpeechToText
類別的get()
方法中實現的。課程使用 PocketSphinx 和帶有字典的語言模型( ru_bot_plays_ru.lm
和ru_bot_plays_ru.dic
),它們是在網路訓練模式下建構的。 get()
方法可以在兩種模式下工作: from_file
- 從 .wav 或 .opus 檔案中進行語音識別,取樣頻率 >=16 kHz、16 位元、單聲道(檔案名稱作為函數參數傳遞)和from_microphone
-語音來自麥克風的辨識。操作模式是在建立SpeechRecognition
類別的實例時設定的,因為載入語言模型需要一些時間(模型越大,載入時間越長)。
要在此模式下運行機器人,您需要使用參數predict -sr
運行bot.py
。例如,像這樣:
python3 bot.py predict -sr
您也可以簡單地執行bot.py
(或執行run_bot.sh
)並在建議的選單中選擇模式 4 和 1。
這是模式 3 和模式 4 的組合。
要在此模式下工作,您需要將參數speech_recognition = True
和speech_synthesis = True
傳遞給bot.py
模組的predict()
函數。這意味著將使用語音輸入問題,並透過語音進行網路回應。所使用模組的描述可以在模式 3 和 4 的描述中找到。
要在此模式下運行機器人,您需要使用參數predict -ss -sr
運行bot.py
。例如,像這樣:
python3 bot.py predict -sr -ss
或者
python3 bot.py predict -ss -sr
您也可以簡單地執行bot.py
(或執行run_bot.sh
)並在建議的選單中選擇模式 5 和 1。
該伺服器提供用於與機器人互動的 REST API。當伺服器啟動時,會載入根據戲劇資料集訓練的神經網路。尚不支援作品和字幕的資料集。
伺服器使用Flask實現,多線程模式(生產版本)使用gevent.pywsgi.WSGIServer。伺服器也會對請求正文中接收的資料大小進行限制,即 16 MB。實作在rest_server.py
模組中。
您可以透過執行run_rest_server.sh
來啟動 WSGI 伺服器(在0.0.0.0:5000
啟動 WSGI 伺服器)。
伺服器支援命令列參數,這使得啟動變得更容易一些。參數具有以下結構: [ключ(-и)] [адрес:порт]
。
可能的鍵:
-d
- 啟動測試 Flask 伺服器(如果未指定金鑰,將啟動 WSGI 伺服器)-s
- 啟動支援 https 的伺服器(使用自簽名證書,使用 openssl 取得)有效選項адрес:порт
:
host:port
- 在指定的host
和port
上啟動localaddr:port
- 啟動時自動偵測本機網路上的機器位址和指定port
host:0
或localaddr:0
- 如果port = 0
,則會自動選擇任何可用端口命令列參數及其描述的可能組合清單:
5000
。例如: python3 rest_server.py
host:port
- 在指定的host
和port
上啟動 WSGI 伺服器。例如: python3 rest_server.py 192.168.2.102:5000
-d
- 在127.0.0.1:5000
上啟動測試 Flask 伺服器。例如: python3 rest_server.py -d
-d host:port
- 在指定的host
和port
上啟動測試 Flask 伺服器。例如: python3 rest_server.py -d 192.168.2.102:5000
-d localaddr:port
- 啟動測試 Flask 伺服器,自動偵測本地網路上的機器位址和連接埠port
。例如: python3 rest_server.py -d localaddr:5000
-s
- 啟動支援 https 的 WSGI 伺服器,自動偵測本機網路上的機器位址和連接埠5000
。例如: python3 rest_server.py -s
-s host:port
- 在指定的host
和port
上啟動支援 https 的 WSGI 伺服器。例如: python3 rest_server.py -s 192.168.2.102:5000
-s -d
- 在127.0.0.1:5000
上啟動支援 https 的測試 Flask 伺服器。例如: python3 rest_server.py -s -d
-s -d host:port
- 在指定的host
和port
上啟動支援 https 的測試 Flask 伺服器。例如: python3 rest_server.py -s -d 192.168.2.102:5000
-s -d localaddr:port
- 啟動一個支援 https 的測試 Flask 伺服器,自動偵測本地網路上的機器位址和連接埠port
。例如: python3 rest_server.py -s -d localaddr:5000
伺服器可以自行選擇可用連接埠;為此,您需要在host:port
或localaddr:port
中指定連接埠0
(例如: python3 rest_server.py -d localaddr:0
)。
總共支援5個查詢:
/chatbot/about
的 GET 請求將返回有關該項目的信息/chatbot/questions
GET 請求將傳回所有支援的問題的列表/chatbot/speech-to-text
的 POST 請求,接受 .wav/.opus 檔案並傳回識別的字串/chatbot/text-to-speech
的 POST 請求,採用字串並傳回包含合成語音的 .wav 文件/chatbot/text-to-text
發送 POST 請求,接受字串並以字串形式傳回機器人的回應1.伺服器有基本的http授權。那些。要獲得對伺服器的存取權限,您需要在每個包含 login:password 的請求中新增標頭,該標頭使用base64
編碼(登入名稱: bot
,密碼: test_bot
)。 python 中的範例:
import requests
import base64
auth = base64.b64encode('testbot:test'.encode())
headers = {'Authorization' : "Basic " + auth.decode()}
它看起來像這樣:
Authorization: Basic dGVzdGJvdDp0ZXN0
2.在語音辨識請求(編號為 3)中,伺服器需要一個帶有錄製語音的 .wav 或 .opus 檔案(>=16kHz 16bit mono),該檔案也使用base64
編碼傳輸為 json(即開啟 .wav / .opus文件,讀入位元組數組,然後進行base64
編碼,將得到的數組從位元組形式解碼為字串utf-8
並放置在 json 中),在 python 中它看起來像這樣:
# Формирование запроса
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.在語音合成請求(編號4)中,伺服器將發送帶有合成語音的.wav 檔案(16 位元32kHz 單聲道)的json 回應,該檔案按照上述方式進行編碼(要將其解碼回來,您需要從 json 取得所需的字串到位元組數組中,然後使用base64
對其進行解碼並將其寫入檔案或串流以供以後播放),例如 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)
所有傳輸的資料都封裝在 json 中(包括有錯誤的回應)。
{
"text" : "Информация о проекте."
}
{
"text" : ["Вопрос 1",
"Вопрос 2",
"Вопрос 3"]
}
{
"wav" : "UklGRuTkAABXQVZFZm10IBAAAAABAAEAAH..."
}
或者
{
"opus" : "ZFZm10IBUklQVZFZm10IBARLASBAAEOpH..."
}
伺服器將向他發送:
{
"text" : "который час"
}
{
"text" : "который час"
}
伺服器將向他發送:
{
"wav" : "UklGRuTkAABXQVZFZm10IBAAAAABAAEAAH..."
}
{
"text" : "прощай"
}
伺服器將向他發送:
{
"text" : "это снова я"
}
1. 向/chatbot/about
發出 GET 請求
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
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
在這兩種情況下,伺服器回應:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 305
Date: Fri, 02 Nov 2018 15:13:21 GMT
{
"text" : "Информация о проекте."
}
2. 向/chatbot/questions
發出 GET 請求
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
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
在這兩種情況下,伺服器回應:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1086
Date: Fri, 02 Nov 2018 15:43:06 GMT
{
"text" : ["Что случилось?",
"Срочно нужна твоя помощь.",
"Ты уезжаешь?",
...]
}
3. POST 請求到/chatbot/speech-to-text
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..."
}
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..."
}
服務生回覆:
HTTP/1.1 200 OK
Content-Length: 81
Date: Fri, 02 Nov 2018 15:57:13 GMT
Content-Type: application/json
{
"text" : "Распознные слова из аудиозаписи"
}
4. POST 請求到/chatbot/text-to-speech
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" : "который час"
}
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" : "который час"
}
服務生回覆:
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 請求到/chatbot/text-to-text
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" : "прощай"
}
由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" : "прощай"
}
服務生回覆:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 68
Date: Fri, 02 Nov 2018 16:41:22 GMT
{
"text" : "это снова я"
}
該專案包含一個 Dockerfile,它允許您基於該專案建立 docker 映像。如果您使用install_packages.sh
安裝所有依賴項,且之前尚未安裝 Docker,則需要手動安裝。例如,像這樣(在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
安裝後,執行sudo systemctl status docker
以確保所有內容均已安裝並正常運作(在此命令的輸出中,您將找到一行綠色文字active (running)
)。
要建立映像,您需要轉到終端中包含項目的資料夾並執行( -t
- 啟動終端, .
- 呼叫 docker build 的目錄(點 - 這表示映像的所有檔案都在目前目錄), voice_chatbot:0.1
- 圖像標籤及其版本):
sudo docker build -t voice_chatbot:0.1 .
成功完成此操作後,您可以透過執行以下命令列出可用的映像:
sudo docker images
在結果清單中,您將看到我們的圖像 - voice_chatbot:0.1
。
現在您可以執行此映像( -t
- 啟動終端, -i
- 互動模式, --rm
- 完成後刪除容器, -p 5000:5000
- 將連接埠 5000 上的所有連線轉送至主機到連接埠5000 上的容器(您也可以明確指定需要外部連線的另一個位址,例如: -p 127.0.0.1:5000:5000
)):
sudo docker run -ti --rm -p 5000:5000 voice_chatbot:0.1
結果,RESTful 伺服器將從0.0.0.0:5000
啟動,您可以在終端機中指定的位址存取它(如果您在啟動映像時沒有指定其他位址)。
注意:組裝後的 docker 映像大小為 5.2GB。該專案的來源文件還包括一個.dockerignore
文件,其中包含不需要添加到映像中的文件的名稱。為了最小化最終圖像的大小,與故事和字幕資料集相關的所有檔案、具有資料處理和神經網路訓練中間結果的檔案都被排除在外。這意味著圖像僅包含經過訓練的網路檔案和原始來源資料集。
以防萬一,在專案來源文件中有一個command_for_docker.txt
文件,其中包含使用 docker 所需的最少命令集。
如果您有任何疑問或想要合作,可以透過 [email protected] 或 LinkedIn 寫信給我。