写点什么

用 Amazon Lex 和 Raspberry Pi 构建语音套件

  • 2019-10-11
  • 本文字数:6547 字

    阅读完需:约 21 分钟

用 Amazon Lex 和 Raspberry Pi 构建语音套件

在本文中,我们将介绍如何使用广泛可用的组件将 Amazon Lex 嵌入自定义硬件中。我们将演示如何构建基于语音的简单 AI 套件并将其连接至 Amazon Lex。我们将使用 Raspberry Pi 和一些现成的组件,总成本不足 60 USD。在本文结束时,您将拥有一个与 Amazon Lex PostContent API 集成的联网硬件设备。我们还会演示两个示例自动程序 – 一个语音控制的机器人和一个语音控制的节拍器。


组件概览


您需要使用以下组件来构建 Amazon Lex 硬件套件。


  • Raspberry PI 3 B 型号,~35 USD,来自 Amazon。

  • Kinobo – USB 2.0 迷你麦克风,~5 USD,来自 Amazon。

  • Adafruit I2S 3W Stereo Speaker Bonnet 和扬声器,~12 USD,来自 adafruit。

  • (可选) Qunqi 透明盒架,~20 USD,来自 Amazon。

  • 物理构造

  • Raspberry Pi



图 1. Raspberry PI B 型号


我们对此项目使用 Raspberry PI 3 B 型号产品。图 1 显示了安装在透明盒架中的 Raspberry Pi。透明盒架可以整齐地将 Pi、数字音频控制器 (DAC) 和扬声器装在一起,但它并不是必需的。


麦克风


安装 Kinobo USB 麦克风很简单,只需选取一个 USB 端口并插入即可!



图 2. Raspberry PI 3 B 型号与 Kinobo USB 麦克风



图 3. 安装完毕的 Raspberry PI 3 B 型号与 Kinobo USB 麦克风


数字音频控制器


Adafruit I2S 3W Stereo Speaker Bonnet 是一个 3W 立体声放大器和数字音频控制器 (DAC),无需额外电源即可直接从 Raspberry Pi 运行扬声器。该 Bonnet 作为装配完整的印刷电路板 (PCB) 提供,带有 2×20 排针和 2 个接线盒。



图 4. Adafruit I2S 3W Stereo Speaker Bonnet,2×20 排针和接线盒


在将排针连接到 PCB 时需要一些光束钎焊,这样便可将排针插入 Raspberry Pi 中。


图 5 和 6 显示已焊接排针和接线盒的 DAC。如果您不是专业焊工 (我们不是),请尝试去当地的创客工厂寻求帮助。



图 5. Adafruit I2S 3W Stereo Speaker Bonnet (DAC),底部



图 6. Adafruit I2S 3W Stereo Speaker Bonnet (DAC),顶部



图 7. 安装在 Raspberry Pi 上的 DAC


扬声器


安装 DAC 后,可将随附的扬声器组合连接到中间的无焊接端子上。我们采取额外步骤将扬声器安装到透明盒架上面,方法是在架子上钻孔 (使用 Dremel) 来与每个扬声器中的安装孔匹配。



图 8. 连接至 JST 插孔且已安装的扬声器


成品



图 9. 完整的 Amazon Lex AI 套件


安装和测试


OS


我们将 6 月 21 日的 Raspbian Jessie 镜像 2017-06-21-raspbian-jessie.img 用于此项目。最新版本应该也起作用。


1.从 RasberryPi.org 下载 Raspbian Jessie 的最新版本。


2.按照安装说明下载镜像并将其写入 SD 卡。


无外设设置 (可选)


我们想使用无外设 (不需要键盘、鼠标或显示器) 设置进行 Raspberry Pi 开发。要做的工作有点多,但一旦完成,便可从任意联网位置访问 Raspberry Pi。下面的可选说明介绍如何设置对 Raspberry Pi 的 SSH 和 VPC 访问,以启用无外设访问。如果要跳过这些说明,则可将键盘、鼠标和显示器直接连接到 Raspberry Pi 并跳至下一部分。


SSH (可选)


要启用 SSH,请将一个名为 ssh (没有任何扩展名) 的文件放在 SD 卡的引导分区中。可以在此处找到详细说明。


VNC (可选)


VNC 是一个图形化桌面共享系统,该系统允许您从一台计算机或移动设备 (正在运行 VNC 查看器) 中远程控制另一台计算机 (正在运行 VNC 服务器) 的桌面界面。使用 Raspberry Pi 时,有些任务 (如连接到 WIFI 网络) 使用 GUI 执行起来要容易得多。


Raspberry Pi VNC 文档提供了用于为 Raspberry Pi 设置 VNC 服务器和查看器的不错指南。


网络配置


仅需连接以太网电缆便足以使 Raspberry Pi 联网。我们发现,使用 GUI (直接或通过 VPC) 将 Raspberry Pi 连接至无线网络是最快速的方法。联网后,可在 raspberry.local 中或通过 IP 地址使用您的 Raspberry Pi。


注意:我们发现 Fing 是确定 Raspberry Pi 的 IP 地址的最简单方法。


数字音频控制器


Adafruit 提供了有关安装和测试 I2S DAC 的详细说明。我们发现,Adafruit 说明中提到的安装说明效果更好。


开始使用 DAC 的最简单方法是使用一行式安装程序:


  1. 通过 ssh 进入您的 Raspberry Pi 并创建一个名为 lex 的新目录。


mkdir lex && cd lex/ 
复制代码


运行 phatdac 安装脚本。


curl https://get.pimoroni.com/phatdac | bash
复制代码


系统提示您继续时,请输入 y。


如果系统提示您重新启动,请输入 y。如果需要重新启动,请在重新连接至 Raspberry Pi 之后重新运行脚本。


如果系统询问是否要立即测试系统,请输入 y。


您应该听到每个立体声通道播放的音频样本。可在此处找到有关使用 DAC 的详细说明,包括手动安装选项:


Adafruit DAC 设置


设置 pHAT DAC


麦克风


使用麦克风不需要进行任何安装。所有必需的 ALSA 库应该都已经安装完毕。可使用以下命令测试麦克风是否起作用。


sudo arecord -D plughw:1 -r 32000 -f S16_LE temp.wav 
复制代码


说完后按 ctrl-C 终止脚本。您可以使用以下命令测试已录制的音频。


sudo aplay ./temp.wav
复制代码


如果您在播放 temp.wav 时能听到录制的音频,则表明您已准备就绪,可以开始捕获音频并将其流式传输至 Amazon Lex。


Amazon Lex 集成


安装 Node.js


使用 apt-get 安装 Node 和 npm。在 Raspberry Pi 的终端窗口中键入以下命令:


sudo apt-get install -y nodejs npm
复制代码


通过检查已安装版本验证 Node 和 npm 是否已正确安装。


npm -v && node -v
复制代码


注意:如果与节点包之间存在命名冲突,则它将安装为 nodejs。可以手动创建指向 /usr/bin/node 的符号链接或在以下命令中使用 nodejs 代替 node。


安装开发工具包


安装适用于 Node.js 的 AWS 开发工具包的首选方式是使用 npm。在终端窗口中键入以下内容:


npm install aws-sdk
复制代码


自动程序对话启动程序脚本


现在麦克风、扬声器均能正常使用,并且我们还安装了 Amazon Lex JavaScript 开发工具包,下面便可调用 PostContent 操作并与自动程序开始对话了。


Node 脚本可侦听音频输入、检测声音并开始将音频流式传输至 Amazon Lex。检测到静默后,该脚本将终止流并播放响应。随后该脚本将持续侦听和响应,直至对话状态变为“Fulfilled”。


// lex.js var AWS = require('aws-sdk'),   fs = require('fs'),   ts = require('tailstream'),   exec = require('child_process').exec;
var FULFILLED = 'Fulfilled', RESPONSE_FILE = 'response.mpeg', REMOVE_REQUEST_FILE = 'rm request.wav', SOX_COMMAND = 'sox -d -t wavpcm -c 1 -b 16 -r 16000 -e signed-integer --endian little - silence 1 0 1% 5 0.3t 2% > request.wav', streaming = false, inputStream, lexruntime = new AWS.LexRuntime({ region: 'us-east-1', credentials: new AWS.Credentials( <KeyId>, <SecretKeyId>, null) });
var setupStream = function() { streaming = true; inputStream = ts.createReadStream('./request.wav'); var params = { botAlias: '$LATEST', botName: <BotName>, userId: 'lexHeadTesting', contentType: 'audio/l16; rate=16000; channels=1', inputStream: inputStream };
lexruntime.postContent(params, function(err, data) { if (err) { console.log(err, err.stack); process.exit(1); } else { fs.writeFile(RESPONSE_FILE, data.audioStream, function(err) { if (err) { return console.log(err); process.exit(1); } }); var playback = exec('sudo mpg321 ' + RESPONSE_FILE); playback.on('close', function(code) { exec('rm ' + RESPONSE_FILE); if (data.dialogState !== FULFILLED) { streaming = false; record(); } }); } }); }
var record = function() { var recording = exec(SOX_COMMAND); recording.stderr.on('data', function(data) { console.log(data); if (!streaming) { setupStream(); } }); recording.on('close', function(code) { inputStream.done(); exec(REMOVE_REQUEST_FILE); }); }record();
复制代码


我们需要先安装一些依赖项,然后才能运行脚本。该脚本依赖于用于录制和播放的 fs、tailstream 和 child_process npm 软件包以及 SoX 和 mpg321 命令。


npm 软件包


从您的 ~/lex 目录中,使用以下命令安装 npm 依赖项。


npm install fs tailstream child_process SoX
复制代码


SoX 可读取和写入大多数常见格式的音频文件并对其应用效果。它可以组合多个输入源、合成音频,在许多系统中还可以充当通用音频播放器或多音轨音频记录器。我们使用 SoX 来启动和停止音频捕获以及修剪 (移除开头和结尾的静默) 已捕获的音频。使用以下命令安装 SoX。


sudo apt-get install sox 
复制代码


我们使用下面的 SoX 命令以 Amazon Lex 可识别的格式记录音频,更重要的是,我们使用此命令来执行静默检测和修剪。请注意,此命令仅供您参考。您并不一定必须执行此命令。


sox -d -t wavpcm -c 1 -b 16 -r 16000 -e signed-integer –endian little – silence 1 0 1% 4 0.3t 2%
复制代码


该命令的第一部分指示,我们要将 PCM 编码 (有符号的 16 位 little endian) 的音频 (采样频率为 16000 Hz) 记录为 WAV 文件。


sox -d -t wavpcm -c 1 -b 16 -r 16000 -e signed-integer --endian little
复制代码


第二部分指定我们希望在开始记录之前和之后处理静默检测的方式。


silence 1 0 1% 4 0.3t 2% 
复制代码


第一个三元组值用于删除开头的静默 (如果有),直至声音中的 0 秒数高于 1%。% 是一个阈值,用于指示应视为静默的样本值。第二个三元组用于在至少有 4 个 .3 秒的静默实例低于 2% 时停止记录。


mpg321


一旦从 Amazon Lex 获取成功响应,我们便可以使用 mpg321 播放音频。mpg321 是一个非常常用的命令行 mp3 播放器。使用以下命令安装 mpg321。


sudo apt-get install mpg321


测试


现在,我们已经安装完依赖项,可以测试我们的 Amazon Lex 对话脚本了。从 ~/lex 目录中,用上面的脚本内容创建一个名为 lex.js 的文件。


注意:确保使用您的凭证和自动程序名称更新示例脚本。


完成后,保存脚本并用以下命令执行脚本。


node lex.js


如果一切正常,您应在终端中看到 SoX 命令的输出。对着自动程序大声说话,并倾听 Amazon Lex 的回应。脚本将继续,直至对话状态为 Fulfilled。如果您没有自动程序,请参阅有关构建自动程序的 Amazon Lex 文档。为了获得灵感,请查看“那么我能用它做些什么呢?”部分,其中包含不同自动程序集成的视频。


热词


此时,我们已经具有正常的音频捕获和播放功能,还有一个 Node 脚本可用于编排基于 Amazon Lex PostContent 操作的对话。为完成此项目,我们将添加热词检测,这样便可通过大声说出热词来调用套件。对于此项目,我们将第三方库 (Snowboy) 用于热词检测。Snowboy 是一个可自定义的“热词”检测引擎,它在本地运行并且开箱便与 Raspberry Pi 兼容。


安装


按照下面的说明或更详细的 Snowboy 快速启动说明操作。


在 ~/lex 目录中,创建一个名为“snowboy”的新目录并将 Snowboy 二进制文件下载到该目录中。


mkdir snowboy && cd ~/lex/snowboy && wget https://s3-us-west-2.amazonaws.com/snowboy/snowboy-releases/rpi-arm-raspbian-8.0-1.2.0.tar.bz2 
复制代码


解压缩 Snowboy tar-ball。


tar -xvf ./rpi-arm-raspbian-8.0-1.2.0.tar.bz2 cd rpi-arm-raspbian-8.0-1.2.0 
复制代码


安装 Snowboy 依赖项。


sudo apt-get install python-pyaudio python3-pyaudio sox 
复制代码


安装 pyaudio。


pip install pyaudio 
复制代码


您还需要安装 libatlas-base-dev。(此步骤与 Snowboy 说明不同。)


sudo apt-get install libatlas-base-dev 
复制代码


测试


安装完成后,您将能够运行 Snowboy 测试脚本。确定您位于以下目录中:~/lex/snowboy/rpi-arm-raspbian-8.0-1.2.0。


python demo.py resources/snowboy.umdl 
复制代码


当脚本报告它正在倾听时,大声说出热词“Snowboy”。您应该会听到一声提示音,指示已识别该热词。


创建自定义热词 (可选)


在下一部分中,我们将修改 Snowboy 演示脚本,以运行 lex.js 自动程序调用程序。如果要使用自定义热词,可从 Snowboy 控制面板中生成并下载个人热词模型。在此演示中,我们为“botbot”和“metronome”创建了一个“热词”模型。


整合在一起


现在我们已经准备就绪,可以设置热词循环了。下面的代码对 Snowboy 二进制文件中包含的 demo.py 文件略微做了改动。开始后,该代码将侦听热词,听到热词后停止热词检测器,执行 Lex 自动程序调用程序脚本,并在自动程序调用程序脚本完成后自行重新启动。


import snowboydecoder import os import sys import signal import subprocess   interrupted = False   def signal_handler(signal, frame):     global interrupted     interrupted = True     def interrupt_callback():     global interrupted     return interrupted   def on_hot_word():   detector.terminate()   pro = subprocess.Popen(["node", "../../lex.js"]).wait()   print("Restarting...")   os.execv(sys.executable, ['python'] + sys.argv)   if len(sys.argv) == 1:     print("Error: need to specify model name")     print("Usage: python demo.py your.model")     sys.exit(-1)   model = sys.argv[1]   # capture SIGINT signal, e.g., Ctrl+C signal.signal(signal.SIGINT, signal_handler)   detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5)print('Listening... Press Ctrl+C to exit')   # main loop detector.start(detected_callback=on_hot_word,                interrupt_check=interrupt_callback,                sleep_time=0.03)   detector.terminate()
复制代码


在 ~/lex/snowboy/rpi-arm-raspbian-8.0-1.2.0 目录中创建一个名为 lex-wake.py 的新文件,将以上代码复制到该文件中并保存文件。您可以使用以下命令对其进行测试。


python lex-wake.py Botbot.pmdl


注意:我们的个人热词模型为“Botbot.pmdl”,您可以使用自己的热词模型 (如果已创建) 或包含的 Snowboy 模型“resources/snowboy.umdl”。


您应该可以看到热词循环启动。大声说出热词。在您的自动程序已被调用并且对话状态变为“Fulfilled”之后,热词循环将再次开始侦听。


祝贺您,您已创建了自己的 AI 套件!请查看下面的“那么我能用它做些什么呢?”部分,获取新套件激动人心的用法示例,其中包括语音控制的机器人、会说话的门铃、节拍器等。


启动时运行 (可选)


要在系统启动时开始侦听热词,请编辑 /etc/rc.local 文件以包含您的热词脚本。


python ~/lex/snowboy/rpi-arm-raspbian-8.0-1.2.0/lex-wake.py Botbot.pmdl & 
复制代码


参考


Raspberry Pi I2S 音频入门指南


用于 Raspberry Pi 的 Adafruit 扬声器 Bonnet


Raspberry Pi Phat DAC 安装


RasspberryPi VNC 文档


无外设的 Raspberry Pi 设置


Raspberry Pi 镜像安装说明


Raspbian 镜像下载


SoX


mpg321


Snowboy


完整参考代码


https://github.com/awslabs/aws-lex-ai-kit


那么我能用它做些什么呢?


您可以将其连接至任何 Amazon Lex 自动程序 – 我们很乐愿听到您用它构建了什么!我们将该语音套件连接至两个自动程序,创建了一个语音控制的 GoPiGo 机器人和一个语音控制的节拍器。


语音控制的机器人


在此示例中,有两个主要意图:行驶和转向,其中包含用于方向、距离和单位的槽位。将通过一个 Lambda 函数来处理执行情况,该函数可更新 IoT 设备影子,然后机器人将会移动。


语音控制的节拍器


在此示例中,我们将 Intent 参数直接返回给语音套件。该 Intent 只有一个槽位 Tempo。返回速度值后,我们将用请求的速度启动节拍器,并使用板载扬声器播放一声嘀嗒声。


我们很乐意听到您对本文的想法,回答您的任何问题以及/或了解您创建的语音套件音频项目。您可在下面的评论区向我们提供反馈。


补充阅读


了解如何在浏览器中捕获语音输入并将其发送给 Amazon Lex!


作者介绍:


Andrew Lafranchise 是 AWS 深度学习团队的高级软件开发工程师。他使用不同技术来改进 Lex 开发人员体验。在业余时间,他除了陪伴家人,还开发了一个能与他 3 岁大的双胞胎女儿互动的 Lex 自动程序。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/build-a-voice-kit-with-amazon-lex-and-a-raspberry-pi/


2019-10-11 14:183795
用户头像

发布了 1848 篇内容, 共 113.6 次阅读, 收获喜欢 78 次。

关注

评论

发布
暂无评论
发现更多内容

高科技行业为何倚重多物理场仿真技术

思茂信息

仿真 建模 结构 高科技 辐射

VMware Fusion Pro 13 for Mac v13.6.1中文激活秘钥 VM虚拟机最新版

Rose

测试要不要转岗项目经理?

老张

项目管理 质量保障 项目经理 软件测试工程师

SmartSVN for Mac(SVN客户端)v14.4激活版

理理

TiDB 监控组件之 Blackbox_exporter 运行原理

TiDB 社区干货传送门

特斯拉无人驾驶出租车Robotaxi:埃隆·马斯克的预言即将成真

陆通

Acrobat Pro DC 2024 for mac (领先的PDF编辑转换器)v24.001.20604中文激活版

理理

万界星空科技MES系统的智能排产功能

万界星空科技

制造业 mes 万界星空科技mes MES、 生产排班排产

高效使用AI,一文掌握提示词的编写原则

禅道项目管理

人工智能 AI 项目管理软件 AIGC ChatGPT

百度公共IM系统的Andriod端IM SDK组件架构设计与技术实现

JackJiang

即时通讯;IM;网络编程

低代码平台如何简化员工培训并提升技术能力?

天津汇柏科技有限公司

低代码平台

比特币社区心心念念的BTCFi进展如何了?—比特币与DeFi的未来

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 NFT开发 公链开发

RapidComposerV5 for mac v5.3.3 高效歌曲创作辅助工具

Rose

Android & iOS 使用 ARMS 用户体验监控(RUM)的最佳实践

阿里巴巴云原生

阿里云 云原生 Arms

第五届国际科创节探寻新质生产力 候选品牌:行云管家

行云管家

国际科创节

上云后如何有效控制云成本?有啥好方法?

行云管家

云计算 云服务 企业上云 云成本

如何用豆包MarsCode 打造简洁高效的星级评分组件?

豆包MarsCode

人工智能 AI 代码 组件 模版

TiDB 新版本 Meetup 活动中 TiDBer 最关心的 8 个问题

TiDB 社区干货传送门

如何在建设 DataOps 体系中选择合适的工具或平台?

Aloudata

元数据 DataOps 数据管理 数据血缘

PDF解析+RAG,手把手教你在Coze搭建个人知识库!

合合技术团队

PDF rag 个人知识库

MIAOYUN五周年 | 未来才是最好的礼物!

MIAOYUN

云原生 MIAOYUN 周年庆典 五周年庆

IDA Professional for mac(反汇编逆向神器)激活安装教程

理理

整理 TiDB 的一些使用限制

TiDB 社区干货传送门

实践案例

TON生态小游戏开发:推广、经济模型与UI设计的建设指南

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

MestReNova for Mac v14.2.3中文激活版 专业核磁数据处理

理理

中文最新版3D建模软件:Rhinoceros 8 (犀牛8) v8.12

Rose

FontBook for Mac(字体管理软件)v5.3.2激活版

理理

借力豆包大模型,中手游为《仙剑世界》打造丰富的AI NPC生态

新消费日报

【TiDB 企业实践-麦谷科技】超详细的升级最佳实践-从 TiDB v5.3.0 到 v7.5.2

TiDB 社区干货传送门

版本升级

软件测试学习笔记丨文本处理常用Linux命令-vi、grep、awk、sed

测试人

软件测试

用 Amazon Lex 和 Raspberry Pi 构建语音套件_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章