Python人工智慧之路 - 第三篇 : PyAudio 實現錄音 自動化互動實現問答

來源:互聯網
上載者:User

標籤:執行   class   stop   檔案內容   result   錄音   播放   hunk   mil   

Python 很強大其原因就是因為它龐大的三方庫 , 資源是非常的豐富 , 當然也不會缺少關於音訊庫

關於音頻, PyAudio 這個庫, 可以實現開啟麥克風錄音, 可以播放音頻檔案等等,此刻我們不去瞭解其他的功能,只瞭解一下它如何?錄音的

首先要先 pip 一個 PyAudio

pip install pyaudio

一.PyAudio 實現麥克風錄音

然後建立一個py檔案,複製如下代碼

import pyaudioimport waveCHUNK = 1024FORMAT = pyaudio.paInt16CHANNELS = 2RATE = 16000RECORD_SECONDS = 2WAVE_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("錄音結束,請閉嘴!")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()

嘗試一下,在目錄中出現了一個 Oldboy.wav 檔案 , 聽一聽,還是很清晰的嘛

接下來,我們將這段錄音代碼,寫在一個函數裡面,如果要錄音的話就調用

建立一個檔案 pyrec.py 並將錄音代碼和函數寫在內

# pyrec.py 檔案內容import pyaudioimport waveCHUNK = 1024FORMAT = pyaudio.paInt16CHANNELS = 2RATE = 16000RECORD_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("錄音結束,請閉嘴!")    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()

rec 函數就是我們調用的錄音函數,並且給他一個檔案名稱,他就會自動將聲音寫入到檔案中了

 

二.實現音頻格式自動轉換 並 調用語音辨識

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

不管你的錄音有多麼多麼清晰,你發現百度給你返回的永遠是:

{‘err_msg‘: ‘speech quality error.‘, ‘err_no‘: 3301, ‘sn‘: ‘6397933501529645284‘} # 音質不清晰

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

所以,我們要將錄製的wav音頻檔案轉換為pcm檔案

寫一個檔案 wav2pcm.py 這個檔案裡面的函數是專門為我們轉換wav檔案的

使用 os 模組中的 os.system()方法 這個方法是執行系統命令用的, 在windows系統中的命令就是 cmd 裡面寫的東西,dir , cd 這類的命令

# wav2pcm.py 檔案內容import osdef wav_to_pcm(wav_file):    # 假設 wav_file = "音頻檔案.wav"    # wav_file.split(".") 得到["音頻檔案","wav"] 拿出第一個結果"音頻檔案"  與 ".pcm" 拼接 等到結果 "音頻檔案.pcm"    pcm_file = "%s.pcm" %(wav_file.split(".")[0])    # 就是此前我們在cmd視窗中輸入命令,這裡面就是在讓Python幫我們在cmd中執行命令    os.system("ffmpeg -y  -i %s  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s"%(wav_file,pcm_file))    return pcm_file

這樣我們就有了把wav轉為pcm的函數了 , 再重新構建一次咱們的代碼

這次的返回結果還挺讓人滿意的嘛

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

拿到語音辨識的字串了,接下來用這段字串 語音合成, 學習咱們說出來的話

 

三.語音合成 與 FFmpeg 播放mp3 檔案

拿到字串了,直接調用synthesis方法去合成吧

這段代碼銜接上一段代碼,成功獲得了 synth.mp3 音頻檔案,並且確定了實在學習我們說的話

接下來就是讓我們的程式自動將 synth.mp3 音頻檔案播放了 其實PyAudio 有播放的功能,但是操作有點複雜

所以我們還是選擇用簡單的方式解決複雜的問題,就是這麼簡單粗暴,是否還記得FFmpeg 呢?

FFmpeg 這個系統工具中,有一個 ffplay 的工具用來開啟並播放音頻檔案的,使用方法大概是: ffplay 音頻檔案.mp3

建立一個playmp3.py檔案, 寫一個 play_mp3 的函數用來播放已經合成的語音

# playmp3.py 檔案內容import osdef play_mp3(file_name):    os.system("ffplay  %s"%(file_name))

回到主檔案,調用playmp3.py檔案中的 play_mp3 函數

執行代碼,當你看到 : 開始錄音,請說話......

請大聲的說出: 學IT 找老男孩教育

然後你就會聽到,一個嬌滴滴聲音重複你說的話

 

四.簡單問答

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

把語音合成 語音辨識部分的代碼獨立成函數放到baidu_ai.py檔案中

# baidu_ai.py 檔案內容from aip import AipSpeech# 這裡的三個參數,對應在百度語音建立的應用中的三個參數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

然後把我們的主檔案進行一下修改

import pyrec  # 錄音函數檔案import wav2pcm  # wav轉換pcm 函數檔案import baidu_ai  # 語音合成函數,語音辨識函數 檔案import playmp3  # 播放mp3 函數 檔案pyrec.rec("1.wav")  # 錄音並產生wav檔案,使用方式傳入檔案名稱pcm_file = wav2pcm.wav_to_pcm("1.wav")  # 將wav檔案 轉換成pcm檔案 返回 pcm的檔案名稱res_str = baidu_ai.audio_to_text(pcm_file) # 將轉換後的pcm音頻檔案識別成 文字 res_strsynth_file = baidu_ai.text_to_audio(res_str) # 將res_str 字串 合成語音 返迴文件名 synth_fileplaymp3.play_mp3(synth_file) # 播放 synth_file

 

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

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

建立一個FAQ.py的檔案然後建立一個函數faq:

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

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

在主檔案中匯入這個函數,並將語音辨識後的字串傳入函數中

現在來嘗試一下:"你叫什麼名字","你今年幾歲了"

成功了,現在你可以對 FAQ.py 這個檔案進行更多的問題匹配了

還是那句話,別玩兒壞了

思考題:

1.如何?一直問答不用問一次停一次?

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

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

 

Python人工智慧之路 - 第三篇 : PyAudio 實現錄音 自動化互動實現問答

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.