IT|軟體|應用|語音辨識|即時說話口譯 DIY-1 基本應用

本翻譯機器人的完整程式碼放置於https://github.com/ch-tseng/Translate-Bot

[材料準備]

1. 樹莓派主板 x 1(Raspberry Pi 3 Model B)
2. 揚聲器0.5w x 1
3. 3.5"音源線  x 1
4. 3.5"麥克風 x 1
6.音效卡

因為樹莓派沒有內建mic輸入,所以要使用 STT 功能,首先要先在樹莓派上裝一支麥克風,有兩種方式可以替樹莓派裝上麥克風,相關麥克風設定,請參考以下記事鏈結。--> IoT|硬體|樹莓派|外接麥克風及喇叭設置

[更新系統]

首先是更新軟體套件的清單:
sudo apt-get update

然後更新軟體套件本身(也可以用dist-upgrade):
sudo apt-get upgrade

若想更新韌體部分,指令如下(若擔心的話,請事先備份整張記憶卡):
sudo rpi-update

完成後,重開機:
sudo reboot


[安裝軟體]

SpeechRecognition:它將一些常用的 speech recognition 系統整合在一起,方便我們使用,可省下相當多的開發時間。該模組整合了下列知名的STT API:
1. CMU Sphinx (works offline)
2. Google Speech Recognition
3. Wit.ai
4. Microsoft Bing Voice Recognition
5. api.ai
6. IBM Speech to Text

安裝 Python3 SpeechRecognition 模組
sudo pip3 install SpeechRecognition

TextBlob:這是一套強大的文本分析工具,提供了方便的工具進行詞性分類、名詞短語截取、情感分析、文本分類、拼寫檢查、翻譯和語言檢測…等等,未來我們再針對此模組作深入的使用,在這裏我們將僅使用它的翻譯功能(透過Google API)
安裝 TextBlob

安裝 TextBlob
sudo pip3 install -U textblob

下載必要的語料庫,若自行指定其它的語料庫,可更改NLTK_DATA環境變數
sudo python3 -m textblob.download_corpora

gTTS(Google Text to Speech):這個模組提供一個方便使用Google's Text to Speech API的介面。在這裏我們並沒有使用工研院而改用Google的TTS原因是,工研院 TTS的處理效率實在太慢且又不穩定了,雖然音質較好也較自然,但是考慮到即時翻譯的流暢性還是優先考慮Google TTS,不過未來我們也可以將工研院TTS功能加到程式中,讓使用者自行切換選擇。

安裝 gTTS
sudo pip3 install gTTS


聲音檔轉成FLAC無損格式,取得並安裝FLAC
sudo apt-get install flac

注意:執行以上指令若遇到錯誤,請再次重新更新系統。

PyAudio:gTTS會將文字轉出的語音存成mp3檔,我們使用pyAudio來播放此mp3檔
sudo apt-get install libasound-dev
sudo apt-get install python-pyaudio python3-pyaudio

注意:執行以上指令若遇到錯誤,請再次重新更新系統。

將中文語音轉為文字內容後進行英文轉譯,並透過喇叭輸出電腦合成音效。
python3 translatedSpeech.py

translatedSpeech.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

fromLanguage = "zh-TW"
toLanguage = "en"

import time

import os
from os import path

import speech_recognition as sr
from textblob import TextBlob

from gtts import gTTS

tts = gTTS(text="您好,我是語音辨識助理", lang=fromLanguage)
tts.save("tts.mp3")
os.system('omxplayer -p -o local tts.mp3')
time.sleep(0.5)

while True:

  try:
    r = sr.Recognizer()
    with sr.Microphone() as source:
       print("Say something!")
       audio = r.listen(source)

    # sttTXT_org = r.recognize_google(audio, key="AIzaSyDMjV3fPEyVyQ6CGv6hZ-5Ndn9vCn-2NtI", language$
    sttTXT_org = r.recognize_google(audio, language=fromLanguage)
    print("Google Speech Recognition thinks you said: " + sttTXT_org)

    sttTXT_tblob = TextBlob(sttTXT_org)

    blobTranslated = sttTXT_tblob.translate(to=toLanguage)
    print("Translated --> " + blobTranslated.raw)

    tts = gTTS(text="您剛剛說的語句是." +sttTXT_org+"英文翻譯是.", lang=fromLanguage)
    tts.save("tts.mp3")
    os.system('omxplayer -p -o local tts.mp3')
    time.sleep(0.5)

    tts = gTTS(blobTranslated.raw + ". ", lang=toLanguage)
    tts.save("tts.mp3")
    os.system('omxplayer -p -o local tts.mp3')
    time.sleep(0.5)


  except sr.UnknownValueError:
       print("Google Speech Recognition could not understand audio")
       tts = gTTS(text="您剛剛說的我沒聽懂,麻煩您再說一次", lang=fromLanguage)
       tts.save("tts.mp3")
       os.system('omxplayer -p -o local tts.mp3')
       time.sleep(0.5)

  except sr.RequestError as e:
       print("Could not request results from Google Speech Recognition service; {0}".format(e))
       time.sleep(0.5)

測試範例
你好

將中文語音轉為文字內容,並透過喇叭輸出電腦合成音效。
python3 textSpeech.py

textSpeech.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

fromLanguage = "zh-TW"
toLanguage = "en"

import time

import os
from os import path

import speech_recognition as sr
from textblob import TextBlob

from gtts import gTTS

tts = gTTS(text="您好,我是語音辨識助理", lang=fromLanguage)
tts.save("tts.mp3")
os.system('omxplayer -p -o local tts.mp3')
time.sleep(0.5)

while True:

  try:
    r = sr.Recognizer()
    with sr.Microphone() as source:
       print("Say something!")
       audio = r.listen(source)

    # sttTXT_org = r.recognize_google(audio, key="AIzaSyDMjV3fPEyVyQ6CGv6hZ-5Ndn9vCn-2NtI", language$
    sttTXT_org = r.recognize_google(audio, language=fromLanguage)
    print("Google Speech Recognition thinks you said --> " + sttTXT_org)

    tts = gTTS(text="您剛剛說的語句是." +sttTXT_org, lang=fromLanguage)
    tts.save("tts.mp3")
    os.system('omxplayer -p -o local tts.mp3')
    time.sleep(0.5)

  except sr.UnknownValueError:
       print("Google Speech Recognition could not understand audio")
       tts = gTTS(text="您剛剛說的我沒聽懂,麻煩您再說一次", lang=fromLanguage)
       tts.save("tts.mp3")
       os.system('omxplayer -p -o local tts.mp3')
       time.sleep(0.5)

  except sr.RequestError as e:
       print("Could not request results from Google Speech Recognition service; {0}".format(e))
       time.sleep(0.5)

測試範例
數數 1 2 3 4

播放設備
os.system('omxplayer -p -o local tts.mp3')
—>-o  --adev  device          Audio out device      : e.g. hdmi/local/both/alsa[:device


[參考]

留言

這個網誌中的熱門文章

IoT|硬體|樹莓派|外接麥克風及喇叭設置

成長|語文|學習-英文 持續更新!

IoT|硬體|通訊|Arduino 使用 SoftwareSerial Library 與電腦通訊