python +百度語音識別+圖靈對話


https://github.com/Dongvdong/python_Smartvoice

 

  1. 上電后,只要周圍聲音超過 2000,開始錄音5S
  2. 錄音上傳百度識別,並返回結果文字輸出
  3. 繼續等待,周圍聲音是否超過2000,沒有就等待。
  4. 點用電腦API語音交互
  5. 、、

 

# -*- coding: utf-8 -*-
# 樹莓派
from pyaudio import PyAudio, paInt16
import numpy as np
from datetime import datetime
import wave
import time
import requests#導入requests庫
import urllib,  urllib.request, pycurl
import base64
import json
import os
import sys
from imp import reload

# 調用電腦API生成語音交互
import speech
import win32api
import os
import sys
import time
import win32con


reload(sys)

#sys.setdefaultencoding( "utf-8" )
#一些全局變量
save_count = 0
save_buffer = []
t = 0
sum = 0
time_flag = 0
flag_num = 0
filename = ''
duihua = '1'
def getHtml(url):
    html= requests.get(url)
   # html.encoding = 'utf-8'#防止中文亂碼
  
    return html.text
def get_token():
    apiKey = "AxXDYEN27Ks9XHocsGmCEdPm"
    secretKey = "61cd52759f4d704d91c155a22ff7183d"
    auth_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + apiKey + "&client_secret=" + secretKey;
    res = requests.get(auth_url)
    #res.encoding = 'utf-8'#防止中文亂碼
    #print (res.text)
    return json.loads(res.text)['access_token']
def dump_res(buf):#輸出百度語音識別的結果
    global duihua
    #print ("字符串類型")
    #print (buf)
    a = eval(buf)
    #print (type(a))
    if a['err_msg']=='success.':
        #print (a['result'][0])#終於搞定了,在這里可以輸出,返回的語句
        duihua = a['result'][0]
        print ("我:"+duihua)
def use_cloud(token):#進行合成
    fp = wave.open(filename, 'rb')
    nf = fp.getnframes()
    f_len = nf * 2
    audio_data = fp.readframes(nf)
    cuid = "9120612" #產品id
    srv_url = 'http://vop.baidu.com/server_api' + '?cuid=' + cuid + '&token=' + token
    http_header = [
        'Content-Type: audio/pcm; rate=8000',
        'Content-Length: %d' % f_len
    ]
    c = pycurl.Curl()
    c.setopt(pycurl.URL, str(srv_url)) #curl doesn't support unicode
    #c.setopt(c.RETURNTRANSFER, 1)
    c.setopt(c.HTTPHEADER, http_header)   #must be list, not dict
    c.setopt(c.POST, 1)
    c.setopt(c.CONNECTTIMEOUT, 30)
    c.setopt(c.TIMEOUT, 30)
    c.setopt(c.WRITEFUNCTION, dump_res)
    c.setopt(c.POSTFIELDS, audio_data)
    c.setopt(c.POSTFIELDSIZE, f_len)
    c.perform() #pycurl.perform() has no return val
# 將data中的數據保存到名為filename的WAV文件中
def save_wave_file(filename, data):
    wf = wave.open(filename, 'wb')
    wf.setnchannels(1)
    wf.setsampwidth(2)
    wf.setframerate(SAMPLING_RATE)
    wf.writeframes(b"".join(data))
    wf.close()
NUM_SAMPLES = 2000       # pyAudio內部緩存的塊的大小
SAMPLING_RATE = 8000    # 取樣頻率
LEVEL = 1500            # 聲音保存的閾值
COUNT_NUM = 20          # NUM_SAMPLES個取樣之內出現COUNT_NUM個大於LEVEL的取樣則記錄聲音
SAVE_LENGTH = 8         # 聲音記錄的最小長度:SAVE_LENGTH * NUM_SAMPLES 個取樣
exception_on_overflow=False
# 開啟聲音輸入pyaudio對象
pa = PyAudio()
stream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True,
                frames_per_buffer=NUM_SAMPLES)
token = get_token()#獲取token
key = '35ff2856b55e4a7f9eeb86e3437e23fe'
api = 'http://www.tuling123.com/openapi/api?key=' + key + '&info='
while(True):
    # 讀入NUM_SAMPLES個取樣
    string_audio_data = stream.read(NUM_SAMPLES,False);
    # 將讀入的數據轉換為數組
    audio_data = np.fromstring(string_audio_data, dtype=np.short)
    # 計算大於LEVEL的取樣的個數
    large_sample_count = np.sum( audio_data > LEVEL )
    temp = np.max(audio_data)
    if temp > 2000 and t == 0:
        t = 1#開啟錄音
        print ("---------主人我在聽你說!(5S)----------")
        begin = time.time()
       # print (temp)
    if t:
        #print (np.max(audio_data))
        if np.max(audio_data)<1000:
            sum += 1
           # print (sum)
        end = time.time()
        if end-begin>5:
            time_flag = 1
           # print ("五秒到了,准備結束")
        # 如果個數大於COUNT_NUM,則至少保存SAVE_LENGTH個塊
        if large_sample_count > COUNT_NUM:
            save_count = SAVE_LENGTH
        else:
            save_count -= 1
        if save_count < 0:
            save_count = 0
        if save_count > 0:
            # 將要保存的數據存放到save_buffer中
            save_buffer.append(string_audio_data )
        else:
            # 將save_buffer中的數據寫入WAV文件,WAV文件的文件名是保存的時刻
            #if  time_flag:
            if len(save_buffer) > 0  or time_flag:
                #filename = datetime.now().strftime("%Y-%m-%d_%H_%M_%S") + ".wav"#原本是用時間做名字
                filename = str(flag_num)+".wav"
                flag_num += 1
                save_wave_file(filename, save_buffer)
                save_buffer = []
                t = 0
                sum =0
                time_flag = 0
              #  print (filename, "保存成功正在進行語音識別")
                use_cloud(token)
             #   print (duihua)
                info = duihua
                duihua = ""
              
                request = api + str(info)
                response = getHtml(request)
              #  print ( "-----1-----")
                dic_json = json.loads(response)
            
                a = dic_json['text']
            
                unicodestring = a
                # 將Unicode轉化為普通Python字符串:"encode"
                utf8string = unicodestring.encode("utf-8")
             
                print ("科塔娜:"+str(a))
                
                # 電腦說話
                speech.say(str(a))
                
                url = "http://tsn.baidu.com/text2audio?tex="+dic_json['text']+"&lan=zh&per=0&pit=1&spd=7&cuid=7519663&ctp=1&tok=25.41bf315625c68b3e947c49b90788532d.315360000.1798261651.282335-9120612"
                os.system('mpg123 "%s"'%(url))

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM