寫一支讓電腦可以跟自己聊天的程式 - Python

      電腦可以語音辨識也可以說話,所以想要跟電腦聊天應該也不是不可能的事情,這次是要嘗試跟電腦進行對話,跟電腦聊天,感覺就是很有趣(但也感覺宅宅的)。這次同樣也是使用python來寫程式,關於語音辨識以及說話的部份可以參考先前的這兩份文章:
使用Google Speech Recognition做語音辨識
使用Google Text To Speech發聲




      在這邊我建立了一些預設的聊天內容,假設在語音辨識的過程中出現某些關鍵字,如"你好"、"棒球"、"唱歌"等等關鍵字,在設定對應的回應語,這樣就可以有一應一答的效果了。

      下面是我進行對話的結果,上行是我說的內容被辨識出來的結果,下行是電腦所對應的回答:



上面三個是設定好的對話,都有成功回答


我順道把"結束"關鍵字用來關閉程式

如果沒有對應結果,就很誠實的說不知道吧!



程式碼:

#-*- coding=utf-8 -*-
import sys   #for cmd line argv
import time   #for delay
import pygst  #for playing mp3 stream
import gst   # " "

from pygsr import Pygsr
speech = Pygsr()

#建立聊天資料庫=====================================================
'''填上要聊天的內容,這邊加上.decode('utf-8')是為了與辨識結果作比對
格式要與phrase相同才可以。
'''

talk_1='你好'.decode('utf-8')
ans_1='我很好呀,那你呢'

talk_2='棒球'.decode('utf-8')
ans_2='我不會打棒球,我們聊點別的吧'

talk_3='好無聊'.decode('utf-8')
ans_3='那我們來玩點遊戲吧'

talk_4='唱歌'.decode('utf-8')
ans_4='我是台灣歌神,超厲害的唷'

talk_5='天氣'.decode('utf-8')
ans_5='今天天氣非常好、艷陽高照、風和日麗'

endPro='結束'.decode('utf-8')

noAns='我不知道你在說什麼'


while True:
   #輸入、語音辨識==================================================

   # 錄音五秒
   try:
       speech.record(5)
   except IOError:
       print '錄音失敗,在錄一次'
       continue;

   print '錄音完成'

   #選擇語言、並得到結果
   '''因為這邊常會因為錄音問題或使發音不標準造成沒有辨識結果,
   會產生空的結果,會在後面程式發生錯誤,所以這邊用try的方式,
   如果辨識失敗,就補上空的內容。'''
   try:
       phrase, complete_response = speech.speech_to_text('zh_TW')
       print phrase
   except ValueError:
       phrase=''
       print "Speech Recognition failure!"
   

   #輸出,讓電腦說話================================================

   #進行對話比對,然後產生要讓程式說話的字串
   if talk_1 in phrase:
       tts_string=ans_1
   elif talk_2 in phrase:
       tts_string=ans_2
   elif talk_3 in phrase:
       tts_string=ans_3
   elif talk_4 in phrase:
       tts_string=ans_4
   elif talk_5 in phrase:
       tts_string=ans_5
   elif endPro in phrase:
       break
   else:
       tts_string=noAns

   print tts_string

   #合成網址,使用翻譯的語音發音
   music_stream_uri = 'http://translate.google.com/translate_tts?ie=UTF-8&tl=zh&q=' + tts_string
   player = gst.element_factory_make("playbin", "player")
   player.set_property('uri', music_stream_uri)
   player.set_state(gst.STATE_PLAYING)
   # print music_stream_uri

   #播放音效檔案,需要給他時間說完
   time.sleep(8)

      程式著一開始我設定了一些相關的答覆內容,當然可以增減,在這邊主要是用關鍵字來判斷,太難的問題可能就會答非所問了。這邊要與語音辨識結果進行比對,所以比對的內容有加上.decode('utf-8'),否則程式不會讓我進行比對。

      整個程式架構是利用一個while loop讓程式可以重複執行,等於對答玩一次後,就可以在進行下一次的對答,不用一再的重新開始。

      錄音的部份,首先在.record(5)的部份,常常會產生錄音設備有問題,產生失敗,所以用了一個try來避開錯誤,讓程式可以繼續運行,如果發生錯誤就跳過這一次迴圈。
因為在比對的時候也會因為錄音內容有不同的結果,如果沒有辨識成功phrase變數不會產生,在比對的過程會造成錯誤,在這裡就指定一個空字串給他。

比對在python上就相對簡單了,用"in"指令就好了。再者邊的endPro是關閉程式的意思,直接break跳出while loop就結束了。

發聲的時候沒有什麼需要修改的,只要記得別忘了要time.sleep等待音效放玩。


留言

  1. 我執行你的程式,一直無限迴圈錄音失敗,在錄一次
    不知道為甚麼會這樣

    回覆刪除
  2. 請問...這個程式碼要放在哪裡呢?

    回覆刪除

張貼留言

Facebook

這個網誌中的熱門文章

[房屋]裝潢紀錄分享- 基本包冷氣管包梁工程。把冷氣管隱藏得無影無蹤

[心得]天作之合音樂劇「阿堯 Shemenayha」 at 台北表演藝術中心 大劇院

[台北]台北小巨蛋 冰上迪士尼。迪士尼主題花式溜冰的視覺饗宴

[印尼]印尼 巴淡島 旅遊 TOP 100量販超市必買商品推薦。咖啡、生活用品、泡麵

[工具]線上模擬器。簡單的硬體電路模擬小工具Falstad: Circuit Simulatior Applet

[食記]將捷金鬱金香酒店- 河畔餐廳 主餐+自助餐吃到飽心得

[軟體]PDFill - 功能強大的免費PDF處理與編輯軟體。常用功能教學

為您推薦