小白如何做一個Python智能語音助手
- 真的是小白?
- 廢話不說直接上圖
- 1、錄音
- 2、語音識別
- 3、接入圖靈機器人
- 4、語音合成
- 5、播放語音
- 前期準備
- 源代碼
- 1、錄音
- 2、語音識別 (將錄音內容進行語音識別轉成文字)
- 3、接入圖靈機器人(將文字發送給機器人獲得回復)
- 4、語音合成 (將回復的文字進行語音合成)
- 5、播放語音
- 最終代碼來了
真的是小白?
大家好,我是一名資訊工程的大三學生,由于大一大二沒怎么學習技術,所以大三準備挖糞圖強,先介紹一下我的學習儲備吧,斷斷續續學過Python,一直只是看B站,學習一些語法基礎,數值型別,回圈,函式…甚至連面向物件和面向程序都分不清,
不過,這樣的學習基礎程序太枯燥了,我太沒有耐心,三天打魚兩天曬網地,所以我決定,從專案直接開始入手,遇到問題再去惡補基礎知識,雖然這樣的效率可能有點低,甚至你可能都不知道遇到問題該學習什么知識,
但是自頂向下的專案驅動對我來說更加有動力去學習,如果這個專案我不去做完它,我可能都會睡不著覺,所以我覺得這是最適合我的學習方法,而且現在網路這么發達,真的想要解決一個問題還能辦不到嗎?
這是我花了大概2天實作的第一個專案
(基本上除了吃飯睡覺都在做,還肝到了3點多)
廢話不說直接上圖
語音助手視頻看這里

人工智能語音助手主要功能分成下面5個部分:
1、錄音
2、語音識別
(將錄音內容進行語音識別轉成文字)
3、接入圖靈機器人
(將文字發送給機器人獲得回復)
4、語音合成
(將回復的文字進行語音合成)
5、播放語音
應該很好理解吧,它的核心功能其實是需要一個聊天機器人,才能實作智能回復,這里我們用的是現有的圖靈機器人,呼叫他的介面,不是自己做一個機器人(臣妾做不到),
同樣地,語音識別和語音合成技術也是呼叫現有的百度語音的介面,至于怎么實作那就太復雜了,
前期準備
· 首先肯定是python的安裝和編譯器
這個我就不講了,網上教程特別多
我用的是Pycharm 2021.2.2(最新版本的,也是最近重新開始學習,卸了重裝的)
· 其次你要學會第三方模塊的安裝,這個特別重要
Python很多專案都可以直接通過第三方模塊,實作大部分功能
安裝方法:
快捷鍵 Windows+R →輸入‘cmd’確定→然后輸入:pip install 你要安裝的第三模塊的名字→Enter(回車)
比如安裝: pygame ,就敲入pip install pygame
我已經安裝過了,要是還沒安裝會有下載進度(需要聯網下載安裝)
安裝方法就是其實很多,大家可以自己搜索學習,這里舉一個簡單的例子


源代碼
代碼將會分成5個小模塊和一個整合的代碼,
都可以獨立運行哦
1、錄音
這里需要安裝
pip install pyaudio
pip install SpeechRecognition
SpeechRecogintion 是 Python 的一個語音識別框架,
它可以檢測語音中的停頓自動終止錄音并保存,比 PyAudio 更人性化,很適合語音助手,
import speech_recognition as sr #pyaudio SpeechRecognition模塊
def rec(rate=16000): #從系統麥克風拾取音頻資料,采樣率為 16000
r = sr.Recognizer()
with sr.Microphone(sample_rate=rate) as source:
print("please say something") #這里會列印please say something,提示你說話進行錄音
audio = r.listen(source)
with open("recording.wav", "wb") as f: #把采集到的音頻資料以 wav 格式保存在當前目錄下的recording.wav 檔案
f.write(audio.get_wav_data())
return 1
rec() #運行rec函式,錄制音頻
2、語音識別 (將錄音內容進行語音識別轉成文字)
首先要去百度AI開放平臺,創建API介面應用

記得不用購買,可以先去領取免費資源

這里的App_ID、Api_Key、Secret_Key代碼都會用到
這里需要安裝
pip install baidu-aip
from aip import AipSpeech
APP_ID = '25016634'
API_KEY = 'Qsj6XGf0m1ilsV0QwLTmHeiy'
SECRET_KEY = 'Mctl1jHY85Hr3wmTpizLI********' #這三個輸入你自己的介面賬號密鑰哈,我就不放了,有需要可以找我要
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
def listen():
with open('recording.wav', 'rb') as f: #將錄制好的音頻檔案recording.wav上傳至百度語音的服務,回傳識別后的文本結果并輸出,
audio_data = f.read()
results = client.asr(audio_data, 'wav', 16000, {
'dev_pid': 1537, #這里的results是一個字典,文本內容在Key名字為result對應的值,這里我惡補了一點字典的知識
})
if 'result' in results:
print("you said: " + results['result'][0]) #results['result']這個是輸出Key名字為result對應的值,也就是我們要的文本,至于后面[0]有什么用我還沒搞明白,
return results['result'][0]
else:
print("出現錯誤,錯誤代碼:" , results['err_no']) #不存在result就回傳錯誤代碼err_no
listen() #運行listen函式,將錄音轉成文字
語音識別放回的字典存放在results里面,是一個字典,包含了下面的內容,
result里面就是我們需要的文本了

我剛開始弄的時候一直報錯 KeyErrory,我查了下是字典的Key不存在,也就是沒有回傳result
所以我加了一個判斷,就是如果result不存在,就回傳錯誤代碼,我就可以去這個網站看出了什么錯誤了,當然你也可以直接回傳err_msg錯誤資訊(如果你英語很好),然后我發現回傳的錯誤代碼是:3305,就找到了對應的問題,重新申請一個或者等第二天再弄就可以了

3、接入圖靈機器人(將文字發送給機器人獲得回復)
首先要去圖靈機器人創建一個機器人,這個認證比較麻煩,還要拍身份證啥的,人工認證需要1-2天
注冊認證進入圖靈機器人的控制臺創建一個新的聊天機器人,記下分配到的 Apikey,后面代碼要用到

這里需要安裝
pip install requests
import requests
import json
TURING_KEY = "d4c739c4b5b7422ab15dc********" #這里輸入你的機器人Apikey
URL = "http://openapi.tuling123.com/openapi/api/v2"
HEADERS = {'Content-Type': 'application/json;charset=UTF-8'}
def robot(text=""):
data = {
"reqType": 0,
"perception": {
"inputText": {
"text": ""
},
"selfInfo": {
"location": { #這里輸入你的城市
"city": "廣州",
"street": "大學城"
}
}
},
"userInfo": {
"apiKey": 'd4c739c4b5b7422ab15dc********', #這里輸入你的機器人Apikey
"userId": "123"
}
}
data["perception"]["inputText"]["text"] = text
response = requests.request("post", URL, json=data, headers=HEADERS)
response_dict = json.loads(response.text)
result = response_dict["results"][0]["values"]["text"] #把機器人回復的文字儲存在result里
print("the AI said: " + result)
return result
robot("你好嗎?") #運行robot函式,與機器人聊天
4、語音合成 (將回復的文字進行語音合成)
這里用到的還是百度AI開放平臺的 App_ID、Api_Key、Secret_Key
from aip import AipSpeech
APP_ID = '25016634'
API_KEY = 'Qsj6XGf0m1ilsV0QwLTmHeiy'
SECRET_KEY = 'Mctl1jHY85Hr3wmTpizLI********'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
def speak(text=""):
result = client.synthesis(text, 'zh', 1, { #這里的引數可以調 zh表示中文
'spd': 4, #語速
'vol': 5, #音量
'per': 4, #型別
})
if not isinstance(result, dict):
with open('audio.mp3', 'wb') as f: #保存為當前目錄下mp3格式的音頻:audio.mp3,不建議用wav格式,wav格式后面我用的是pagame播放無法識別
f.write(result)
f.close()
speak('你好啊!') #運行speak函式,把機器人回復的文字轉換成語音
機器人的語速、語調、音量、發聲人都可以選擇,更改對應引數數值就可以了

5、播放語音
用到的是pygame第三方庫(一聽就是做游戲的)
這里需要安裝
pip install pagame
import pygame
def play():
pygame.mixer.init() # 初始化混音器模塊(pygame庫的通用做法,每一個模塊在使用時都要初始化pygame.init()為初始化所有的pygame模塊,可以使用它也可以單初始化這一個模塊)
pygame.mixer.music.load("D:/C Language/Python/pythonProject/audio_assistant/audio.mp3") # 加載音樂 ######大坑,注意這里需要使用絕對路徑(就是不是默認當前路徑,我惡補一下絕對路徑和相對路徑)
pygame.mixer.music.set_volume(0.5)# 設定音量大小0~1的浮點數
pygame.mixer.music.play() # 播放音頻
while pygame.mixer.music.get_busy(): # 在音頻播放未完成之前不退出程式
pass
pygame.mixer.music.unload() #停止加載音頻
play()
這個看似是最簡單的一個,不過卻有一個大坑,我弄了好久才搞定,
如果你直接使用 audio.mp3 相對路徑,
它在播放完audio.mp3之后,這個audio.mp3就在python里面打開里,我試了好多辦法都沒辦法關閉,
所以它就只能播放一次,后面再播放就會報錯,說檔案被占用,所以大家記得用絕對路徑,
不然后面你跟語音助手對話就只能說一次了,
最終代碼來了
import speech_recognition as sr
from aip import AipSpeech
import requests
import json
import pygame
#錄音
def rec(rate=16000):
r = sr.Recognizer()
with sr.Microphone(sample_rate=rate) as source:
print("please say something")
audio = r.listen(source)
with open("recording.wav", "wb") as f:
f.write(audio.get_wav_data())
return 1
#語音識別
APP_ID = '25016634'
API_KEY = 'Qsj6XGf0m1ilsV0QwLTmHeiy'
SECRET_KEY = 'Mctl1jHY85Hr3wmT***********'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
def listen():
with open('recording.wav', 'rb') as f:
audio_data = f.read()
results = client.asr(audio_data, 'wav', 16000, {
'dev_pid': 1537,
})
if 'result' in results:
print("you said: " + results['result'][0])
return results['result'][0]
else:
print("出現錯誤,錯誤代碼:" , results['err_no'])
#呼叫圖靈機器人
TURING_KEY = "1dde879fa943438e9*********"
URL = "http://openapi.tuling123.com/openapi/api/v2"
HEADERS = {'Content-Type': 'application/json;charset=UTF-8'}
def robot(text=""):
data = {
"reqType": 0,
"perception": {
"inputText": {
"text": ""
},
"selfInfo": {
"location": {
"city": "廣州",
"street": "大學城"
}
}
},
"userInfo": {
"apiKey": '1dde879fa943438e9**********',
"userId": "123"
}
}
data["perception"]["inputText"]["text"] = text
response = requests.request("post", URL, json=data, headers=HEADERS)
response_dict = json.loads(response.text)
result = response_dict["results"][0]["values"]["text"]
print("the AI said: " + result)
return result
#語音合成
def speak(text=""):
result = client.synthesis(text, 'zh', 1, {
'spd': 4,
'vol': 5,
'per': 4,
})
if not isinstance(result, dict):
with open('audio.mp3', 'wb') as f:
f.write(result)
#播放音頻
def play():
pygame.mixer.init()
pygame.mixer.music.load("D:/C Language/Python/pythonProject/audio_assistant/audio.mp3")
pygame.mixer.music.set_volume(0.5)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
pass
pygame.mixer.music.unload()
if __name__ == "__main__":
while True:
rec() # 保存錄音檔案:recording.wav
text = listen() # 自動打開錄音檔案recording.wav進行識別,回傳 識別的文字存到text
if '結束程式' in text: #這里我設定了一個結束語,說“結束程式”的時候就結束,你也可以改掉
break
text_1 = robot(text) # 將text中的文字發送給機器人,回傳機器人的回復存到text_1
speak(text_1) # 將text_1中機器人的回復用語音輸出,保存為audio.mp3檔案
play() #播放audio.mp3檔案
主要就是后面主函式那段代碼啦,設定了一個回圈可以無限對話下去,還設定了一個“結束程式”
那么我的第一個專案Python智能語音助手就告一段落了!
后面我想學一學樹莓派,把這個弄到樹莓派里面,再加上一個智能喚醒的功能,做一個獨立的 樹莓派智能語音助手,
你們有什么好的簡單專案也可以推薦給我呀!大家一起做,互相請教總比一個人做效率高,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/328208.html
標籤:其他
