python 全棧開發,Day122(人工智能初識,百度AI)


 

一、人工智能初識

什么是智能?

我們通常把人成為智慧生物,那么”智慧生物的能力”就是所謂的” 智能”
我們有什么能力?
聽,說,看,理解,思考,情感等等

什么是人工智能?

顧名思義就是由人創造的”智慧能力”,同樣具備,聽,說,看,理解等能力
聽=語音識別
說=語音合成
看=圖像視頻文字識別
理解=語言(文字)圖像視頻理解等邏輯處理
思考=理解后的邏輯處理

舉個小"栗"子

我來問,你來答
問題:你叫什么名字?
答案:我的名字叫栗子
回答者”聽,看”到問題,通過大腦進行問題的”理解”
回答者獲得答案后,”說,寫”問題的答案給提問者
這里的聽就是語音識別,理解就是語言理解,說就是語音合成

糖炒栗子

假設你現在是一個聾啞人,只能通過看,來獲取信息
下面有一張圖片,看到這幅圖片,你想到了什么

 

大家看到這張圖片會想到什么?"小豬佩奇","豬","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

 

請嚴格按照文檔里描述的參數進行開發。請注意以下幾個問題:

  1. 合成文本長度必須小於1024字節,如果本文長度較長,可以采用多次請求的方式。切忌文本長度超過限制。

  2. 語音合成 rest api不限制調用量,但是初始的QPS為100,如果默認配額不能滿足您的業務需求,請從控制台中申請提高配額,我們會在兩個工作日內完成審批

  3. 必填字段中,嚴格按照文檔描述中內容填寫。

 

語音合成 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_KEYSECRET_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 等。

  1. 請嚴格按照文檔里描述的參數進行開發,特別請關注原始錄音參數以及語音壓縮格式的建議,否則會影響識別率,進而影響到產品的用戶體驗。

  2. 目前系統支持的語音時長上限為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)
View Code

 

執行輸出,效果如下:

 

 

上面紅色文件,不是報錯,而是轉碼過程

主要看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])
View Code

 

執行輸出:

從結果上來看就只有一個了。

 

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")
View Code

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("我叫青龍")
View Code

執行輸出:

{'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")
View Code

 

執行程序,會自動打開音頻文件,說出: 我叫小青龍

 

本文參考:

https://www.cnblogs.com/DragonFire/p/9208195.html

 

http://www.py3study.com/Article/details/id/253.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM