1. 介绍
Jasper是一款基于树莓派的开源语音控制助理
Jasper工作原理主要是设备被动监听麦克风, 当收到唤醒关键字时进入主动监听模式, 此时收到语音指令后进行语音识别, 然后对得到的文本进行语义内容解析并处理, 然后将处理结果通过语音合成并输出给用户.
其中涉及到的技术包括声音的录制和播放; 语音识别(ASR/STT); 语义内容(NLU/NLP); 语音合成(TTS)
2. 音频系统
2.1 硬件
音频系统的硬件设备为声卡, 声卡通过DAC(数模转换)和ADC(模数转换)实现音频的输入和输出.
下面是Linux下查看声卡设备的命令
$ lspci | grep -i audio
00:05.0 Audio device: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller (rev 01)
$ cat /proc/asound/cards
0 [Intel ]: HDA-Intel - HDA Intel
HDA Intel at 0xf0804000 irq 21
2.2 软件
在Linux中音频系统结构如下
在桌面Linux系统中, 音频系统通常包含驱动层、服务层(声音服务器)和应用层.
在嵌入式系统中, 音频系统通过只包含驱动层和应用层.
在Linux下有两套音频驱动系统, 分别是OSS和ALSA.
2.2.1 OSS
OSS(Open Sound System), 是类Unix和POSIX兼容系统上统一的声音架构, 兼容OSS API的应用程序可以方便地进行移植
OSS API 主要提供如下设备文件接口
/dev/mixer: 混音及控制
/dev/dsp: 音频输入输出
现如今大部分Linux系统并不提供OSS驱动, 而使用ALSA, 故在此不详述.
更多信息参考<OSS--跨平台的音频接口简介>
2.2.2 ALSA
ALSA(Advanced Linux Sound Architecture)是OSS的继任者, 目前已经成为Linux下主流音频架构
ALSA包含驱动、函数库以及工具包
alsa-driver: 驱动部分, 集成在内核中, 大多以模块的方式存在
驱动可分为如下三层
- 底层的硬件操控层: 负责实现硬件操纵访问功能, 这也是声卡驱动程序中厂商需实现的主要部分
- 中间层核心层: 由各种功能的音频设备组件构成, 为用户提供一些预定义组件(如PCM、AC97、音序器和控制器等), 另外用户也可以自行定义设备组件
- 声卡对象描述层: 它是声卡硬件的抽象描述, 内核通过这些描述可以得知该声卡硬件的功能、设备组件和操作方法等
驱动程序为用户空间提供了如下抽象接口
/proc/asound: 信息接口
/dev/snd/controlCX: 控制接口
/dev/snd/mixerCXDX: 混音器接口
/dev/snd/pcmCXDX: PCM接口
/dev/snd/midiCXDX: MIDI接口
/dev/snd/seq: 音序器接口
/dev/snd/timer: 定时器接口
alsa-lib: 用户空间函数库, 封装驱动提供的抽象接口, 通过文件libasound.so提供API给应用程序使用
alsa-utils: 实用工具包,通过调用alsa-lib实现播放音频(aplay)、录音(arecord) 等工具
2.2.3 服务层
声音服务器介于ALSA和应用程序之间, 应用程序调用声音服务器的API来播放声音时, 同时把音频数据送到声音服务器, 声音服务器将一个以上的播放请求混音后, 再发送给底层的声卡驱动(ALSA/OSS), 由ALSA或OSS来驱动声卡播放混音后的数据.
ESD(Enlightened Sound Daemon, or EsounD): 是Gnome桌面环境的的声音服务器, 已被PulseAudio替代.
aRts(Analog Real-Time Synthesizer): 是KDE桌面环境的声音服务器, 已被Phonon替代.
PulseAudio: 新一代声音服务器, 能提供更好的音效, 目前是Gnome桌面的默认声音服务器.
2.2.4 其他软件
除了声音服务器之外, 还有一些常见的中间层/声音库
JACK Audio Connection Kit: 专业的声音服务器, 为应用程序之间的音频和MIDI数据提供实时、低延迟的连接.
GStreamer: 是用来构建流媒体应用的开源多媒体框架.
Phonon: Qt上跨平台多媒体框架.
PortAudio: 跨平台开源的音频I/O库, 在Linux需要alsa-lib的支持.
3. 语音识别
语音识别(Speech recognition)技术, 被称为自动语音识别, ASR(Automatic Speech Recognition);
也称语音转文字, Speech To Text(STT)
4. 语音合成
语音合成即TTS(Text To Speech), 目前有开源的方案和专有方案
开源方案包括
- eSpeak/eSpeakNG、Ekho、Festival/FestVox/Flite
专有方案包括
- Google TTS、Amazon Polly、Neospeech TTS等
- Baidu TTS、Ali TTS、iFlyTek TTS等
4.1 eSpeak
eSpeak支持中文输出, 不过效果真心不敢恭维
$ espeak -vzh "我是中国人, 我爱中国"
4.2 Ekho
Ekho是一款免费的开源和多语言文本转语音软件
它支持粤语、普通话等等
4.2 Festival
Festival为爱丁堡大学CSTR开发的通用多语言语音合成系统
FestVox为CMU开发的用来构建合成声音的软件
Flite(Festival-Lite)为CMU开发的基于Festival的精简版语音合成系统
简单来说, Festival和Flite可以进行TTS转换, 然后使用FestVox提供的声音进行输出。
// Festival
# yum install festival
$ echo "Hello, You are using festival" | festival –tts
$ festival --tts myfile
// Flite
# yum install flite
$ flite "Hello, You are using flite" a.wav
$ aplay a.wav
Festival效果比espeak稍好, 不过不支持中文
参考:
<Alsa Opensrc Org>
<Linux ALSA声卡驱动开发最佳实践>
<How it works: Linux audio explained>