一、人工智能初識
什么是智能?
我們通常把人成為智慧生物,那么”智慧生物的能力”就是所謂的”智能”
我們有什么能力?
聽,說,看,理解,思考,情感等等
什么是人工智能?
顧名思義就是由人創造的”智慧能力”,同樣具備,聽,說,看,理解等能力
聽=語音識別
說=語音合成
看=圖像視頻文字識別
理解=語言(文字)圖像視頻理解等邏輯處理
思考=理解后的邏輯處理
舉個小"栗"子
我來問,你來答
問題:你叫什么名字?
答案:我的名字叫栗子
回答者”聽,看”到問題,通過大腦進行問題的”理解”
回答者獲得答案后,”說,寫”問題的答案給提問者
這里的聽就是語音識別,理解就是語言理解,說就是語音合成
糖炒栗子
假設你現在是一個聾啞人,只能通過看,來獲取信息
下面有一張圖片,看到這幅圖片,你想到了什么

大家看到這張圖片會想到什么?"小豬佩奇","豬","pig"....
那么答案重合率最高的,就是答案!
這叫圖像理解
目前的人工智能做了什么?
語音識別:小米的小愛同學,蘋果的siri,微軟的Cortana
語音合成:小米的小愛同學,蘋果的siri,微軟的Cortana
圖像識別:交通攝像頭拍違章,刷臉解鎖手機等
視頻識別:抖音內容審核,視頻社交APP的審核機制
文字識別:從身份證照片提取身份證號碼,掃一掃翻譯
語義理解:智能問答機器人,也包含小米的小愛同學,蘋果的siri,微軟的Cortana
我們身邊的人工智能
銀行辦卡刷臉就行
車輛違章有牌兒就跑不了
違法犯罪路過天眼,等於自投羅網
“小愛同學”,”哎~”,”打開電視”,”好的!”
“歡迎使用10010智能語音系統”,”我還有多少話費”,”您的話費余額為0.01元”
掃一掃翻譯看不懂的文字(支持26國語言)
我們與人工智能的故事
現在才剛剛開始!

二、百度AI
此篇是人工智能應用的重點,只用現成的技術不做底層算法,也是讓初級程序員快速進入人工智能行業的捷徑
目前市面上主流的AI技術提供公司有很多,比如百度,阿里,騰訊,主做語音的科大訊飛,做只能問答的圖靈機器人等等
這些公司投入了很大一部分財力物力人力將底層封裝,提供應用接口給我們,尤其是百度,完全免費的接口
既然百度這么仗義,咱們就不要浪費掉怎么好的資源,從百度AI入手,開啟人工智能之旅
開啟人工智能技術的大門 : http://ai.baidu.com/

看看我大百度的AI大法,這些技術全部都是封裝好的接口,看着就爽
接下來咱們就一步一步的操作一下
注冊百度賬號
首先進入控制台,注冊一個百度的賬號(百度賬號通用)

開通一下我們百度AI開放平台的授權
然后找到已開通服務中的百度語音

走到這里,想必已經知道咱們要從語音入手了,語音識別和語音合成
創建語音應用
打開百度語音,進入語音應用管理界面,創建一個新的應用

創建語音應用App

應用名稱:可以隨意寫
應用類型:這里隨便選擇,暫時選擇學習辦公
接口選擇:默認勾選了語音識別和語音合成。在自然語言處理中,全部選擇。下面會用到!
語言包名:選擇不需要,因為接下來是用純python操作!
應用描述:寫上一些描述,或者感人的話,都行!
回到應用列表我們可以看到已創建的應用了

這里面有三個值 AppID , API Key , Secret Key 記住可以從這里面看到 , 在之后的學習中我們會用到
好了 百度語音的應用已經創建完成了 接下來 我會用Python 代碼作為實例進行應用及講解
語音合成
安裝SDK
首先咱們要 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,執行
pip install baidu-aip即可。 - 如果已安裝setuptools,執行
python setup.py install即可。
打開windows的cmd窗口,輸入命令 pip3 install baidu-aip
我已經安裝好了,效果如下:

新建AipSpeech
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位我改了,復制我的也沒有用!呵呵!
請求說明
- 合成文本長度必須小於1024字節,如果本文長度較長,可以采用多次請求的方式。文本長度不可超過限制
舉例,要把一段文字合成為語音文件:
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)
這次聲音是不是與一點點蘿莉了呢?
這都是語音語調的作用 0 - 9 其實就是 御姐音 - 蘿莉音
這就是人工智能中的語音合成技術,調用百度的SDK,只用了5分鍾,完成了1年的開發量,哈哈哈哈
一定要自己練習一下語音合成, 別把它玩兒壞了
語音識別
點擊左邊的百度語言->語音識別->Python SDK

建議使用pcm,因為它比較好實現。而另外2種語言格式,有非常高的要求,只有專業級別的設備才能錄制。它才能達到百度的要求。
哎,每次到這里,我都默默無語淚兩行,聲音這個東西格式太多樣化了,如果要想讓百度的SDK識別咱們的音頻文件,就要想辦法轉變成百度SDK可以識別的格式PCM
FFmpeg
目前已知可以實現自動化轉換格式並且屢試不爽的工具 : 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])
執行輸出:

從結果上來看就只有一個了。
low版問答系統
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")
執行程序,會自動打開音頻文件,說出: 我叫小青龍
本文參考:
https://www.cnblogs.com/DragonFire/p/9208195.html
http://www.py3study.com/Article/details/id/253.html
