基于python實(shí)現(xiàn)百度語(yǔ)音識(shí)別和圖靈對(duì)話
圖例如下

https://github.com/Dongvdong/python_Smartvoice
- 上電后,只要周圍聲音超過 2000,開始錄音5S
- 錄音上傳百度識(shí)別,并返回結(jié)果文字輸出
- 繼續(xù)等待,周圍聲音是否超過2000,沒有就等待。
- 點(diǎn)用電腦API語(yǔ)音交互
代碼如下
# -*- coding: utf-8 -*-
# 樹莓派
from pyaudio import PyAudio, paInt16
import numpy as np
from datetime import datetime
import wave
import time
import requests#導(dǎo)入requests庫(kù)
import urllib, urllib.request, pycurl
import base64
import json
import os
import sys
from imp import reload
# 調(diào)用電腦API生成語(yǔ)音交互
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):#輸出百度語(yǔ)音識(shí)別的結(jié)果
global duihua
#print ("字符串類型")
#print (buf)
a = eval(buf)
#print (type(a))
if a['err_msg']=='success.':
#print (a['result'][0])#終于搞定了,在這里可以輸出,返回的語(yǔ)句
duihua = a['result'][0]
print ("我:"+duihua)
def use_cloud(token):#進(jìn)行合成
fp = wave.open(filename, 'rb')
nf = fp.getnframes()
f_len = nf * 2
audio_data = fp.readframes(nf)
cuid = "9120612" #產(chǎn)品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中的數(shù)據(jù)保存到名為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內(nèi)部緩存的塊的大小
SAMPLING_RATE = 8000 # 取樣頻率
LEVEL = 1500 # 聲音保存的閾值
COUNT_NUM = 20 # NUM_SAMPLES個(gè)取樣之內(nèi)出現(xiàn)COUNT_NUM個(gè)大于LEVEL的取樣則記錄聲音
SAVE_LENGTH = 8 # 聲音記錄的最小長(zhǎng)度:SAVE_LENGTH * NUM_SAMPLES 個(gè)取樣
exception_on_overflow=False
# 開啟聲音輸入pyaudio對(duì)象
pa = PyAudio()
stream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True,
frames_per_buffer=NUM_SAMPLES)
token = get_token()#獲?。簦铮耄澹?
key = '35ff2856b55e4a7f9eeb86e3437e23fe'
api = 'http://www.tuling123.com/openapi/api?key=' + key + '&info='
while(True):
# 讀入NUM_SAMPLES個(gè)取樣
string_audio_data = stream.read(NUM_SAMPLES,False);
# 將讀入的數(shù)據(jù)轉(zhuǎn)換為數(shù)組
audio_data = np.fromstring(string_audio_data, dtype=np.short)
# 計(jì)算大于LEVEL的取樣的個(gè)數(shù)
large_sample_count = np.sum( audio_data > LEVEL )
temp = np.max(audio_data)
if temp > 2000 and t == 0:
t = 1#開啟錄音
print ("---------主人我在聽你說(shuō)?。?S)----------")
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 ("五秒到了,準(zhǔn)備結(jié)束")
# 如果個(gè)數(shù)大于COUNT_NUM,則至少保存SAVE_LENGTH個(gè)塊
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:
# 將要保存的數(shù)據(jù)存放到save_buffer中
save_buffer.append(string_audio_data )
else:
# 將save_buffer中的數(shù)據(jù)寫入WAV文件,WAV文件的文件名是保存的時(shí)刻
#if time_flag:
if len(save_buffer) > 0 or time_flag:
#filename = datetime.now().strftime("%Y-%m-%d_%H_%M_%S") + ".wav"#原本是用時(shí)間做名字
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, "保存成功正在進(jìn)行語(yǔ)音識(shí)別")
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轉(zhuǎn)化為普通Python字符串:"encode"
utf8string = unicodestring.encode("utf-8")
print ("科塔娜:"+str(a))
# 電腦說(shuō)話
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))
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python語(yǔ)音識(shí)別的轉(zhuǎn)換方法
- Python結(jié)合百度語(yǔ)音識(shí)別實(shí)現(xiàn)實(shí)時(shí)翻譯軟件的實(shí)現(xiàn)
- python錄音并調(diào)用百度語(yǔ)音識(shí)別接口的示例
- python3實(shí)現(xiàn)語(yǔ)音轉(zhuǎn)文字(語(yǔ)音識(shí)別)和文字轉(zhuǎn)語(yǔ)音(語(yǔ)音合成)
- python語(yǔ)音識(shí)別指南終極版(有這一篇足矣)
- python之語(yǔ)音識(shí)別speech模塊
- 使用Python和百度語(yǔ)音識(shí)別生成視頻字幕的實(shí)現(xiàn)
- Python實(shí)現(xiàn)語(yǔ)音識(shí)別和語(yǔ)音合成功能
- python版百度語(yǔ)音識(shí)別功能
- Python迅速掌握語(yǔ)音識(shí)別之知識(shí)儲(chǔ)備篇
相關(guān)文章
Python爬蟲獲取整個(gè)站點(diǎn)中的所有外部鏈接代碼示例
這篇文章主要介紹了Python爬蟲獲取整個(gè)站點(diǎn)中的所有外部鏈接代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12
解鎖Python并發(fā)編程中多線程與多進(jìn)程的應(yīng)用
本文我們將先從基本概念開始,然后通過詳細(xì)舉例探討每一種機(jī)制,特別關(guān)注多線程和多進(jìn)程的應(yīng)用,最后分享一些實(shí)戰(zhàn)經(jīng)驗(yàn)以及一種優(yōu)雅的編程技巧,希望對(duì)大家有所幫助2023-05-05
在Python運(yùn)行時(shí)動(dòng)態(tài)查看進(jìn)程內(nèi)部信息的方法
今天小編就為大家分享一篇在Python運(yùn)行時(shí)動(dòng)態(tài)查看進(jìn)程內(nèi)部信息的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-02-02
django自帶的權(quán)限管理Permission用法說(shuō)明
這篇文章主要介紹了django自帶的權(quán)限管理Permission用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-05-05
python實(shí)現(xiàn)可以斷點(diǎn)續(xù)傳和并發(fā)的ftp程序
斷點(diǎn)續(xù)傳和并發(fā)是現(xiàn)在很多ftp程序都支持的功能,如果我們用python如何來(lái)做斷點(diǎn)續(xù)傳和并發(fā)了,今天來(lái)看一篇python實(shí)現(xiàn)斷點(diǎn)續(xù)傳和并發(fā)的ftp程序例子吧,具體如下。2016-09-09
Python數(shù)據(jù)結(jié)構(gòu)詳細(xì)
本文將詳細(xì)講解Python的數(shù)據(jù)結(jié)構(gòu),下面我們將講解Python關(guān)于關(guān)于列表更多的內(nèi)容以及del 語(yǔ)句和元組和序列等一些具體內(nèi)容,需要的下伙伴可以參考一下2021-09-09

