このプロジェクトは、音声ボットとそれと対話するための RESTful サーバーの 2 つの部分で構成されています。
ボットをローカルで実行するには、 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
( 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
に変更する必要があります)。
このボットは、リカレント ニューラル ネットワークである tentionSeq2Seq モデルに基づいています。現在の実装では、エンコーダ内の 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 TV シリーズ ( data/subtitles_ru
、詳細はロシア語字幕データセットを参照)。 word2vec モデルはすべてのデータセットでトレーニングされますが、ニューラル ネットワークはプレイセット データセットでのみトレーニングされます。
パラメーターを変更せずに、プレイのデータセット上で word2vec モデルとニューラル ネットワークをトレーニングするには、nvidia gtx1070 と intel core i7 で約 7.5 時間かかります。このハードウェアでの作品と字幕のデータセットのトレーニングは、少なくとも数日間続きます。
ボットはいくつかのモードで動作します。
トレーニング セットは、ロシアのさまざまな演劇から取られた 1600 の質問と %% の回答のペアで構成されています。これはファイルdata/plays_ru/plays_ru.txt
に保存されます。質問と %% の回答の各ペアは新しい行に書かれます。 1 つの行には 1 つのペアのみがあります。
トレーニングに必要なすべてのステージは、 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
から前処理されたデータ セットを追加で渡すことをお勧めします。 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 回ごとのエポック (この値は変更可能) ごとに、ネットワーク トレーニングの極端な中間結果がファイルdata/plays_ru/model_weights_plays_ru_[номер_итерации].h5
に保存され、最後の反復時にファイルdata/plays_ru/model_weights_plays_ru.h5
(反復 - 1 つのネットワーク トレーニング サイクル、特定のエポック数。その後、重みがファイルに保存され、たとえばネットワークの精度を評価したり、他のデータを表示したりできます)デフォルトでは、エポック数は 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
はどのトレーニング セットが使用されたかによって異なります)。作業の最後に、言語モデルと辞書はru_bot_plays_ru.lm
およびru_bot_plays_ru.dic
( plays_ru
変更可能) という名前で/usr/local/lib/python3.х/dist-packages/pocketsphinx/model
にコピーされます。前の段階と同様に、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 クライアントがインストールされている必要があり、コマンド ライン引数を使用して音声合成に必要なパラメーターを渡します (RHVoice のインストールと RHVoice クライアントへのアクセスの例については、 install_files/Install RHVoice.txt
で確認できます)。 get()
メソッドは、音声に変換する必要がある文字列を入力として受け取ります。また、必要に応じて、合成された音声が保存される .wav ファイルの名前も受け取ります (サンプリング レート 32 kHz、深さ16 ビット、モノラル。指定しない場合、音声は合成直後に再生されます。 TextToSpeech
クラスのオブジェクトを作成するときに、使用する音声の名前を指定できます。男性の Aleksandr と、Anna、Elena、Irina の 3 人の女性の 4 つの音声がサポートされています (詳細は 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()
メソッドは 2 つのモードで動作します: from_file
- サンプリング周波数 >=16 kHz、16 ビット、モノラル (ファイル名は引数として関数に渡されます) およびfrom_microphone
持つ .wav または .opus ファイルからの音声認識- マイクからの音声認識。動作モードは、 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 サーバーを起動できます (WSGI サーバーは0.0.0.0:5000
で起動します)。
サーバーはコマンド ライン引数をサポートしているため、起動が少し簡単になります。引数の構造は[ключ(-и)] [адрес:порт]
です。
可能なキー:
-d
- テスト Flask サーバーを起動します (キーが指定されていない場合は、WSGI サーバーが起動します)-s
- https サポートを使用してサーバーを起動します (openssl を使用して取得した自己署名証明書を使用します)。有効なオプションадрес:порт
:
host:port
- 指定されたhost
とport
で起動しますlocaladdr:port
- ローカルネットワーク上のマシンアドレスと指定されたport
を自動検出して起動します。host:0
またはlocaladdr:0
- port = 0
の場合、使用可能なポートが自動的に選択されますコマンドライン引数の可能な組み合わせとその説明のリスト:
5000
自動検出して WSGI サーバーを起動します。例: 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
- ローカル ネットワーク上のマシン アドレスとポートport
自動検出してテスト Flask サーバーを起動します。例: python3 rest_server.py -d localaddr:5000
-s
- https サポート、ローカル ネットワーク上のマシン アドレスの自動検出、およびポート5000
を使用して WSGI サーバーを起動します。例: python3 rest_server.py -s
-s host:port
- 指定されたhost
とport
上で https サポートを備えた WSGI サーバーを起動します。例: python3 rest_server.py -s 192.168.2.102:5000
-s -d
- https サポートを備えたテスト Flask サーバーを127.0.0.1:5000
で起動します。例: 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 サポート、ローカル ネットワーク上のマシン アドレスの自動検出、およびポートport
を備えたテスト Flask サーバーを起動します。例: 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 認証があります。それらの。サーバーにアクセスするには、 base64
を使用してエンコードされた、login:password を含むヘッダーを各リクエストに追加する必要があります (ログイン: 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 16 ビット モノラル) を期待します。これも、 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 ビット 32 kHz 月) を含む JSON 応答を送信します。この合成音声は、上記のようにエンコードされました (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
で CARAS を入手
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. /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. /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. /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 04/16/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 へのすべての接続をスローします。 car car をポートのポート 5000 に接続します (外部から接続する必要がある別のアドレスを明確に指定することもできます。例: -p 127.0.0.1:5000:5000
:5000):
sudo docker run -ti --rm -p 5000:5000 voice_chatbot:0.1
その結果、サーバーは0.0.0.0:5000
で起動し、端末に示されたアドレスでサーバーに接続できるようになります (イメージの開始時に他のアドレスを指定しなかった場合)。
注: 組み立てられた Docker イメージの重さは 5.2 GB です。初期プロジェクト ファイルには、イメージに追加する必要のないファイル名が含まれる.dockerignore
ファイルも含まれています。最終的な画像のサイズを最小限に抑えるために、ストーリーや字幕の設定データに関連するすべてのファイル、データ処理およびニューラル ネットワークの学習の中間結果を含むファイルは、最終画像から除外されました。これは、イメージにはトレーニングされたネットワークのファイルと生のソース データ セットのみが含まれていることを意味します。
念のため、プロジェクトのソース ファイルには、Docker を操作するために必要な最小限のコマンド セットを含むcommand_for_docker.txt
ファイルがあります。
ご質問がある場合、または協力したい場合は、[email protected] または linkedin で私にメールしてください。