程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 用樹莓派實現對話機器人

用樹莓派實現對話機器人

編輯:關於PHP編程

用樹莓派實現對話機器人


最近用樹莓派實現了一個能和人對話的機器人,簡要介紹一下。

樹莓派(Raspberry Pi)是世界上最流行的微型電腦主板,是開源硬件的領導產品,它為學生計算機編程教育而設計,只有信用卡大小,且價格低廉。支持linux(debian)等操作系統。最重要的是資料完善,社區活躍。
我用的是樹莓派B+版本,基本配置是博通BCM2836處理器,4核900M主頻,1G RAM。

我的目標是做成一個和人對話的機器人,這就需要機器人有輸入設備和輸出設備。輸入設備是麥克風,輸出可以是HDMI、耳機或音響,我這裡用了音響。下面是我的樹莓派照片。4個USB接口分別連了無線網卡、無線鍵盤、麥克風、音響供電。


我們可以把機器人的對話分成三個部分:聽、思考、說。
“聽”,是把人說的話記錄下來,並轉換成文字。
“思考”,就是根據不同的輸入給出不同的輸出。比如,對方說“現在時間”,你就可以回答“現在是北京時間xx點xx分”。
“說”,是把文字轉換成語音,並播放出來。

這三個部分涉及到大量語音識別、語音合成、人工智能等技術,這些都是要花大量時間精力研究的,好在有些公司已經開放了接口給客戶使用。這裡,我選擇了百度的API。下面分別說明這三個部分的實現。

“聽”

首先是把人說的話錄制下來,我使用了arecord工具。命令如下:
  1. arecord -D "plughw:1" -f S16_LE -r 16000 test.wav
其中,-D參數後接錄制設備,連接麥克風後,樹莓派上有2個設備:內部設備和外部usb設備,plughw:1代表使用外部設備。-f表示錄制的格式,-r表示聲音采樣頻率。由於後面提到的百度語音識別對音頻文件格式是有要求的,我們需要錄制成符合要求的格式。另外,在這裡我沒有指定錄制的時間,它會一直錄制下去,直到用戶按下ctrl-c。錄制後的音頻文件保存為test.wav。
接下來,我們要把音頻轉換成文字,即語音識別(asr),百度的語音開放平台提供了免費的服務,並支持REST API
文檔見: http://yuyin.baidu.com/docs/asr/57
流程基本就是獲取token,把需要識別的語音信息、語音數據、token等發送給百度的語音識別服務器,就能獲取到對應的文字。因為服務器支持REST API,我們可以用任何語言來實現客戶端的代碼,這裡使用的是python
  1. # coding: utf-8

  2. import urllib.request
  3. import json
  4. import base64
  5. import sys

  6. def get_access_token():
  7. url = "https://openapi.baidu.com/oauth/2.0/token"
  8. grant_type = "client_credentials"
  9. client_id = "xxxxxxxxxxxxxxxxxx"
  10. client_secret = "xxxxxxxxxxxxxxxxxxxxxx"

  11. url = url + "?" + "grant_type=" + grant_type + "&" + "client_id=" + client_id + "&" + "client_secret=" + client_secret

  12. resp = urllib.request.urlopen(url).read()
  13. data = json.loads(resp.decode("utf-8"))
  14. return data["access_token"]


  15. def baidu_asr(data, id, token):
  16. speech_data = base64.b64encode(data).decode("utf-8")
  17. speech_length = len(data)

  18. post_data = {
  19. "format" : "wav",
  20. "rate" : 16000,
  21. "channel" : 1,
  22. "cuid" : id,
  23. "token" : token,
  24. "speech" : speech_data,
  25. "len" : speech_length
  26. }

  27. url = "http://vop.baidu.com/server_api"
  28. json_data = json.dumps(post_data).encode("utf-8")
  29. json_length = len(json_data)
  30. #print(json_data)

  31. req = urllib.request.Request(url, data = json_data)
  32. req.add_header("Content-Type", "application/json")
  33. req.add_header("Content-Length", json_length)

  34. print("asr start request\n")
  35. resp = urllib.request.urlopen(req)
  36. print("asr finish request\n")
  37. resp = resp.read()
  38. resp_data = json.loads(resp.decode("utf-8"))
  39. if resp_data["err_no"] == 0:
  40. return resp_data["result"]
  41. else:
  42. print(resp_data)
  43. return None

  44. def asr_main(filename):
  45. f = open(filename, "rb")
  46. audio_data = f.read()
  47. f.close()

  48. #token = get_access_token()
  49. token = "xxxxxxxxxxxxxxxxxx"
  50. uuid = "xxxx"
  51. resp = baidu_asr(audio_data, uuid, token)
  52. print(resp[0])
  53. return resp[0]


“思考”
這裡我使用了百度api store的圖靈機器人。其文檔見:http://apistore.baidu.com/apiworks/servicedetail/736.html
它的使用非常簡單,這裡不再贅述,代碼如下:
  1. import urllib.request
  2. import sys
  3. import json

  4. def robot_main(words):
  5. url = "http://apis.baidu.com/turing/turing/turing?"

  6. key = "879a6cb3afb84dbf4fc84a1df2ab7319"
  7. userid = "1000"

  8. words = urllib.parse.quote(words)
  9. url = url + "key=" + key + "&info=" + words + "&userid=" + userid

  10. req = urllib.request.Request(url)
  11. req.add_header("apikey", "xxxxxxxxxxxxxxxxxxxxxxxxxx")

  12. print("robot start request")
  13. resp = urllib.request.urlopen(req)
  14. print("robot stop request")
  15. content = resp.read()
  16. if content:
  17. data = json.loads(content.decode("utf-8"))
  18. print(data["text"])
  19. return data["text"]
  20. else:
  21. return None


“說”
先需要把文字轉換成語音,即語音合成(tts)。然後把聲音播放出來。
百度的語音開放平台提供了tts的接口,並可配置男女聲、語調、語速、音量。服務器返回mp3格式的音頻數據。我們把數據以二進制方式寫入文件中。
詳見http://yuyin.baidu.com/docs/tts/136
代碼如下:
  1. # coding: utf-8

  2. import urllib.request
  3. import json
  4. import sys

  5. def baidu_tts_by_post(data, id, token):
  6. post_data = {
  7. "tex" : data,
  8. "lan" : "zh",
  9. "ctp" : 1,
  10. "cuid" : id,
  11. "tok" : token,
  12. }

  13. url = "http://tsn.baidu.com/text2audio"
  14. post_data = urllib.parse.urlencode(post_data).encode('utf-8')
  15. #print(post_data)
  16. req = urllib.request.Request(url, data = post_data)

  17. print("tts start request")
  18. resp = urllib.request.urlopen(req)
  19. print("tts finish request")
  20. resp = resp.read()
  21. return resp

  22. def tts_main(filename, words):
  23. token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  24. text = urllib.parse.quote(words)
  25. uuid = "xxxx"
  26. resp = baidu_tts_by_post(text, uuid, token)

  27. f = open("test.mp3", "wb")
  28. f.write(resp)
  29. f.close()

得到音頻文件後,可以使用mpg123播放器播放。
  1. mpg123 test.mp3


整合
最後,把這三個部分組合起來。
可以先把python相關的代碼整合成main.py,如下:
  1. import asr
  2. import tts
  3. import robot

  4. words = asr.asr_main("test.wav")
  5. new_words = robot.robot_main(words)
  6. tts.tts_main("test.mp3", new_words)

再使用腳本,調用相關工具:
  1. #! /bin/bash
  2. arecord -D "plughw:1" -f S16_LE -r 16000 test.wav
  3. python3 main.py
  4. mpg123 test.mp3


好了,現在你可以和機器人對話了。運行腳本,對著麥克風說句話,然後按ctrl-c,機器人就會回你話了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved