寫一支讓電腦可以跟自己聊天的程式 - Python
電腦可以語音辨識也可以說話,所以想要跟電腦聊天應該也不是不可能的事情,這次是要嘗試跟電腦進行對話,跟電腦聊天,感覺就是很有趣(但也感覺宅宅的)。這次同樣也是使用python來寫程式,關於語音辨識以及說話的部份可以參考先前的這兩份文章:
使用Google Speech Recognition做語音辨識
使用Google Text To Speech發聲
在這邊我建立了一些預設的聊天內容,假設在語音辨識的過程中出現某些關鍵字,如"你好"、"棒球"、"唱歌"等等關鍵字,在設定對應的回應語,這樣就可以有一應一答的效果了。
下面是我進行對話的結果,上行是我說的內容被辨識出來的結果,下行是電腦所對應的回答:
程式碼:
程式著一開始我設定了一些相關的答覆內容,當然可以增減,在這邊主要是用關鍵字來判斷,太難的問題可能就會答非所問了。這邊要與語音辨識結果進行比對,所以比對的內容有加上.decode('utf-8'),否則程式不會讓我進行比對。
整個程式架構是利用一個while loop讓程式可以重複執行,等於對答玩一次後,就可以在進行下一次的對答,不用一再的重新開始。
錄音的部份,首先在.record(5)的部份,常常會產生錄音設備有問題,產生失敗,所以用了一個try來避開錯誤,讓程式可以繼續運行,如果發生錯誤就跳過這一次迴圈。
因為在比對的時候也會因為錄音內容有不同的結果,如果沒有辨識成功phrase變數不會產生,在比對的過程會造成錯誤,在這裡就指定一個空字串給他。
比對在python上就相對簡單了,用"in"指令就好了。再者邊的endPro是關閉程式的意思,直接break跳出while loop就結束了。
發聲的時候沒有什麼需要修改的,只要記得別忘了要time.sleep等待音效放玩。
使用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等待音效放玩。
我執行你的程式,一直無限迴圈錄音失敗,在錄一次
回覆刪除不知道為甚麼會這樣
請問...這個程式碼要放在哪裡呢?
回覆刪除