一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Python人工智能之路 - 第三篇 : PyAudio 實現(xiàn)錄音 自動化交互實現(xiàn)問答

 刮骨劍 2019-09-10

Python 很強大其原因就是因為它龐大的三方庫 , 資源是非常的豐富 , 當(dāng)然也不會缺少關(guān)于音頻的庫

關(guān)于音頻, PyAudio 這個庫, 可以實現(xiàn)開啟麥克風(fēng)錄音, 可以播放音頻文件等等,此刻我們不去了解其他的功能,只了解一下它如何實現(xiàn)錄音的

首先要先 pip 一個 PyAudio

pip install pyaudio

一.PyAudio 實現(xiàn)麥克風(fēng)錄音

然后建立一個py文件,復(fù)制如下代碼

復(fù)制代碼
import pyaudioimport wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 16000
RECORD_SECONDS = 2
WAVE_OUTPUT_FILENAME = "Oldboy.wav"p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)print("開始錄音,請說話......")

frames = []for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)print("錄音結(jié)束,請閉嘴!")

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()
復(fù)制代碼

嘗試一下,在目錄中出現(xiàn)了一個 Oldboy.wav 文件 , 聽一聽,還是很清晰的嘛

接下來,我們將這段錄音代碼,寫在一個函數(shù)里面,如果要錄音的話就調(diào)用

建立一個文件 pyrec.py 并將錄音代碼和函數(shù)寫在內(nèi)

復(fù)制代碼
# pyrec.py 文件內(nèi)容import pyaudioimport wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 16000
RECORD_SECONDS = 2def rec(file_name):
    p = pyaudio.PyAudio()

    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)print("開始錄音,請說話......")

    frames = []for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)print("錄音結(jié)束,請閉嘴!")

    stream.stop_stream()
    stream.close()
    p.terminate()

    wf = wave.open(file_name, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()
復(fù)制代碼

rec 函數(shù)就是我們調(diào)用的錄音函數(shù),并且給他一個文件名,他就會自動將聲音寫入到文件中了

二.實現(xiàn)音頻格式自動轉(zhuǎn)換 并 調(diào)用語音識別

錄音的問題解決了,趕快和百度語音識別接在一起使用一下:

不管你的錄音有多么多么清晰,你發(fā)現(xiàn)百度給你返回的永遠是:

{'err_msg': 'speech quality error.', 'err_no': 3301, 'sn': '6397933501529645284'} # 音質(zhì)不清晰

其實不是沒聽清,而是百度支持的音頻格式PCM搞的鬼

所以,我們要將錄制的wav音頻文件轉(zhuǎn)換為pcm文件

寫一個文件 wav2pcm.py 這個文件里面的函數(shù)是專門為我們轉(zhuǎn)換wav文件的

使用 os 模塊中的 os.system()方法 這個方法是執(zhí)行系統(tǒng)命令用的, 在windows系統(tǒng)中的命令就是 cmd 里面寫的東西,dir , cd 這類的命令

復(fù)制代碼
# wav2pcm.py 文件內(nèi)容import osdef wav_to_pcm(wav_file):# 假設(shè) wav_file = "音頻文件.wav"# wav_file.split(".") 得到["音頻文件","wav"] 拿出第一個結(jié)果"音頻文件"  與 ".pcm" 拼接 等到結(jié)果 "音頻文件.pcm"pcm_file = "%s.pcm" %(wav_file.split(".")[0])# 就是此前我們在cmd窗口中輸入命令,這里面就是在讓Python幫我們在cmd中執(zhí)行命令os.system("ffmpeg -y  -i %s  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s"%(wav_file,pcm_file))return pcm_file
復(fù)制代碼

這樣我們就有了把wav轉(zhuǎn)為pcm的函數(shù)了 , 再重新構(gòu)建一次咱們的代碼

這次的返回結(jié)果還挺讓人滿意的嘛

{'corpus_no': '6569869134617218414', 'err_msg': 'success.', 'err_no': 0, 'result': ['老男孩教育'], 'sn': '8116162981529666859'}

拿到語音識別的字符串了,接下來用這段字符串 語音合成, 學(xué)習(xí)咱們說出來的話

三.語音合成 與 FFmpeg 播放mp3 文件

拿到字符串了,直接調(diào)用synthesis方法去合成吧

這段代碼銜接上一段代碼,成功獲得了 synth.mp3 音頻文件,并且確定了實在學(xué)習(xí)我們說的話

接下來就是讓我們的程序自動將 synth.mp3 音頻文件播放了 其實PyAudio 有播放的功能,但是操作有點復(fù)雜

所以我們還是選擇用簡單的方式解決復(fù)雜的問題,就是這么簡單粗暴,是否還記得FFmpeg 呢?

FFmpeg 這個系統(tǒng)工具中,有一個 ffplay 的工具用來打開并播放音頻文件的,使用方法大概是: ffplay 音頻文件.mp3

建立一個playmp3.py文件, 寫一個 play_mp3 的函數(shù)用來播放已經(jīng)合成的語音

# playmp3.py 文件內(nèi)容import osdef play_mp3(file_name):
    os.system("ffplay  %s"%(file_name))

回到主文件,調(diào)用playmp3.py文件中的 play_mp3 函數(shù)

執(zhí)行代碼,當(dāng)你看到 : 開始錄音,請說話......

請大聲的說出: 學(xué)IT 找老男孩教育

然后你就會聽到,一個嬌滴滴聲音重復(fù)你說的話

四.簡單問答

首先我們要把代碼重新梳理一下:

把語音合成 語音識別部分的代碼獨立成函數(shù)放到baidu_ai.py文件中

復(fù)制代碼
# baidu_ai.py 文件內(nèi)容from aip import AipSpeech# 這里的三個參數(shù),對應(yīng)在百度語音創(chuàng)建的應(yīng)用中的三個參數(shù)APP_ID = "xxxxx"API_KEY = "xxxxxxx"SECRET_KEY = "xxxxxxxx"client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)def audio_to_text(pcm_file):# 讀取文件 , 終于得到了PCM文件with open(pcm_file, 'rb') as fp:
        file_context = fp.read()# 識別本地文件res = client.asr(file_context, 'pcm', 16000, {'dev_pid': 1536,
    })# 從字典里面獲取"result"的value 列表中第1個元素,就是識別出來的字符串"老男孩教育"res_str = res.get("result")[0]return res_strdef text_to_audio(res_str):
    synth_file = "synth.mp3"synth_context = client.synthesis(res_str, "zh", 1, {"vol": 5,"spd": 4,"pit": 9,"per": 4
    })

    with open(synth_file, "wb") as f:
        f.write(synth_context)return synth_file
復(fù)制代碼

然后把我們的主文件進行一下修改

復(fù)制代碼
import pyrec  # 錄音函數(shù)文件import wav2pcm  # wav轉(zhuǎn)換pcm 函數(shù)文件import baidu_ai  # 語音合成函數(shù),語音識別函數(shù) 文件import playmp3  # 播放mp3 函數(shù) 文件pyrec.rec("1.wav")  # 錄音并生成wav文件,使用方式傳入文件名pcm_file = wav2pcm.wav_to_pcm("1.wav")  # 將wav文件 轉(zhuǎn)換成pcm文件 返回 pcm的文件名res_str = baidu_ai.audio_to_text(pcm_file) # 將轉(zhuǎn)換后的pcm音頻文件識別成 文字 res_strsynth_file = baidu_ai.text_to_audio(res_str) # 將res_str 字符串 合成語音 返回文件名 synth_fileplaymp3.play_mp3(synth_file) # 播放 synth_file
復(fù)制代碼

然后就是大展宏圖的時候了,展開你們的想象力:

res_str 是字符串,如果字符串等于"你叫什么名字"的時候,我們就要給他一個回答:我的名字叫老男孩教育

新建一個FAQ.py的文件然后建立一個函數(shù)faq:

# FAQ.py 文件內(nèi)容def faq(Q):if Q == "你叫什么名字": # 問題return "我的名字是老男孩教育" # 答案

  return "我不知道你在說什么" #問題沒有答案時返

在主文件中導(dǎo)入這個函數(shù),并將語音識別后的字符串傳入函數(shù)中

現(xiàn)在來嘗試一下:"你叫什么名字","你今年幾歲了"

成功了,現(xiàn)在你可以對 FAQ.py 這個文件進行更多的問題匹配了

還是那句話,別玩兒壞了

思考題:

1.如何實現(xiàn)一直問答不用問一次停一次?

2.問題那么多,是不是要寫這么多問題呢?

3.如果我問你是誰,是不是要重復(fù)也一次 我的名字叫老男孩教育 的答案呢?

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产国产精品精品在线| 一区二区三区精品人妻| 日韩一区二区三区四区乱码视频| 少妇在线一区二区三区| 欧美精品日韩精品一区| 少妇熟女亚洲色图av天堂| 亚洲最新中文字幕一区| 亚洲午夜av一区二区| 欧美日韩国产亚洲三级理论片 | 午夜福利直播在线视频| 婷婷激情四射在线观看视频| 亚洲国产日韩欧美三级| 国产精品亚洲综合色区韩国| 日韩精品一区二区毛片| 成人精品国产亚洲av久久| 国产传媒欧美日韩成人精品| 激情国产白嫩美女在线观看| 精品人妻一区二区三区四区久久| 欧美加勒比一区二区三区| 九九久久精品久久久精品| 中国黄色色片色哟哟哟哟哟哟| 久久永久免费一区二区| 婷婷色国产精品视频一区| 东京热男人的天堂社区| 欧美在线观看视频三区| 国产日韩在线一二三区| 成年午夜在线免费视频| 在线观看欧美视频一区| 欧美中文字幕日韩精品| 欧美区一区二在线播放| 亚洲中文字幕人妻av| 中文字幕久久精品亚洲乱码| 中文字幕人妻日本一区二区| 日韩黄色一级片免费收看| 色婷婷视频免费在线观看| 欧美日韩精品一区二区三区不卡| 日韩国产传媒在线精品| 在线日本不卡一区二区| 欧美又黑又粗大又硬又爽| 国产成人精品国内自产拍| 久久午夜福利精品日韩|