pyaudio:基于pyaudio利用Python編程從電腦端錄制音頻保存到指定文件夾+將錄音上傳服務(wù)器+錄音進(jìn)行識別并轉(zhuǎn)為文本保存
# -*- coding: utf-8 -*-
#pyaudio:利用pyaudio從電腦端錄制音頻保存到指定文件夾+將錄音上傳服務(wù)器+錄音進(jìn)行識別并轉(zhuǎn)為文本保存
import wave
from pyaudio import PyAudio,paInt16
import urllib #urllib2
import pycurl
import urllib.request as urllib2
import json
framerate=8000 #采樣率
NUM_SAMPLES=2000 #采樣點
channels=1 #一個聲道
sampwidth=2 #兩個字節(jié)十六位
TIME=2 #條件變量,可以設(shè)置定義錄音的時間
def save_wave_file(filename, data): #save the date to the wav file
wf = wave.open(filename, 'wb') #二進(jìn)制寫入模式
wf.setnchannels(channels)
wf.setsampwidth(sampwidth) #兩個字節(jié)16位
wf.setframerate(framerate) #幀速率
wf.writeframes(b"".join(data)) #把數(shù)據(jù)加進(jìn)去,就會存到硬盤上去wf.writeframes(b"".join(data))
wf.close()
def my_record():
pa=PyAudio()
stream=pa.open(format=paInt16,channels=1,rate=framerate,input=True,frames_per_buffer=NUM_SAMPLES)
my_buf=[]
count=0 #
while count < TIME*8: #循環(huán)2*20次
string_audio_data=stream.read(NUM_SAMPLES) #每讀完2000個采樣加1
my_buf.append(string_audio_data)
count+=1
print('當(dāng)前正在錄音(同時錄制系統(tǒng)內(nèi)部和麥克風(fēng)的聲音)……')
save_wave_file('03.wav',my_buf) #文件保存
stream.close()
def dump_res(buf): #dump_res即dump_result,buf是curl從網(wǎng)上返回來的緩存
print(buf)
my_temp=json.loads(buf)
my_list=my_temp['result']
print(type(my_list))
print(my_list[0]) #輸出第一個
print('dump_res函數(shù)調(diào)用成功!')
def get_token(): #獲取token
apikey='2KeNr6nK6ZmMKAbdlM5PUaSC'
secretkey='QuDTqg1cMehfwvvyKmZyifAnCoGFiZ3g'
auth_url='https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id='+apikey+'&client_secret='+secretkey; #
res=urllib2.urlopen(auth_url) #獲取服務(wù)器響應(yīng),res=urllib2.urlopen(auth_url)
json_data=res.read() #讀取到j(luò)son_data中
print(json_data,type(json_data))
return json.loads(json_data)['access_token']
def use_cloud(token): #token類似一種訪問權(quán)限等
fp=wave.open(u'16k.wav','rb') #打開wav文件
nf=fp.getnframes() #獲得文件的采樣點數(shù)量
print('sampwidth',fp.getsampwidth())
print('framerate',fp.getframerate())
print('channels',fp.getnchannels())
f_len=nf*2 #獲取文件長度,文件長度計算,每個采樣點2個字節(jié)
audio_data=fp.readframes(nf) #
cuid="XXXXXXXXXX" #硬件地址,my phone xiaomi MAC
print(token)
srv_url='http://vop.baidu.com/server_api'+'?cuid='+cuid+'&token='+token
http_header=[
'Content-Type:audio/pcm;rate=8000', #音頻,原先是pcm,可以改為wav
'Content-length:%d:' % f_len
]
c=pycurl.Curl() #實例化curl
c.setopt(pycurl.URL,str(srv_url)) #(網(wǎng)址)
c.setopt(c.HTTPHEADER, http_header) #網(wǎng)址頭部
c.setopt(c.POST, 1) #1表示調(diào)用post方法而不是get
c.setopt(c.CONNECTTIMEOUT,80) #超時中斷
c.setopt(c.TIMEOUT,80) #下載超時
c.setopt(c.WRITEFUNCTION,dump_res) #返回數(shù)據(jù),dump_res,進(jìn)行回調(diào)
c.setopt(c.POSTFIELDS,audio_data) #數(shù)據(jù)
c.setopt(c.POSTFIELDSIZE,f_len) #文件大小
c.perform() #提交, pycurl.perform()
print('use_cloud函數(shù)over!')
if __name__ == "__main__":
# my_record()
print('錄音結(jié)束!')
token = get_token()
use_cloud(token)
print('over!')
相關(guān)文章
ASR:基于pyaudio利用python進(jìn)行語音生成、語音識別總結(jié)及其案例詳細(xì)攻略