1. 介绍

Jasper是一款基于树莓派的开源语音控制助理, 使用Python语言开发.

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)

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和应用程序之间, 解决了不同应用程序之间独占声卡和混音问题; 当没有声音服务器时, 而已使用dmixer来实现简单的混音.
应用程序调用声音服务器的API来播放声音时, 同时把音频数据送到声音服务器, 声音服务器将一个以上的播放请求混音后, 再发送给底层的声卡驱动(ALSA/OSS), 由ALSA或OSS来驱动声卡播放混音后的数据.

ESD(Enlightened Sound Daemon, or EsounD): 是Gnome桌面环境的的声音服务器, 已被PulseAudio替代.
aRts(Analog Real-Time Synthesizer): 是KDE桌面环境的声音服务器, 已被Phonon替代.
PulseAudio: 新一代声音服务器, 能提供更好的音效, 目前是Gnome桌面的默认声音服务器.
JACK Audio Connection Kit: 专业的声音服务器, 为应用程序之间的音频和MIDI数据提供实时、低延迟的连接.
AudioFlinger: Android上的声音服务器.

2.2.4 其他音频库

除了声音服务器之外, 还有一些常见的音频框架和库
GStreamer: 是用来构建流媒体应用的开源多媒体框架.
Phonon:     Qt上跨平台多媒体框架.
PortAudio:  音频I/O库, 提供C和C++接口, 跨平台, 在Linux上支持ALSA、OSS后端.
libsoundio: 轻量级抽象库, 提供C接口, 跨平台, 在Linux上支持JACK、PulseAudio、ALSA后端
RtAudio:     实时音频库, 提供C++接口, 跨平台, 在Linux上支持JACK、PulseAudio、ALSA、OSS后端

更多音频相关内容请参考<Linux音频编程介绍>

2.3 Jasper中的音频处理

2.3.1 基础介绍

Python中音频库众多, 常用的有如下:

Pydub:  一个高级音频接口, 需要ffmpeg或者libav支撑.
sounddevice: PortAudio库的绑定, 并与Numpy兼容的录音以及播放库.
PyAudio: PortAudio库的绑定, 需要PortAudio库支撑, 跨平台.
pyalsaaudio: ALSA API的封装, 需要ALSA库支撑, 只支持Linux.
pymad: 使用MAD(MPEG Audio Decoder)库的高级音频接口, 需要libmad支撑.

2.3.2 音频输入

Jasper的音频输入使用的库为PyAudio, 通过PyAudio录制声音并保存为wav格式文件, 然后送给STT引擎处理.

2.3.3 音频输出

Jasper中音频输出主要是将TTS结果输出给用户, 主要有三种
- 使用eSpeak、Festival等离线引擎则直接与系统交互.
- 调用系统的aplay、play命令直接播放Web API返回的音频文件.
- 使用Python库播放Web API返回的音频文件, 使用pymad进行播放.

注意: Jasper在运行中会输出如下信息, 这不是错误.

ALSA lib pcm_dmix.c:1090:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:867:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib pcm_dmix.c:1090:(snd_pcm_dmix_open) unable to open slave
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started

具体可参考<PyAudio, PortAudio, and ALSA messages>

3. 语音识别

语音识别(Speech recognition)技术, 被称为自动语音识别, ASR(Automatic Speech Recognition);
也称语音转文字, Speech To Text(STT), 目前有如下方案

开源方案包括
- CMUSphinx、ISIP、JuliusKaldi、Mozilla DeepSpeech

专有方案包括
- HTK、RWTH ASR
- Google STT、Amazon Alexa、Microsoft Speech API、Nuance Voice Platform
- Baidu STT、Ali STT、iFlyTek STT

- 基于CMUSphinx有Platypus, FreeSpeech, Vedics, NatI, Simon, Xvoice, Zanzibar, OpenIVR, Dragon Naturally Speaking等方案
- Microsoft Speech API只能在Windows平台上使用, 支持中文
- iFlyTek另有AiSound(语音合成)、AiTalk(语音识别)用于汽车导航的离线引擎
- IBM Watson平台提供了TTS、STT等服务
- Tizen OS也拥有的TTS和STT功能

另外值得一提工具有:
VoxForge: 一个免费的语音语料库和开源语音识别引擎的声学模型库, 支持的引擎包括CMUSphinx、ISIP、HTK和Julius
Python SpeechRecognition: 支持多个引擎和API(包括在线和离线)用于执行语音识别的Python库

4. 语音合成

语音合成即TTS(Text To Speech), 目前有如下方案

开源方案包括
- eSpeak/eSpeakNG、Ekho、Festival/FestVox/Flite、Tizen TTS、MaryTTS(Java)

专有方案包括
- Google TTS、Amazon Polly(IvonaTTS)、Microsoft Speech API、Voice RSS、Neospeech TTS
- Baidu TTS、Ali TTS、iFlyTek TTS

Neospeech TTS提供云端服务和Windows版本, 支持中文

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稍好, 不过不支持中文

5. 语义内容

这部分的内容是一个非常复杂的东西, 个人理解可以归为自然语言理解(Natural Language Understanding, 简称NLU)或者自然语言处理(Natural Language Processing, 简称NLP)学科范畴.

NLP通常包含如下内容

- 分词: 只针对中文,英文等西方字母语言已经用空格做好分词了, 将文章按词组分开
- 词法分析: 对于英文,有词头、词根、词尾的拆分,名词、动词、形容词、副词、介词的定性,多种词意的选择
- 语法分析: 通过语法树或其他算法,分析主语、谓语、宾语、定语、状语、补语等句子元素
- 语义分析: 通过选择词的正确含义,在正确句法的指导下,将句子的正确含义表达出来。方法主要有语义文法、格文法

Python自然语言处理库很多, 常见的有:

NLTK: Natural Language Toolkit, 自然语言工具箱.
TextBlob: 提供了一个简单的API来处理文本数据, 用于常见的NLP任务.
Gensim:  用于主题建模、文档索引和大型语料库相似性检索.
jieba:  中文分词组件.
SnowNLP: 可以方便的处理中文文本内容.

Jasper解析语义内容目前采用比较简单的方式, 从STT处理后得到用户的命令文本, 判断文本是否包含已注册的模块关键字中, 如包含则由关键字对应模块进行处理.

其中, 部分模块使用semantic

参考:
<AlexaPi>
<mycroft>
<Python的webrtc库实现语音端点检测>

Jasper语音助理的更多相关文章

  1. Linux音频编程

    1. 背景 在<Jasper语音助理介绍>中, 介绍了Linux音频系统, 本文主要介绍了Linux下音频编程相关内容. 音频编程主要包括播放(Playback)和录制(Record), ...

  2. 三星语音AI助理背后的华人身影—73岁科技人三度创业成功(孙子兵法:道、天、地、将、法)

    我绝对不当老二,也不当老大,我要当霸主!”说这句话的是富迪科技董事长黄炎松.他还把“独霸”当作公司愿景宣言,大剌剌的放在美国总公司进门最显眼的墙上.   集微网消息,据台湾商业周刊报道,黄炎松,是台湾 ...

  3. 转:Siri之父:语音交互或将主导未来十年发展

    http://zhinengjiaohu.juhangye.com/201709/weixin_5664458.html Siri之父Adam Cheyer认为,语音交互很可能是未来十年内计算技术的一 ...

  4. TOP100summit 2017:亚马逊Echo音箱能够语音识人,华人工程师揭秘设计原理

      本文编辑:Cynthia 2017年,人工智能的消费产品落地聚焦在了智能音箱上,谷歌.亚马逊纷纷推出智能音箱产品,国内的阿里巴巴推出天猫精灵,小米推出小米AI音箱.智能音箱通过语音可以发出指令,未 ...

  5. 教Alexa看懂手语,不说话也能控制语音助手

    Alexa.Siri.小度……各种语音助手令人眼花缭乱,但这些设备多是针对能力健全的用户,忽略了听.说能力存在障碍的人群.本文作者敏锐地发现了这一 bug,并训练亚马逊语音助手 Alex 学会识别美式 ...

  6. Mac新手必看教程—让你离熟练操作mac只差十分钟

    本文收录于:风云社区(提供各类mac软件资源下载) 本文源自:什么值得买 无论轻薄办公本.还是赶超台式性能的游戏本,关注#笔记本攻略#栏目,解决笔记本电脑从选购到使用的各种问题. 引子 大部分用户接触 ...

  7. AI与RPA

    RPA(机器人流程自动化)是一类自动化软件工具,它可以通过用户界面使用和理解企业已有的应用,将基于规则的常规操作自动化,例如读取邮件和系统,计算,生成文件和报告,检查文件等.因此,RPA的应用范围非常 ...

  8. 你需要了解 Windows Phone 8.1 的11件事

    微软已经发布了其新一代手机操作系统 Windows Phone 8.1,拥有一些新的特性.从本质上来说,微软此次的大修让 Windows Phone 更接近 Android 和 iOS,对于使用体验的 ...

  9. WP8.1 VS iOS VS Android全方面大比拼

    众所周知,苹果的OS和谷歌的Android系统都有着相对成熟的设计和较好的用户体验,而随着WP8.1的发布,微软WP系统在交互方面也有了很多改进和提升,而今天小编便为大家全面对比一下这三大系统.   ...

随机推荐

  1. 一丶人生苦短,我用python【第一篇】

    1 解释器 解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行.解释器不会一次把整个程序转译出来,只像一位"中间人",每次 ...

  2. centos7用yum搭建LAMP环境

    用yum快速搭建LAMP平台 实验环境: [root@nmserver- html]# cat /etc/redhat-release CentOS release (AltArch) [root@n ...

  3. Eureka搭建

    Eureka搭建 一.Eureka基本框架搭建 pom.xml文件配置:主要是引入Eureka所依赖的jar包 <?xml version="1.0" encoding=&q ...

  4. erc20代币合约

    看这篇文章需要对以太坊,智能合约,代币等概念有基本的了解. 什么是ERC20 可以把ERC20简单理解成以太坊上的一个代币协议,所有基于以太坊开发的代币合约都遵守这个协议.遵守这些协议的代币我们可以认 ...

  5. SQLServer数据库慢查询追踪

    不喜欢跟研发扯淡,说点击功能慢,是网络.服务器.运维的锅, 甩手给你打开慢查询,时间超过5s的全部抓取,已经很仁慈了,才抓取大于5s的SQL语句..... SQL SERVER 2014数据库慢查询追 ...

  6. STL 六大部件

    stl具有上面6大部件 容器是存储数据的,原理主要是模板,容器只是负责存储数据,并不关心内存的存储情况,所以出现了分配器,分配器主要是负责为容器分配内存的,对于数据的操作被封装为一个个函数,也就是算法 ...

  7. Java学习全攻略-->阅读官方文档

    一直感觉Java的官方文档有些杂乱,最近特意整理了一下,仅供参考. 入口 Oracle官方文档入口:http://docs.oracle.com/.下级页面这边只整理了JavaEE跟JavaSE的文档 ...

  8. 洛谷 [SDOI2015]约数个数和 解题报告

    [SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...

  9. rematch的基本用法

    rematch是对redux的二次封装,简化了redux是使用,极大的提高了开发体验.rematch仅仅是对redux的封装,没有依赖redux-saga,也没有关联react,因此其可以用在其他的视 ...

  10. 解析json方式之net.sf.json

    前面转载了json解析的技术:fastjson,今天说下另外一种技术. 下载地址 本次使用版本:http://sourceforge.net/projects/json-lib/files/json- ...