以下が必要です。
-Python 2.7
-ライブラリ:
pyaudio
ピカール
pywin32
+標準ライブラリのセット
-flacとwavをサポートするオーディオコンバーター、およびコマンドラインからの作業、 これを使用しました 。
仕組み
オーディオファイルを録音してGoogle Voiceに送信すると、次の形式で応答が返されます。
{「ステータス」:0、「id」:「5e34348f2887c7a3cc27dc3695ab4575-1」、「仮説」:[{"発言": "例"、 "信頼":0.7581704}]}、
そしてそれを処理し、同じGoogle Voiceを使用してコンピューターに「話す」ことも教えます。
はじめに
最初に、後でこれに戻らないように、すべてのモジュールを接続する必要があります。
import time, pyaudio, wave, os, urllib,urllib2,pycurl,httplib,sys,win32api,win32con,string from ctypes import *
さて、ここで、コンピューターが私たちと会話できるようにするトーク機能を作成します。
def Talk(text): def downloadFile(url, fileName): fp = open(fileName, "wb") curl = pycurl.Curl() curl.setopt(pycurl.URL, url) curl.setopt(pycurl.WRITEDATA, fp) curl.perform() curl.close() fp.close() def getGoogleSpeechURL(phrase): googleTranslateURL = "http://translate.google.com/translate_tts?tl=en&" parameters = {'q': phrase} data = urllib.urlencode(parameters) googleTranslateURL = "%s%s" % (googleTranslateURL,data) return googleTranslateURL def speakSpeechFromText(phrase): googleSpeechURL = getGoogleSpeechURL(phrase) downloadFile(googleSpeechURL,"ans.mp3")#, ans.mp3 speakSpeechFromText(text) # , winmm = windll.winmm winmm.mciSendStringA('Open "ans.mp3" Type MPEGVideo Alias theMP3',0,0,0) winmm.mciSendStringA('Play theMP3 Wait',0,0,0) winmm.mciSendStringA("Close theMP3","",0,0)
一般に、Talk(テキスト)関数を取得し、それに応じてテキストを「伝えます」。
コーデックは、Pythonからmp3を再生できる唯一のソリューションでした。
ああ、はい、GoogleはPythonでもutf-8でも友達になれなかったので、英語のみで私たちと通信します(そして、英語のみを受け入れます)。
記録
次のステップは、Googleが処理するスピーチを録音することです。 コピー&ペーストしてください:
def Record(): CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 16000 RECORD_SECONDS = 5 WAVE_OUTPUT_FILENAME = "output.wav" p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("Recording...") frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print("Done recording.") stream.stop_stream() stream.close() p.terminate() wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close()
このコードはpyaudioのWebサイトにあり、実質的には変更しませんでした。
しかし、ここが最初の問題です。wavファイルを取得しました。Googleはflac ... Disorderを理解しています。
ここでは、コンバーターとosモジュールが役立ちます。
def Convert(): print "Converting" os.system('C:\Users\\Desktop\\TotalAudioConverter\AudioConverter.exe C:\Users\\Desktop\\output.wav C:\Users\\Desktop\\output.flac') print "Done"
ここで説明します。インストールされたコンバーターへのパスを示し、パラメーターとして最初に入力ファイルを渡し、次に出力を渡します(パスを完全に指定します)。
レコードをサーバーに送信します
def Send(): global ANSWER url = 'https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=en-EN'# flac=open('output.flac',"rb").read() header = {'Content-Type' : 'audio/x-flac; rate=16000'} req = urllib2.Request(url, flac, header) data = urllib2.urlopen(req) a = data.read() ANSWER = eval(a) if ANSWER['status'] == 5: print 'Sorry, I do not understand you.' Talk('Sorry, I do not understand you.') ANSWER = 0 else: ANSWER = ANSWER['hypotheses'][0]['utterance']# google ( ) print ANSWER os.remove('C:\Users\\Desktop\\output.wav')# os.remove('C:\Users\\Desktop\\output.flac') return ANSWER
処理中
答えを受け取ったら、それを使用できます。 それはすべてあなたの想像力に完全に依存しています。
ほんの数例:
def Processing(): global ANSWER if ANSWER == 0: return 0 elif 'chrome' in ANSWER.lower(): os.system('C:\Users\\AppData\Local\Google\Chrome\Application\chrome.exe')# Google Chrome, chrome) elif 'skype' in ANSWER.lower(): os.system('C:\Users\\Downloads\SkypePortable\SkypePortable.exe')# elif 'cd rom' in ANSWER.lower() or\ 'cd-rom' in ANSWER.lower() or\ 'open d' in ANSWER.lower() or\ 'dvd' in ANSWER.lower() or\ 'dvd-rom' in ANSWER.lower() or\ 'dvd rom' in ANSWER.lower() or\ 'cdrom' in ANSWER.lower() or\ 'cd - rom' in ANSWER.lower(): winmm = windll.winmm winmm.mciSendStringA("set cdaudio door open", "", 0,0)# - dvd
また、指定された時間プログラムの実行を停止する関数を追加しましたが、多くのコードがあり、ここから投稿する理由はありません。その利点はゼロになる傾向があるためです。
打ち上げ
これらの関数を説明した後、次のコードを追加します。
print 'Hi, what do you want?' Talk('Hi, what do you want?') Record() Convert() print ('Sending...') Send() print 'Done' Processing() while True: ANSWER = None #Talk('Done.') print 'Do you want something else? (Your command\No)' Talk('Do you want something else??') Record() Convert() print 'Sending...' Send() print 'Done' #print ANSWER if ANSWER == 0: continue if ANSWER.lower()== 'no' or\# , ANSWER.lower()== 'nope' or\ ANSWER.lower()== 'not' or\ ANSWER.lower()== 'nay': break else: Processing() print 'Okay, bye' Talk('Okay, bye')
できた!
これで終わりたいと思います。 誰かを助けてくれてうれしいです。
ご清聴ありがとうございました。