中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中PyAudio如何實現錄音自動化交互實現問答

發布時間:2021-05-21 10:08:43 來源:億速云 閱讀:251 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Python中PyAudio如何實現錄音自動化交互實現問答,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

首先要先 pip 一個 PyAudio

pip install pyaudio

一.PyAudio 實現麥克風錄音

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

import pyaudio
import 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("錄音結束,請閉嘴!")
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 pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 16000
RECORD_SECONDS = 2
def 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 函數就是我們調用的錄音函數,并且給他一個文件名,他就會自動將聲音寫入到文件中了

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

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

Python中PyAudio如何實現錄音自動化交互實現問答

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

{'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 os
def 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的函數了 , 再重新構建一次咱們的代碼

Python中PyAudio如何實現錄音自動化交互實現問答

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

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

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

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

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

Python中PyAudio如何實現錄音自動化交互實現問答

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

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

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

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

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

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

回到主文件,調用playmp3.py文件中的 play_mp3 函數

Python中PyAudio如何實現錄音自動化交互實現問答

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

請大聲的說出: 學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_str
def 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_str
synth_file = baidu_ai.text_to_audio(res_str) # 將res_str 字符串 合成語音 返回文件名 synth_file
playmp3.play_mp3(synth_file) # 播放 synth_file

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

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

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

# FAQ.py 文件內容
def faq(Q):
 if Q == "你叫什么名字": # 問題
  return "我的名字是老男孩教育" # 答案
  return "我不知道你在說什么" #問題沒有答案時返

在主文件中導入這個函數,并將語音識別后的字符串傳入函數中

Python中PyAudio如何實現錄音自動化交互實現問答

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

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

還是那句話,別玩兒壞了

思考題:

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

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

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

Python主要用來做什么

Python主要應用于:1、Web開發;2、數據科學研究;3、網絡爬蟲;4、嵌入式應用開發;5、游戲開發;6、桌面應用開發。

關于“Python中PyAudio如何實現錄音自動化交互實現問答”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

左云县| 积石山| 丰宁| 政和县| 全椒县| 故城县| 临洮县| 黄冈市| 宿松县| 达孜县| 当涂县| 石泉县| 盱眙县| 潞西市| 英吉沙县| 桐柏县| 富源县| 阳原县| 牡丹江市| 巴东县| 崇州市| 灵武市| 黄陵县| 都兰县| 小金县| 衡阳市| 湘乡市| 长丰县| 乌拉特中旗| 汪清县| 盘锦市| 双柏县| 清流县| 宝清县| 剑河县| 濮阳县| 阿尔山市| 大名县| 桓台县| 金昌市| 会同县|