咱們一般把人稱爲智慧生物,那麼"智慧生物的能力"就是所謂的"人工智能"html
咱們有什麼能力?python
聽,說,看,理解,思考,情感等等....程序員
顧名思義就是由人創造的"智慧能力",一樣具有,據說看理解等能力web
聽=語音識別算法
說=語音合成windows
看=圖像視頻文字識別api
理解=語言(文字)圖像視屏理解等邏輯處理ide
思考=理解後的邏輯處理函數
問題:你叫什麼名字?工具
答案:個人名字叫栗子
回答者:"聽, 看"到問題,經過大腦進行問題的"理解"
回答者得到答案後:"說,寫"問題答案給提問者
這裏的聽就是語音識別,理解就是語言理解
語音識別:小米的小愛同窗,蘋果的siri,微軟的Cortana
語音合成:小米的小愛同窗,蘋果的siri,微軟的Cortana
圖像識別:交通攝像頭拍違章,刷臉解鎖手機等
視頻識別:抖音內容審覈,視頻社交APP的審覈機制
文字識別:從身份證照片提取身份證號碼,掃一掃翻譯
語義理解:智能問答機器人,也包含小米的小愛同窗,蘋果的siri,微軟的Cortana
銀行辦卡刷臉就行
車輛違章有牌就跑不了
違法犯罪路過天眼等於自投羅網
「小愛同窗」,」哎~」,」打開電視」,」好的!」
「歡迎使用10010智能語音系統」,」我還有多少話費」,」您的話費餘額爲0.01元」
掃一掃翻譯看不懂的文字(支持26國語言)
此篇是人工智能應用的重點,只用現成的技術不作底層算法,也是讓初級程序員快速進入人工智能行業的捷徑
目前市面上主流的AI技術提供公司有不少,好比百度,阿里,騰訊,主作語音的科大訊飛,作只能問答的圖靈機器人等等
這些公司投入了很大一部分財力物力人力將底層封裝,提供應用接口給咱們,尤爲是百度,徹底免費的接口
既然百度這麼仗義,我們就不要浪費掉怎麼好的資源,從百度AI入手,開啓人工智能之旅
開啓人工智能技術的大門 : http://ai.baidu.com/
看看我大百度的AI大法,這些技術所有都是封裝好的接口,看着就爽
接下來我們就一步一步的操做一下
首先進入控制檯,註冊一個百度的帳號(百度帳號通用)
開通一下咱們百度AI開放平臺的受權
而後找到已開通服務中的百度語音
走到這裏,想必已經知道我們要從語音入手了,語音識別和語音合成
打開百度語音,進入語音應用管理界面,建立一個新的應用
建立語音應用App
應用名稱:能夠隨意寫
應用類型:這裏隨便選擇,暫時選擇學習辦公
接口選擇:默認勾選了語音識別和語音合成。在天然語言處理中,所有選擇。下面會用到!
語言包名:選擇不須要,由於接下來是用純python操做!
應用描述:寫上一些描述,或者感人的話,都行!
回到應用列表咱們能夠看到已建立的應用了
這裏面有三個值 AppID , API Key , Secret Key 記住能夠從這裏面看到 , 在以後的學習中咱們會用到
好了 百度語音的應用已經建立完成了 接下來 我會用Python 代碼做爲實例進行應用及講解
首先我們要 pip install baidu-aip 安裝一個百度人工智能開放平臺的Python SDK實在是太方便了,這也是爲何咱們選擇百度人工智能的最大緣由
點擊左側的技術文檔
點擊左邊的語言合成->SDK文檔->Python SDK
請嚴格按照文檔裏描述的參數進行開發。請注意如下幾個問題:
合成文本長度必須小於1024字節,若是本文長度較長,能夠採用屢次請求的方式。切忌文本長度超過限制。
語音合成 rest api不限制調用量,可是初始的QPS爲100,若是默認配額不能知足您的業務需求,請從控制檯中申請提升配額,咱們會在兩個工做日內完成審批
必填字段中,嚴格按照文檔描述中內容填寫。
語音合成 Python SDK目錄結構
├── README.md ├── aip //SDK目錄 │ ├── __init__.py //導出類 │ ├── base.py //aip基類 │ ├── http.py //http請求 │ └── speech.py //語音合成 └── setup.py //setuptools安裝
支持Python版本:2.7.+ ,3.+
安裝使用Python SDK有以下方式:
pip install baidu-aip
便可。python setup.py install
便可。
打開windows的cmd窗口,輸入命令 pip3 install baidu-aip
我已經安裝好了,效果以下:
AipSpeech是語音合成的Python SDK客戶端,爲使用語音合成的開發人員提供了一系列的交互方法。
參考以下代碼新建一個AipSpeech:
from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '你的 App ID' API_KEY = '你的 Api Key' SECRET_KEY = '你的 Secret Key' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
在上面代碼中,常量APP_ID
在百度雲控制檯中建立,常量API_KEY
與SECRET_KEY
是在建立完畢應用後,系統分配給用戶的,均爲字符串,用於標識用戶,爲訪問作簽名驗證,可在AI服務控制檯中的應用列表中查看。
打開Pycharm,新建一個目錄ai
建立文件 baidu_ai.py
代碼以下:
import time from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '11212345' API_KEY = 'pVxdhsXS1BIaiwYYNT712345' SECRET_KEY = 'BvHQOts27LpGFbt3RAOv84WfPCW12345' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
將前面提到的AppID,API Key,Secret Key,複製到對應位置。
上面的id和KEY,後5位我改了,複製個人也沒有用!呵呵!
舉例,要把一段文字合成爲語音文件:
result = client.synthesis('你好百度', 'zh', 1, { 'vol': 5, }) # 識別正確返回語音二進制 錯誤則返回dict 參照下面錯誤碼 if not isinstance(result, dict): with open('auido.mp3', 'wb') as f: f.write(result)
修改 baidu_ai.py
from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '11212345' API_KEY = 'pVxdhsXS1BIaiwYYNT712345' SECRET_KEY = 'BvHQOts27LpGFbt3RAOv84WfPCW12345' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) result = client.synthesis('你好百度', 'zh', 1, { 'vol': 5, }) # 識別正確返回語音二進制 錯誤則返回dict 參照下面錯誤碼 if not isinstance(result, dict): with open('auido.mp3', 'wb') as f: f.write(result)
執行代碼,會看到當前目錄出現了一個auido.mp3文件,打開播放器,聽一下聲音。
我用QQ影音,打開正常
技術上,代碼上任何的疑惑,均可以從官方文檔中獲得答案
baidu-aip Python SDK 語音合成技術文檔 : https://ai.baidu.com/docs#/TTS-Online-Python-SDK/top
剛纔咱們作了一個語音合成的例子,就用這個例子來展開說明
先來看第一段代碼
from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '11212345' API_KEY = 'pVxdhsXS1BIaiwYYNT712345' SECRET_KEY = 'BvHQOts27LpGFbt3RAOv84WfPCW12345' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
這是與百度進行一次加密校驗 , 認證你是合法用戶 合法的應用
AipSpeech 是百度語音的客戶端 認證成功以後,客戶端將被開啓,這裏的client 就是已經開啓的百度語音的客戶端了
再來看第二段代碼:
result = client.synthesis('你好百度', 'zh', 1, { 'vol': 5, }) # 若是上面的三個參數APP_ID,API_KEY,SECRET_KEY填寫正確的話,res就是我們的音頻文件流 # 若是返回失敗的話,就會報錯! print(result) # 識別正確返回語音二進制 錯誤則返回dict 參照下面錯誤碼 if not isinstance(result, dict): with open('auido.mp3', 'wb') as f: f.write(result)
返回樣例:
// 成功返回二進制文件流 // 失敗返回 { "err_no":500, "err_msg":"notsupport.", "sn":"abcdefgh", "idx":1 }
用百度語音客戶端中的synthesis方法,並提供相關參數
成功能夠獲得音頻文件,失敗則返回一段錯誤信息
重點看一下 synthesis 這個方法 , 從 https://ai.baidu.com/docs#/TTS-Online-Python-SDK/top 來得到答案吧
從參數入手分析:
result = client.synthesis( '你好百度', # text: 合成的文本,使用UTF-8編碼,請注意文本長度必須小於1024字節 'zh', # lang: 語言,中文:zh 英文:en 1, # ctp: 客戶端信息這裏就寫1,寫別的很差使,至於爲何我們之後再解釋 { 'vol': 5, # 合成音頻文件的準音量 'spd':4, # 語速 取值0-9,默認爲5 中語速 'pit':8, # 語調音調,取值0-9,默認爲5 中語調 'per':4, # 發音人選擇,0爲女生,1爲男生,3爲情感合成-度逍遙,4爲情感合成-度丫丫,默認爲普通女 } )
按照這些參數,重新發起一個語音合成
with open('auido.mp3', 'wb') as f: f.write(result)
點擊左邊的百度語言->語音識別->Python SDK
建議使用pcm,由於它比較好實現。而另外2種語言格式,有很是高的要求,只有專業級別的設備才能錄製。它才能達到百度的要求。
哎,每次到這裏,我都默默無語淚兩行,聲音這個東西格式太多樣化了,若是要想讓百度的SDK識別我們的音頻文件,就要想辦法轉變成百度SDK能夠識別的格式PCM
目前已知能夠實現自動化轉換格式而且屢試不爽的工具 : FFmpeg 這個工具的下載地址是 : 連接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密碼:w6hk
或者官網下載
http://ffmpeg.org/download.html
點擊windows圖標,點擊Builds
個人電腦是64位系統,選擇64位,必定要選擇Shared,最後點擊下載。
FFmpeg 環境變量配置:
首先你要解壓縮,而後找到bin目錄,個人目錄是 C:\ffmpeg\bin
而後 以 windows 10 爲例,配置環境變量
添加環境變量
若是沒搞明白的話,我也沒有辦法了,這麼清晰這麼明白
嘗試一下,是否配置成功
看到這個界面就算配置成功了,配置成功有什麼用呢, 這個工具能夠將wav wma mp3 等音頻文件轉換爲 pcm 無壓縮音頻文件
這個時候,必定要關閉Pycharm,不然Pycharm識別不到。
再次開啓Pycharm
作一個測試,首先要打開windows的錄音機,錄製一段音頻(說普通話)
如今假設錄製的音頻文件的名字爲 audio.wav 放置在 D:\DragonFireAudio\
而後咱們用命令行對這個 audio.wav 進行pcm格式的轉換而後獲得 audio.pcm
命令是 :
ffmpeg -y -i audio.wav -acodec pcm_s16le -f s16le -ac 1 -ar 16000 audio.pcm
而後打開目錄就能夠看到pcm文件了
若是須要使用實時識別、長語音、喚醒詞、語義解析等其它語音功能,請使用Android或者iOS SDK 或 Linux C++ SDK 等。
請嚴格按照文檔裏描述的參數進行開發,特別請關注原始錄音參數以及語音壓縮格式的建議,不然會影響識別率,進而影響到產品的用戶體驗。
目前系統支持的語音時長上限爲60s,請不要超過這個長度,不然會返回錯誤。
pcm文件已經獲得了,趕忙進入正題吧
舉例,要對段保存有一段語音的語音文件進行識別:
# 讀取文件 def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() # 識別本地文件 client.asr(get_file_content('audio.pcm'), 'pcm', 16000, { 'dev_pid': 1536, })
看參數,主要用到的是rate和1536
上圖的16000表示採樣率
1536表示能識別中文和英文,它的容錯率比較高
1537必須是標準的普通話,帶點地方口音是不行的。
因此建議使用1536
打開win10自帶的錄音機,錄製一段聲音,好比:你叫什麼呀
必定要帶一個呀字,下面的代碼執行會輸出10個結果,不然只有一個!
注意:筆記本的麥克風在攝像頭的2邊,因此錄製的時候,必定要對着攝像頭!
默認爲m4a格式的,重命名爲whatyouname.m4a,將文件放入ai目錄
修改baidu_ai.py,內容以下:
from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '11212345' API_KEY = 'pVxdhsXS1BIaiwYYNT712345' SECRET_KEY = 'BvHQOts27LpGFbt3RAOv84WfPCW12345' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) # 讀取文件 def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() # 識別本地文件 a = client.asr(get_file_content('whatyouname.m4a'), 'pcm', 16000, { 'dev_pid': 1536, }) print(a)
注意上面的id和key。文件名爲whatyouname.wav
執行文件,輸出:
{'sn': '7436726851526824321', 'err_no': 3301, 'err_msg': 'speech quality error.'}
返回錯誤'err_no': 3301
看文檔
找下面對應的3301,表示聲音不清晰!
再仔細用播放器,播放一下剛纔的聲音,挺清晰的呀!
這裏報3301不是由於聲音不清晰,而是格式不支持。
使用os模塊調用ffmpeg實現轉碼
代碼以下:
import os from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '11212345' API_KEY = 'pVxdhsXS1BIaiwYYNT712345' SECRET_KEY = 'BvHQOts27LpGFbt3RAOv84WfPCW12345' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) # 讀取文件 def get_file_content(filePath): cmd_str = "ffmpeg -y -i %s -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s.pcm"%(filePath,filePath) os.system(cmd_str) # 調用系統命令ffmpeg,傳入音頻文件名便可 with open(filePath + ".pcm", 'rb') as fp: return fp.read() # 識別本地文件 a = client.asr(get_file_content('whatyouname.m4a'), 'pcm', 16000, { 'dev_pid': 1536, }) print(a)
執行輸出,效果以下:
上面紅色文件,不是報錯,而是轉碼過程
主要看err_msg是什麼,這裏顯示success,表示成功。
在ai目錄下,會多出一個文件whatyouname.m4a.pcm。這個文件纔是剛纔真正發給百度的語言文件
返回的結果是一個字典,第一個結果,通常是最正確的。取第一個,就能夠了!
接下來,就須要從字典取值。字典取值,不要用如下這種方法:
print(a['result'])
爲何呢?若是key不存在,會直接報錯!畢竟報錯,是要崩潰的...
因此建議使用get方法,將最後一行的print(a),修改成如下內容:
import os from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '11212345' API_KEY = 'pVxdhsXS1BIaiwYYNT712345' SECRET_KEY = 'BvHQOts27LpGFbt3RAOv84WfPCW12345' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) # 讀取文件 def get_file_content(filePath): cmd_str = "ffmpeg -y -i %s -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s.pcm"%(filePath,filePath) os.system(cmd_str) # 調用系統命令ffmpeg,傳入音頻文件名便可 with open(filePath + ".pcm", 'rb') as fp: return fp.read() # 識別本地文件 a = client.asr(get_file_content('whatyouname.m4a'), 'pcm', 16000, { 'dev_pid': 1536, }) if a.get('result'): print(a.get('result')[0])
執行輸出:
從結果上來看就只有一個了。
whatyouname.m4a,是已經錄製好的音頻
import os from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '11212345' API_KEY = 'pVxdhsXS1BIaiwYYNT712345' SECRET_KEY = 'BvHQOts27LpGFbt3RAOv84WfPCW12345' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) # 讀取音頻文件函數 def get_file_content(filePath): cmd_str = "ffmpeg -y -i %s -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s.pcm"%(filePath,filePath) os.system(cmd_str) # 調用系統命令ffmpeg,傳入音頻文件名便可 with open(filePath + ".pcm", 'rb') as fp: return fp.read() # 識別本地文件 a = client.asr(get_file_content('whatyouname.m4a'), 'pcm', 16000, { 'dev_pid': 1536, }) # if a.get('result'): # print(a.get('result')[0]) q = a.get('result')[0] # 識別音頻文件的內容 a = "我不知道你在說什麼" if q == "你叫什麼名字": a = "我叫小青龍" # 配置音頻流,a就是指定的文本 result = client.synthesis(a, 'zh', 1, { 'spd': 4, 'vol': 5, 'pit': 8, 'per': 4 }) # 寫入文件 if not isinstance(result, dict): with open('audio.mp3', 'wb') as f: f.write(result) os.system("audio.mp3")
os.system("audio.mp3") ,它會自動調用windows的默認音頻軟件,並打開文件audio.mp3
執行程序,會自動彈出音樂播放器,內容是: 我叫小青龍
若是須要定義別的問題,須要從新錄製,並在py文件中定製問題。很low是吧,後續會講web版的問答系統!
短文本類似度接口用來判斷兩個文本的類似度得分。
文檔連接:
https://ai.baidu.com/docs#/NLP-Python-SDK/6dfe1b04
text1 = "浙富股份" text2 = "萬事通自考網" """ 調用短文本類似度 """ client.simnet(text1, text2); """ 若是有可選參數 """ options = {} options["model"] = "CNN" """ 帶參數調用短文本類似度 """ client.simnet(text1, text2, options)
查看參數
短文本類似度返回示例
{ "log_id": 12345, "texts":{ "text_1":"浙富股份", "text_2":"萬事通自考網" }, "score":0.3300237655639648 //類似度結果 },
舉例:
新建一個文件baidu_nlp.py
from aip import AipNlp APP_ID = '11212345' API_KEY = 'pVxdhsXS1BIaiwYYNT712345' SECRET_KEY = 'BvHQOts27LpGFbt3RAOv84WfPCW12345' nlp_client = AipNlp(APP_ID,API_KEY,SECRET_KEY) """ 調用短文本類似度 """ res = nlp_client.simnet("你叫什麼名字","你的名字叫什麼") print(res) # 若是類似度達到70% if res.get("score") > 0.7: print("我叫青龍")
執行輸出:
{'log_id': 4522060321660798564, 'texts': {'text_2': '你的名字叫什麼', 'text_1': '你叫什麼名字'}, 'score': 0.864488} 我叫青龍
這裏的score是類似度,這裏表示86.4%。若是是1,表示100%
那麼就可使用短文本類似度,來回答問題了
修改baidu_ai.py,導入AipNlp,修改問題部分,代碼以下:
import os from aip import AipSpeech from aip import AipNlp """ 你的 APPID AK SK """ APP_ID = '11212345' API_KEY = 'pVxdhsXS1BIaiwYYNT712345' SECRET_KEY = 'BvHQOts27LpGFbt3RAOv84WfPCW12345' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) nlp_client = AipNlp(APP_ID, API_KEY, SECRET_KEY) # 讀取音頻文件函數 def get_file_content(filePath): cmd_str = "ffmpeg -y -i %s -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s.pcm"%(filePath,filePath) os.system(cmd_str) # 調用系統命令ffmpeg,傳入音頻文件名便可 with open(filePath + ".pcm", 'rb') as fp: return fp.read() # 識別本地文件 a = client.asr(get_file_content('whatyouname.m4a'), 'pcm', 16000, { 'dev_pid': 1536, }) # if a.get('result'): # print(a.get('result')[0]) q = a.get('result')[0] # 識別音頻文件的內容 a = "我不知道你在說什麼" # 當類似度達到70%時 if nlp_client.simnet(q, "你的名字叫什麼").get("score") >= 0.7: a = "我叫小青龍" # 配置音頻流,a就是指定的文本 result = client.synthesis(a, 'zh', 1, { 'spd': 4, 'vol': 5, 'pit': 8, 'per': 4 }) # 寫入文件 if not isinstance(result, dict): with open('audio.mp3', 'wb') as f: f.write(result) os.system("audio.mp3")
執行程序,會自動打開音頻文件,說出: 我叫小青龍