sponsored links

用 Python 實現自己的智慧語音助理(百度語音 + 圖靈機器人)

依稀記得去年生日,對著 Google 說 “Sing me Happy Birthday” 。
她真的給我唱了英文版的生日歌,滿懷深情地(我感覺……)。最後還加了一串調皮的鼓聲。
我轉頭對著公司的前臺小姐姐說,看見沒有,你的 Siri 不愛我。。。

基於以上的淵源,我用 Python 寫了一個還算得上智慧的語音助理。

截圖如下:

用 Python 實現自己的智慧語音助理(百度語音 + 圖靈機器人)

演示影片:用 Python 實現的智慧語音機器人(一)

原始碼

不要慌,用的是現成的框架和公共 API,一百來行程式碼而已,權當遊戲。

一、整體結構

沒有做過多的設計(不懂。。。),整體就是一個簡單的線性結構,順序執行。
一次互動完畢後,從頭開始重複執行。

SpeechRecognition(錄音)--> 百度語音(Speech-to-Text)--> 圖靈機器人(語義分析及應答)--> 百度語音(Text-to-Speech)--> PyAudio(音訊播放)

二、SpeechRecognition

SpeechRecogintion 是 Python 的一個語音識別框架,已經對接瞭如谷歌和微軟的 STT (語音轉文字)服務。

本專案裡的語音識別及合成用的是百度的開放服務,所以只是需要 SpeechRecogintion 的錄音功能。
它可以檢測語音中的停頓自動終止錄音並儲存,比 PyAudio 更人性化(程式碼寫起來也更簡單)。

安裝依賴庫

Windows

安裝 SpeechRecognition 需要提前裝好 Python 的 PyAudio 框架。PyAudio 貌似需要編譯安裝,Windows 系統上估計會有點麻煩。

我用的是 Anaconda 軟體,Windows 系統上用它管理 Python 包很方便。
嫌這個軟體太大的話,也有簡化版的 Miniconda 。
裝好以後直接執行下面的命令即可(當然也可以在 conda 的虛擬環境裡安裝,不贅述):
conda install pyaudio

PyAudio 裝好以後,直接使用 Python 的包管理工具 pip 安裝 SpeechRecognition 即可:
pip install SpeechRecognition

Linux

Linux 系統下就顯得省事一點了。可以直接使用系統自帶的包管理器安裝 PyAudio (如 Ubuntu 和 Raspbian 系統的 apt-get)
$ sudo apt-get install python3-pyaudio

當然也可以使用 pip 命令安裝,不過需要提前裝好編譯用的依賴庫 portaudio19

1
2
$ sudo apt-get install portaudio19-dev
$ pip install pyaudio

同樣的,PyAudio 裝好以後,安裝 SpeechRecognition :
pip install SpeechRecognition

錄音程式碼

1
2
3
4
5
6
7
8
9
10
11
12
import speech_recognition as sr

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())

rec()

從系統麥克風拾取音訊資料,取樣率為 16000(貌似百度語音 API 最高就支援到 16k 的取樣率)。
之後把採集到的音訊資料以 wav 格式儲存在當前目錄下的 recording.wav 檔案中,供後面的程式使用。

錄音完成後,可以找到錄好的音訊檔案試聽一下效果。

三、百度語音(STT)

建立應用

百度語音是百度雲 AI 開放平臺提供的支援語音識別和語音合成的服務,註冊以後就可以直接訪問它的 REST API ,並且有向普通使用者提供免費的呼叫額度。

註冊成功以後,進入語音服務的控制檯建立一個新的應用,記下自己的名字 AppID、API Key 和 Secret Key。

用 Python 實現自己的智慧語音助理(百度語音 + 圖靈機器人)

語音識別程式碼

百度 AI 有提供面向 Python 的框架 baidu-aip ,感覺就相當於重新打包以後的 requests 庫,用來訪問 REST API。這裡簡單起見,直接使用該框架。
安裝:
pip install baidu-aip

語音識別程式碼如下(程式碼中的 Key 替換成自己的):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from aip import AipSpeech

APP_ID = 'Your AppID'
API_KEY = 'Your API Key'
SECRET_KEY = 'Your Secret Key'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

def listen():
    with open('recording.wav', 'rb') as f:
        audio_data = f.read()

    result = client.asr(audio_data, 'wav', 16000, {
        'dev_pid': 1536,
    })

    result_text = result["result"][0]

    print("you said: " + result_text)

    return result_text

listen()

簡單來說,將 SpeechRecognition 錄製的音訊上傳至百度語音的服務,返回識別後的文字結果並輸出。

四、圖靈機器人

圖靈機器人是一個提供(一定額度內)免費的智慧聊天服務的平臺,註冊以後就可以建立自己的智慧聊天機器人並接入到專案中。

首先進入圖靈機器人的控制檯並建立一個新的聊天機器人,記下分配到的 apikey。

用 Python 實現自己的智慧語音助理(百度語音 + 圖靈機器人)

該平臺也提供了開放的條件 REST API ,但是不像百度那樣打包自己的 SDK 。所以需要使用 Python 的 requests 庫訪問,程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import requests
import json

TURING_KEY = "Your 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": TURING_KEY,
            "userId": "starky"
        }
    }

    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

robot("你好")

簡單來說就是上傳一個 json 格式的請求(包含聊天內容和個人資訊等),獲取到回覆。再從收到的物件中提取出回覆的文字。

五、百度語音(TTS)

其實大部分系統都有內建的 TTS (即文字轉語音)引擎,如 MacOS 的 say 命令,只不過其中有很多都顯得太“機械”,呃,缺少“人情味兒”。。。

百度的 TTS 引擎語音效果聽起來還是很卡哇伊(4 號選手度丫丫)的,比較超出我的預期。

測試程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from aip import AipSpeech

APP_ID = 'Your AppID'
API_KEY = 'Your API Key'
SECRET_KEY = 'Your Secret Key'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

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)
speak("你好啊")

就是把需要轉換成語音的文字內容上傳,再將返回的資料儲存在本地。貌似只能生成 mp3 格式。

六、PyAudio 播放

這個我有點方,沒找到 Python 播放 MP3 的合適的方法,所以用 os.system 呼叫系統中的 sox 命令將 MP3 轉為 wav 格式,再用 PyAudio 播放。

sox 安裝

SoX 是一個強大的跨平臺的音訊處理工具,Linux 系統可以直接使用包管理器安裝:
$ sudo apt-get install sox libsox-fmt-mp3

Windows 系統安裝的預設的 SoX 是不包含 mp3 格式支援的,所以需要自己編譯(手動狗頭)或者下載已經編譯好的 dll 檔案(libmad.dll 和 libmp3lame.dll,放置在 SoX 的安裝目錄下。
最後將安裝目錄新增至系統的 PATH 環境變數即可。

程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import pyaudio
import wave
import os
import time

def play():
    os.system('sox audio.mp3 audio.wav')
    wf = wave.open('audio.wav', 'rb')
    p = pyaudio.PyAudio()

    def callback(in_data, frame_count, time_info, status):
        data = wf.readframes(frame_count)
        return (data, pyaudio.paContinue)

    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True,
                    stream_callback=callback)

    stream.start_stream()

    while stream.is_active():
        time.sleep(0.1)

    stream.stop_stream()
    stream.close()
    wf.close()

    p.terminate()

play()

七、最終程式碼及影片演示

整合後的最終程式碼我就不再貼一遍了,100 行左右,已上傳至 Github 。
影片效果:https://www.bilibili.com/video/av45532338/

聊天截圖:

用 Python 實現自己的智慧語音助理(百度語音 + 圖靈機器人)

對了,這個是支援樹莓派的。不過需要額外裝一個USB音訊驅動作為錄音裝置。參考樹莓派3 音訊配置及其應用場景(錄音、VoIP 電話等)

參考資料

SpeechRecognition
百度語音
圖靈機器人
PyAudio
SoX

原文連結:https://www.starky.ltd/2019/03/03/python-voice-assistant/

分類: 娛樂
時間: 2021-12-22

相關文章

漂亮!講究大女人的“衣櫥”有多高階?論穿搭衣品,堪稱一絕

漂亮!講究大女人的“衣櫥”有多高階?論穿搭衣品,堪稱一絕
文:洛薇 Hi,我是洛薇,繼續我們的時尚穿搭之旅,變美永遠不迷路.▼ 時尚穿搭和美,猶如"武功"晉級.隨著審美見識.衣品功底的逐級攀升,能領略到的風景更加旖旎精彩.這份玄妙,妙不可 ...

學會“一衣多搭”穿衣套路,我的衣品提升300%!27套搭配夠你借鑑

學會“一衣多搭”穿衣套路,我的衣品提升300%!27套搭配夠你借鑑
文:洛薇 圖:網路 Hi,我是洛薇,繼續我們的時尚穿搭之旅,變美永遠不迷路.▼ 每次寫文章時,知道最讓洛薇為難的是什麼嗎?當然是開場白的醞釀!寫些什麼呢?感悟?心得?時尚訊息?還是索性開門見山直接穿搭 ...

CC宋妍霏衣品翻車!針織衫西褲太肥了,169身高看起來卻又胖又矮

CC宋妍霏衣品翻車!針織衫西褲太肥了,169身高看起來卻又胖又矮
CC宋妍霏是時尚圈難得的時髦精,她出道以來衣品就受到了不少網友的喜歡,169的身高,完美的比例,優越的大長腿,穿搭幾乎沒有侷限性.基本上時尚圈流行的單品和風格,宋妍霏都挑戰過,每次的機場私服都讓人眼前 ...

辛芷蕾變胖了,但也沒影響顏值,V領上衣配亮片緊身褲,衣品線上

辛芷蕾變胖了,但也沒影響顏值,V領上衣配亮片緊身褲,衣品線上
一件服飾是由不同的元素組成的,光是領部設計就有很多種,圓領顯嫩經典.方領復古氣質滿滿.V領修飾臉型.無領的抹胸和一字肩都能展現女生的脖頸線條,所以這些領型你喜歡哪種呢? 小編覺得對於不同的人群選擇適合 ...

女人胖不胖還是得看氣質,陳麗華就算衣品不高,但卻很有奢侈感

女人胖不胖還是得看氣質,陳麗華就算衣品不高,但卻很有奢侈感
哈嘍,大家好,我是biu時尚,很高興又和大家分享明星時尚與搭配技巧!希望我的文章讓你對時尚更加的感興趣,讓本身就好看的你,更加的有魅力! 一些年齡偏大的女生會覺得印花的服飾太過於凌亂和張揚,並不符合她 ...

“會打扮”和“不會打扮”的區別,在這三個小細節,衣品太重要了

“會打扮”和“不會打扮”的區別,在這三個小細節,衣品太重要了
提升衣品是一個循序漸進的過程,可以先學習,再模仿,最後找到一些適合個人的搭配模式.衣品高與低總會形成一些區別,和你的長相或者是年齡.身材沒有太大的關聯,以下這三個細節才是決定成敗的關鍵. 1.領口的選 ...

40歲女人穿衣要講究一點,學會以下這些搭配技巧,打造高階衣品

40歲女人穿衣要講究一點,學會以下這些搭配技巧,打造高階衣品
嗨,各位小仙女們,大家好呀! 對於女人來說,最殘酷的莫過於是時間了,隨著年齡的增長,年輕的容顏不再,身材也隨之出現發胖發福,真的是無比悲哀.但無論如何,也不能隨波逐流,因為自己變老了,就開始不注重打扮 ...

關之琳的衣品不服不行,穿著“睡衣”照樣有氣質,真挺高貴的

關之琳的衣品不服不行,穿著“睡衣”照樣有氣質,真挺高貴的
在女生搭配服飾的時候,面料也是非常重要的,不要去小看服飾的面料,不同的面料是可以呈現出不同的視覺效果,如果搭配網紗的面料,所呈現的視覺效果會有唯美和夢幻. 如果是牛仔面料,那麼所呈現出來的就休閒和隨性 ...

34歲劉亦菲逛商場被偶遇!無濾鏡面板仍吹彈可破,衣品卻一言難盡

34歲劉亦菲逛商場被偶遇!無濾鏡面板仍吹彈可破,衣品卻一言難盡
近日,有網友在北京某商場逛街的時候偶遇劉亦菲,並曬出了拍到的圖片,直言仙女就是仙女,面板超級好,不過她的身高看起來沒有170cm,引發網友關注. 當天,劉亦菲穿著一件卡其色西裝外套搭配黑色長褲,塗大紅 ...

顏值高比什麼都重要!女孩穿上這身衣品很出眾,後面是男人前景

顏值高比什麼都重要!女孩穿上這身衣品很出眾,後面是男人前景
顏值高比什麼都重要!女孩穿上這身衣品很出眾,後面是男人前景

吳昕衣品“開掛”後太驚豔,西裝配上休閒褲,休閒正式風輕鬆拿捏

吳昕衣品“開掛”後太驚豔,西裝配上休閒褲,休閒正式風輕鬆拿捏
秋季的到來,讓很多人的平凡生活,變得更加浪漫.有趣,棕色是一種非常高階的色彩,在冥冥之中,給人的感覺會打造出與眾不同的浪漫,而且自身就帶有慵懶的風格. 在溫度適中的秋季,來選擇搭配棕色的時裝,這可能是 ...

吳莫愁的衣品比唱功還厲害,渾身穿得亮閃閃的,真讓人移不開眼

吳莫愁的衣品比唱功還厲害,渾身穿得亮閃閃的,真讓人移不開眼
在一些比較正式的場合當中,很多女生會用上隆重的服裝搭配自己,利用隆重的服裝造型來讓自己的氣質和魅力變得更加的出挑,也讓形象更為矚目. 但是隆重的服裝並不完全是禮服的形式,也有一些女孩子喜歡時尚感較強的 ...

陳潔靈氣質太挺出眾,穿“豹紋褲”很個性,但衣品有些一言難盡

陳潔靈氣質太挺出眾,穿“豹紋褲”很個性,但衣品有些一言難盡
在時尚圈當中,有一些時尚元素是比較出圈的,無數動物紋路的元素,給人的感覺比較誇張時尚,無論出現在哪一種風格的時尚單品中,都會有一定的吸引力,要麼會顯得時裝清新脫俗,要麼就會顯得著裝更加大氣野性. 正是 ...

衣品提升後的楊紫太好看,泡泡袖配波點裙,甜美氣質加倍

衣品提升後的楊紫太好看,泡泡袖配波點裙,甜美氣質加倍
#今天穿什麼##品牌好物# 不管到了什麼時代,大家對於時尚的從眾心其實都不會有太大的改變,雖然強調穿衣不能盲從,但當一個新設計誕生之後,大家還是會去選擇嘗試,也正是因為這種行為,才讓一個新設計得以流行 ...

林允衣品成謎,同穿“挖空吊襪”褲,還能穿出兩種不同感覺

林允衣品成謎,同穿“挖空吊襪”褲,還能穿出兩種不同感覺
#今天穿什麼##品牌好物# 自從時尚變得接地氣後,人人都有權利追求屬於自己的時尚,這也就導致了時尚領域出現了很多新穎的元素,其中長褲的時尚花樣就有不少,從以前時尚搭配中的配角形象,搖身一變,成為了造型 ...

12. 男人!別讓衣品坑了你

12. 男人!別讓衣品坑了你
衣品是一個不新不舊的說詞,有人說這是衣服多了之後,大家挑選衣服的一種思維方式:有人說這是商家在促銷軟文裡植入的引導性造詞.不管怎麼說,這個叫法,這個問題,對現代人行走社會還真是值得思考,尤其對我們廣大 ...

趙文卓大女兒太長臉了,才14歲出落得亭亭玉立,衣品也拿捏住了

趙文卓大女兒太長臉了,才14歲出落得亭亭玉立,衣品也拿捏住了
十幾歲豆蔻年華,無需刻意裝扮就有著滿滿的少女感,是不少成年女性看來最好的年紀.但是現實中有些女生反而急著長大,打扮得過於成熟,不符合實際年齡:或者是醉心學業疏忽了自己的形象,其實稍微穿得乾淨利落些就能 ...

林心如衣品越來越好,寶藍色襯衫配闊腿褲,復古造型別有韻味

林心如衣品越來越好,寶藍色襯衫配闊腿褲,復古造型別有韻味
#今天穿什麼##品牌好物# 自從復古風流行之後,大家的注意力似乎都被法式和港風的復古裙裝所吸引,在那些復古設計中,確實能夠讓我們更好的見識到自身所蘊藏的那種女性風情感,但其實復古造型中,除了這種風情優 ...

董潔敗在身高,和董璇同框矮了半個頭,好在衣品拔尖終於掰回一局

董潔敗在身高,和董璇同框矮了半個頭,好在衣品拔尖終於掰回一局
身材和顏值固然很重要,能對女性的外在分數起到決定性的作用,但倘若自身條件比較一般又想提升自己的外形分怎麼辦呢?這就離不開好的衣品來輔助啦,的確,衣品的重要性在外形上體現的十分關鍵,身材比例一般或是身形 ...

《德雲社》燒餅妻子雖是網紅臉,但穿碎花裙挺淑女,衣品加分了

《德雲社》燒餅妻子雖是網紅臉,但穿碎花裙挺淑女,衣品加分了
如今的時尚廣受西方影響,風格也變得更加獨立和大膽.但是近兩年"斬男風"."好嫁風"."茶氣風"的流行都說明了,國人的審美還是偏向於傳統的溫婉 ...