友情提示:380元/半年,儿童学编程,就上码丁实验室。
语音处理技术是当前很热门的一个主题,今天用树莓派来做一个实时口译机器人,透过这个项目来初步探讨一下语音消息和文字讯息之间进行转换的技术。
从TTS与STT谈起
TTS Text-To-Speech文字转语音技术,看似单纯的字句一对一转换,背后可是牵涉到种种复杂的判断处理以及语音数据的分析应用,才能让计算机发出各种维妙维肖、比拟人声且抑扬顿挫的口语发音:
TTS的应用领域相当广泛,除了使用在既有的导航系统、车机、有声书或行动装置之外,更多因应行动网络而衍生的语音互动功能,如家用机器人以及FB带动的chat bot聊天机器人,皆让TTS的后势更加看好,此外不可忽视的是,未来还有众多视力不佳听力受限的老年化人口需要透过TTS语音的辅助。
至于STT(Speech-To-Text),它的角色就像I/O接口的Input,负责将用户的口说讯息转换为文字提供给系统进行分析处理,理论上,STT所需的技术含量比起TTS更复杂门坎也更高,主要原因是它所直接处理的是非结构化的语音文件,这需要透过大量的语音数据库经过过长时间的特征比对与学习,并结合高效率的硬件平台的辅助,才能在短时间内完成复杂的语意分析,准确无误的判别使用者说话内容分析其意图,实时响应使用者正确的需求。
目前较成熟的STT系统多采用云端方式,例如Google的Web Speech API、Microsoft的Bing Speech API、IBM Watson Developer Cloud的Speech to Text、nuance的Dragonspeech recognition等等。此外,Facebook旗下的wit.ai,以及它的竞争对手api.ai也都提供开发者功能相当多且强大的STT系统,并支持完整的API和说明档,唯一可惜的是他们这些云端服务都必须连网才能使用.如果我们的产品不具网络功能但又需要STT语音,那么可以考虑espeak、Julius或CMU-Sphinx这类可安装在本机端的开源STT系统,只是我们必须自行花时间建立语音数据库自行训练,才能得到满意的输出效果。
系统目标
本项目将制作出一个自动口译机器人,只要对着它说话,就能马上将所说的内容翻译成英文(或他国)语言说出来。在这项目里充份运用了Python的开源modules,只要一步步照著作便可以实作出来。
材料准备
树莓派主板Raspberry Pi 3 Model B x 1
LM386增益音频放大模块 x 1
扬声器0.5w x 1
3.5”音源线 x 1
USB 麦克风 x 1
TFT LCD : 2.2吋,使用ILI9341驱动的TFT LCD,可透过SPI接口与RPI或Arduino连接,电源3.3或5V皆可。
制作过程
使用了三种Google云端服务以及相对应的Python模块。
Python模块使用
SpeechRecognition:
https://pypi.python.org/pypi/SpeechRecognition/
它将一些常用的speech recognition系统整合在一起,方便我们使用,可省下相当多的开发时间。该模块整合了下列知名的STT API:
CMU Sphinx (works offline)
Google Speech Recognition
Wit.ai
Microsoft Bing Voice Recognition
api.ai
IBM Speech to Text
安装:sudo pip3 install SpeechRecognition
TextBlob:
https://textblob.readthedocs.io/en/dev/#
这是一套强大的文本分析工具,提供了方便的工具进行词性分类、名词短语截取、情感分析、文本分类、拼写检查、翻译和语言检测…等等,未来我们再针对此模块作深入的使用,在这里我们将仅使用它的翻译功能(透过Google API)
安装:
sudo pip3 install -U textblob
sudo python3 -m textblob.download_corpora
(下载必要的语料库,若自行指定其它的语料库,可更改NLTK_DATA环境变量)
gTTS(Google Text to Speech):
https://pypi.org/project/gTTS/
这个模块提供一个方便使用Google’s Text to Speech API的接口。在这里我们并没有使用工研院而改用Google的TTS原因是,工研院 TTS的处理效率实在太慢且又不稳定了,虽然音质较好也较自然,但是考虑到实时翻译的流畅性还是优先考虑Google TTS,不过未来我们也可以将工研院TTS功能加到程序中,让用户自行切换选择。
安装:sudo pip3 install gTTS
PyAudio:
http://people.csail.mit.edu/hubert/pyaudio/
gTTS会将文字转出的语音存成mp3文件,我们使用pyAudio来播放此mp3檔。
安装:
sudo apt-get install libasound-dev
wgethttp://portaudio.com/archives/pa_stable_v19_20140130.tgz
tar –zxvf
cd portaudio
./configure; make; sudo make install
git clonehttp://people.csail.mit.edu/hubert/git/pyaudio.git
cd pyaudio
sudo python3 setup.py install
程序开发:
由于我们大量使用了各种开源的Python模块,因此一开始需要撰写的程序并不需要太多。下方程式执行的流程就如同上述的系统图表。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
fromLanguage = "zh-TW"
toLanguage = "en"
import os
from os import path
import speech_recognition as sr
from textblob import TextBlob
from gtts import gTTS
try:
while True:
r = sr.Recognizer()
with sr.Microphone() as source:
print("Say something!")
audio = r.listen(source)
sttTXT_org = r.recognize_google(audio,language = fromLanguage)
print("Google Speech Recognitionthinks you said: " + sttTXT_org)
sttTXT_tblob = TextBlob(sttTXT_org)
blobTranslated = sttTXT_tblob.translate(to=toLanguage)
print("Translated –>" + blobTranslated.raw)
tts = gTTS(blobTranslated.raw + ".",)
tts.save("tts.mp3")
os.sySTEM(‘omxplayer -p -o hdmi tts.mp3′)
except sr.UnknownValueError:
print("Google Speech Recognitioncould not understand audio")
except sr.RequestError as e:
print("Could not request resultsfrom Google Speech Recognition service; {0}".format(e))
麦克风设定:
sudo raspi-config → Advancedoptions→ Audio →选择Force 3.5mm (‘headphone’) jack
sudo nano /lib/modprobe.d/aliases.conf(将 optionssnd-usb-audio index=-2 前方加上#,用意是让USB audio能成为默认的装置)
nano ~/.asoundrc,加入下方内容
pcm.!default {
type plug slave { pcm"hw:1" }
}
ctl.!default {
type hw card 1
}
原始程序请参考:https://github.com/ch-tseng/Translate-Bot/blob/master/main.py
请见Demo影片: