ホームページ  >  記事  >  バックエンド開発  >  Raspberry Piで会話型ロボットを実装する_PHPチュートリアル

Raspberry Piで会話型ロボットを実装する_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-12 08:57:331772ブラウズ

Raspberry Piを使って会話ロボットを実装してみました

最近、Raspberry Piを使って人と会話できるロボットを実装してみましたので簡単に紹介します。

Raspberry Pi は、世界で最も人気のあるマイクロコンピューターのマザーボードであり、オープンソース ハードウェアのリーダーです。学生のコンピューター プログラミング教育用に設計されており、サイズはクレジット カードほどで、手頃な価格です。 Linux (debian) などのオペレーティング システムをサポートします。最も重要なことは、情報が完全であり、コミュニティが活発であることです。
私はRaspberry Pi B+バージョンを使用しています。基本構成はBroadcom BCM2836プロセッサ、4コア900Mクロック速度、1G RAMです。

私の目標は、人と会話できるロボットを作ることですが、そのためにはロボットに入力デバイスと出力デバイスが必要です。入力デバイスはマイクで、出力は HDMI、ヘッドフォン、またはスピーカーです。ここではスピーカーを使用しました。以下は私のRaspberry Piの写真です。 4 つの USB インターフェイスは、ワイヤレス ネットワーク カード、ワイヤレス キーボード、マイク、およびオーディオ電源に接続されています。


ロボットの会話は、聞く、考える、話すの 3 つの部分に分けることができます。
「聞く」とは、人の話を録音し、言葉に変換することです。
「考える」とは、異なるインプットに基づいて異なるアウトプットを与えることを意味します。たとえば、相手が「もうこんな時間です」と言ってきたら、「北京時間××時××分です」と返すことができます。
「話す」とは、テキストを音声に変換して再生することです。

これらの 3 つの部分には、音声認識、音声合成、人工知能、その他のテクノロジーが多く含まれており、研究には多大な時間と労力が必要です。幸いなことに、一部の企業は顧客が使用できるインターフェースを公開しています。ここではBaiduのAPIを選択しました。これら 3 つの部分の実装については以下で説明します。

「聞く」

まず最初に、arecord ツールを使用して人の発言を録音します。コマンドは次のとおりです:
  1. arecord -D "plughw:1" -f S16_LE -r 16000 test.wav
このうち、-D パラメータの後にマイクを接続した後、次のパラメータがあります。 Raspberry Pi 上の 2 つのデバイス: 内部デバイスと外部 USB デバイス。plughw:1 は外部デバイスの使用を表します。 -f は録音フォーマット、-r はサウンドのサンプリング周波数を示します。後述するBaidu音声認識には音声ファイル形式の要件があるため、要件を満たす形式で録音する必要があります。さらに、ここでは録音時間を指定しませんでしたが、ユーザーが Ctrl-C を押すまで録音が継続されます。録音された音声ファイルは test.wav として保存されます。
次に、音声をテキストに変換する必要があります。つまり、Baidu の音声オープン プラットフォームは無料のサービスを提供し、REST API をサポートしています。ドキュメントについては、http://yuyin.baidu.com/docs/ を参照してください。 asr/57
プロセスは基本的にトークンを取得し、認識する必要がある音声情報、音声データ、トークンなどを Baidu の音声認識サーバーに送信すると、対応するテキストを取得できます。サーバーは REST API をサポートしているため、任意の言語を使用してクライアント コードを実装できます。ここでは python を使用します
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li># coding: utf-8<br /> </li><li><br /></li><li>import urllib.request<br /></li><li>import json<br /></li><li>import base64<br /></li><li>import sys<br /></li><li><br /></li><li>def get_access_token():<br /></li><li>url = "https://openapi.baidu.com/oauth/2.0/token"<br /></li><li>grant_type = "client_credentials"<br /></li><li>client_id = "xxxxxxxxxxxxxxxxxx"<br /></li><li>client_secret = "xxxxxxxxxxxxxxxxxxxxxx"<br /></li><li><br /></li><li>url = url + "?" + "grant_type=" + grant_type + "&" + "client_id=" + client_id + "&" + "client_secret=" + client_secret<br /></li><li><br /></li><li>resp = urllib.request.urlopen(url).read()<br /></li><li>data = json.loads(resp.decode("utf-8"))<br /></li><li>return data["access_token"]<br /></li><li><br /></li><li><br /></li><li>def baidu_asr(data, id, token):<br /></li><li>speech_data = base64.b64encode(data).decode("utf-8")<br /></li><li>speech_length = len(data)<br /></li><li><br /></li><li>post_data = {<br /></li><li>"format" : "wav",<br /></li><li>"rate" : 16000,<br /></li><li>"channel" : 1,<br /></li><li>"cuid" : id,<br /></li><li>"token" : token,<br /></li><li>"speech" : speech_data,<br /></li><li>"len" : speech_length<br /></li><li>}<br /></li><li><br /></li><li>url = "http://vop.baidu.com/server_api"<br /></li><li>json_data = json.dumps(post_data).encode("utf-8")<br /></li><li>json_length = len(json_data)<br /></li><li>#print(json_data)<br /></li><li><br /></li><li>req = urllib.request.Request(url, data = json_data)<br /></li><li>req.add_header("Content-Type", "application/json")<br /></li><li>req.add_header("Content-Length", json_length)<br /></li><li><br /></li><li>print("asr start request\n")<br /></li><li>resp = urllib.request.urlopen(req)<br /></li><li>print("asr finish request\n")<br /></li><li>resp = resp.read()<br /></li><li>resp_data = json.loads(resp.decode("utf-8"))<br /></li><li>if resp_data["err_no"] == 0:<br /></li><li>return resp_data["result"]<br /></li><li>else:<br /></li><li>print(resp_data)<br /></li><li>return None<br /></li><li><br /></li><li>def asr_main(filename):<br /></li><li>f = open(filename, "rb")<br /></li><li>audio_data = f.read()<br /></li><li>f.close()<br /></li><li><br /></li><li>#token = get_access_token()<br /></li><li>token = "xxxxxxxxxxxxxxxxxx"<br /></li><li>uuid = "xxxx"<br /></li><li>resp = baidu_asr(audio_data, uuid, token)<br /></li><li>print(resp[0])<br /></li><li>return resp[0] </li></ol>


「思考」
ここでは、Baidu API ストアの Turing ロボットを使用しました。そのドキュメントは次の場所にあります: http://apistore.baidu.com/apiworks/servicedetail/736.html
その使用方法は非常に簡単なので、ここでは詳しく説明しません。コードは次のとおりです:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>import urllib.request<br /> </li><li>import sys<br /></li><li>import json<br /></li><li><br /></li><li>def robot_main(words):<br /></li><li>url = "http://apis.baidu.com/turing/turing/turing?"<br /></li><li><br /></li><li>key = "879a6cb3afb84dbf4fc84a1df2ab7319"<br /></li><li>userid = "1000"<br /></li><li><br /></li><li>words = urllib.parse.quote(words)<br /></li><li>url = url + "key=" + key + "&info=" + words + "&userid=" + userid<br /></li><li><br /></li><li>req = urllib.request.Request(url)<br /></li><li>req.add_header("apikey", "xxxxxxxxxxxxxxxxxxxxxxxxxx")<br /></li><li><br /></li><li>print("robot start request")<br /></li><li>resp = urllib.request.urlopen(req)<br /></li><li>print("robot stop request")<br /></li><li>content = resp.read()<br /></li><li>if content:<br /></li><li>data = json.loads(content.decode("utf-8"))<br /></li><li>print(data["text"])<br /></li><li>return data["text"]<br /></li><li>else:<br /></li><li>return None</li></ol>


「言う」
まず、テキストを音声、つまり音声合成 (tts) に変換する必要があります。次にサウンドを再生します。
Baidu の音声オープン プラットフォームは tts インターフェイスを提供し、男性と女性の声、イントネーション、話す速度、音量を設定できます。サーバーは音声データを mp3 形式で返します。データをバイナリ形式でファイルに書き込みます。
詳細については、http://yuyin.baidu.com/docs/tts/136 を参照してください。
コードは次のとおりです:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li># coding: utf-8<br /> </li><li><br /></li><li>import urllib.request<br /></li><li>import json<br /></li><li>import sys<br /></li><li><br /></li><li>def baidu_tts_by_post(data, id, token):<br /></li><li>post_data = {<br /></li><li>"tex" : data,<br /></li><li>"lan" : "zh",<br /></li><li>"ctp" : 1,<br /></li><li>"cuid" : id,<br /></li><li>"tok" : token,<br /></li><li>}<br /></li><li><br /></li><li>url = "http://tsn.baidu.com/text2audio"<br /></li><li>post_data = urllib.parse.urlencode(post_data).encode('utf-8')<br /></li><li>#print(post_data)<br /></li><li>req = urllib.request.Request(url, data = post_data)<br /></li><li><br /></li><li>print("tts start request")<br /></li><li>resp = urllib.request.urlopen(req)<br /></li><li>print("tts finish request")<br /></li><li>resp = resp.read()<br /></li><li>return resp<br /></li><li><br /></li><li>def tts_main(filename, words):<br /></li><li>token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"<br /></li><li>text = urllib.parse.quote(words)<br /></li><li>uuid = "xxxx"<br /></li><li>resp = baidu_tts_by_post(text, uuid, token)<br /></li><li><br /></li><li>f = open("test.mp3", "wb")<br /></li><li>f.write(resp)<br /></li><li>f.close() </li></ol>

オーディオ ファイルを取得した後、mpg123 プレーヤーを使用して再生できます。

    mpg123 test.mp3

統合
最後に、これら 3 つの部分を結合します。
まず、次のように Python 関連のコードを main.py に統合できます:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>import asr<br /> </li><li>import tts<br /></li><li>import robot<br /></li><li><br /></li><li>words = asr.asr_main("test.wav")<br /></li><li>new_words = robot.robot_main(words)<br /></li><li>tts.tts_main("test.mp3", new_words) </li></ol>

次に、スクリプトを使用して関連ツールを呼び出します:

    #! /bin/bash

  1. arecord -D "plughw:1" - f S16_LE -r 16000 test.wav

  2. python3 main.py

  3. mpg123 test.mp3

さて、これでロボットと会話できるようになりました。スクリプトを実行し、マイクに向かって何かを言ってから Ctrl+C を押すと、ロボットが応答します。


http://www.bkjia.com/PHPjc/1108027.htmlwww.bkjia.com本当http://www.bkjia.com/PHPjc/1108027.html技術記事 Raspberry Piを使って会話ロボットを実装してみた 最近、Raspberry Piを使って人と会話できるロボットを実装してみました。 Raspberry Pi は世界で最も人気のあるマイクロコンピューターです...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。