python实现语音助手小思同学

Python019

python实现语音助手小思同学,第1张

技术基础参考: https://www.jb51.net/article/168328.htm

技术分析:1.优点:实现简单,利用各种API快速实现语音助手。2.缺点,由于图灵机器人需要付费和实名认证造成了一些麻烦,所以改进了一下这个图灵机器人语音助手编写了小思语音助手。

小思机器人: https://www.ownthink.com/docs/bot/

百度语音识别: http://ai.baidu.com/docs#/ASR-Online-Python-SDK/top](http://ai.baidu.com/docs#/ASR-Online-Python-SDK/top

有趣的话题,高级的思路等牛人来说。

我说一个笨思路,不断的录音片段,不断的比对波形。

已答就不要重复邀请了哇。另外你想要持续匹配必然是不断录音不断匹配,现实世界中并没有如同推送服务一样的功能,可以出现了什么声音再调用你的程序。你只能是看看如何设计优化这个匹配和录音的平衡,并且优化你的匹配速度:比方说你试试录音能否多进程(线程)?如果能双开,那么交替覆盖空白时间也是其中一种算法。

你思考一下苹果的语音助手(老版本)和安卓的语音助手,是不是都要先按一个按钮才能开始语音助手服务?说明只有持续监听才能解决问题,但是手机为了保证续航,又不能做持续监听。

后来,苹果想了个什么办法呢,他自己设计了一个芯片,其中有一个功能就是可以捕捉麦克风收听到“hey siri”就调用语音助手的功能,具体的技术细节我不太清楚,有可能是让麦克风只要收到超过多少分贝的声音就开始小范围匹配“hey siri”之类的吧

至于减噪,网上有不少关于用电脑软件调节波形文件来降噪的方法教程,虽然你不能直接用,但是提供了思路

计算声音的相似性,我个人认为可以通过计算波形的特征来完成,我个人才疏学浅,没有这方面的经验,如果是语音识别,推荐你用讯飞的api试试,讯飞在这一块技术还是蛮强的。

但是,像人类一样可以很精准的从人群中识别出熟人声音的功能,那个属于人工智能的范畴,目前研究水平还不够到可以应用的地步。

1.编程语言

WebServer应用示例:不到100行代码玩转Siri语音控制 | ESP32轻松学(Arduino版)

铁熊玩创客

原创

关注

5点赞·1352人阅读

ESP32轻松学系列文章目录:

ESP32 概述与 Arduino 软件准备

蓝牙翻页笔(PPT 控制器)

B 站粉丝计数器

Siri 语音识别控制 LED 灯

Siri 语音识别获取传感器数据

本期给大家带来的是:掌控板 Siri 语音识别智能终端。

不好意思,用这种标题党的方式把你吸引进来,不到 100 行代码的确有点夸张,因为实际上核心代码:

不到 50 行!

不到 50 行!

不到 50 行!

国际惯例,访问链接查看演示效果:

https://www.bilibili.com/video/av93961105/

项目概述

前一段时间,掌控板 2.0 正式上市了,但是呢第一批产品生产数量有限,所以很多朋友买不到最新版的板子。拿着手里的 1.0 版本,却只能眼巴巴看着别人用掌控板 2.0 玩语音识别了。

所以我们要坚决对这种行为说不!在这篇文章中,我就教大家让任何版本的掌控板(或其他基于 ESP32、ESP8266 芯片的开发板)实现语音识别,而且识别的效果更好!

在项目开始讲解之前,我们先来看一下完整思路。在这个项目中,我们将掌控板 ESP32 设置为一个 Web 服务器,当用户在网页上访问这个服务器 IP 地址的时候,就会跳出如下界面。

我们可以通过点击 Light On 或者 Light Off 按键,来控制掌控板上的 RGB LED 的亮灭,也可以访问这两个按键的对应 IP 地址,来控制 LED 灯的亮灭。这样就完成了基本的通过 Web 页面控制掌控板的功能。

在这基础之后,我们可以进一步通过设置一些语音助手,比如 Siri、天猫语音精灵等,通过语音命令访问这些 IP 地址,从而实现语音识别开关灯的功能。

库文件安装

这个项目需要用到 3 个 Arduino 库:Adafruit_NeoPixel、ESPAsyncWebServer、AsyncTCP。

Arduino 库安装的教程不是本篇的重点,这里不再赘述,只给出 3 个库的网址,大家可以自行百度查找 Arduino 怎么安装库。

Adafruit_NeoPixel:https://github.com/adafruit/Adafruit_NeoPixel

ESPAsyncWebServer:https://github.com/me-no-dev/ESPAsyncWebServer

AsyncTCP:https://github.com/me-no-dev/AsyncTCP

Arduino 代码

先把完整的程序放出来,再进行讲解。

在程序的开头,我们首先引入了需要用到的库函数:

#include "WiFi.h"

#include "ESPAsyncWebServer.h"

#include <Adafruit_NeoPixel.h>

登录后复制

然后设置网络的账号和密码:

const char *ssid = "wifi_name"

const char *password = "wifi_password"

登录后复制

接着定义了 NeoPixel 对象(RGB LED 灯)和 WebServer 对象:

Adafruit_NeoPixel pixels(3, 17, NEO_GRB + NEO_KHZ800)

AsyncWebServer server(80)

登录后复制

在初始化函数 setup() 中,我们首先对串口和 RGB 灯进行了初始化:

Serial.begin(9600)

pixels.begin()

登录后复制

然后将掌控板连接到网络,并把 IP 地址在串口中打印出来:

// Connect to Wi-Fi

WiFi.begin(ssid, password)

while (WiFi.status() != WL_CONNECTED)

{

delay(1000)

Serial.println("Connecting to WiFi..")

}

Serial.println("WiFi connected")

// Print ESP32 Local IP Address and Some Tips

Serial.print("Open your brower, and visit: http://")

Serial.println(WiFi.localIP())

Serial.println()

登录后复制

最后就是最重要的 Web 服务器设置。关于 Web 服务器设置的详细教程,可以查看官网:https://github.com/me-no-dev/ESPAsyncWebServer

这里只放出本文需要的代码。当访问根目录“/”时,显示一些提示语;当访问“/on”目录时,设置 LED 灯为亮,并在串口和网页端显示提示语;当访问“/off”目录时,设置 LED 灯为灭,并在串口和网页端显示提示语。

// Root / Webpage

server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {

request->send_P(200, "text/plain", "Turn On Light: IP/on\nTurn Off Light: IP/off")

})

// Webpage to turn on light

server.on("/on", HTTP_GET, [](AsyncWebServerRequest * request) {

pixels.setPixelColor(0, 0xFF0000)

pixels.setPixelColor(1, 0xFF0000)

pixels.setPixelColor(2, 0xFF0000)

pixels.show()

Serial.println("Light is on")

request->send_P(200, "text/plain", "Light is on")

})

// Webpage to turn off light

server.on("/off", HTTP_GET, [](AsyncWebServerRequest * request) {

pixels.clear()

Serial.println("Light is off")

request->send_P(200, "text/plain", "Light is off")

})

登录后复制

在 setup() 函数的最后,运行 Web 服务器:

server.begin()

登录后复制

至此,整个程序就编写完成了,在 loop() 函数中,不需要做任何事,当然你也可以运行其他你想要的代码。

程序上传

在 Arduino 中选择掌控板或者 ESP32 相关的芯片,然后将程序上传,打开串口监视器,我们可以看到串口监视器中提示我们访问相应的网址。(如果没看到相应信息,可以按一下掌控板后面的 RST 按键,重启程序)

打开电脑浏览器或者手机浏览器,访问相应的 IP 地址,这里是:192.168.10.202,我们可以看到网页上显示了相应的提示信息。访问地址 192.168.10.202/on 可以打开 LED 灯,访问地址 192.168.10.202/off 可以关闭 LED 灯。

尝试访问对应的地址,当访问 192.168.10.202/on 时,浏览器和串口监视器中,都输出了相应的提示信息,同时我们也可以看到掌控板上的 RGB 灯也亮了起来。

当访问 192.168.10.202/off 时,浏览器和串口监视器中,也都输出了相应的提示信息,同时掌控板上的 RGB 灯也熄灭了。

网页设计

这部分不是本文的重点,也不会影响最终语音控制的效果,所以如果您对网页设计不感兴趣,也可以略过,直接跳转到下一节。

在上文中,我们已经基本完成了通过网页来控制 LED 灯的相关功能,但是这个网页毕竟还是太简陋了。所以我们对网页稍微进行一些优化。

HTML 是用来设计网页的代码,它可以控制我们在浏览器中看到的网页的外观样式。由于本人对网页设计也不擅长,所以这里只放一个基础的外观改进代码。

上述代码最终形成的效果如下。我们可以直接点击 Light On 和 Light Off 两个按钮(或链接)来控制 LED 的亮灭,从而避免了手动输入网址的麻烦。

当然在这个项目中,不用设计 HTML 代码也是完全没有问题的,我们只是为了方便在网页上控制。

设计完网页,我们要怎么加到代码中去呢?其实也很简单。

我们在程序开头定义一个字符串变量,将网页的代码保存到这个变量中:

const char index_html[] PROGMEM = R"rawliteral(

<!DOCTYPE html>

<html>

<head>

<meta name="viewport" content="width=device-width, initial-scale=1" />

<style>

html {

text-align: center

}

</style>

</head>

<body>

<h2>mPython Light Switch</h2>

<a href="/on">Light On</a>

<p></p>

<a href="/off">Light Off</a>

</body>

</html>)rawliteral"

登录后复制

然后将几处 server.on() 代码中的 request->send_P() 部分都修改为如下代码即可:

request->send_P(200, "text/html", index_html)

登录后复制

这个时候,重新上传程序,再去访问相应的网页,你就可以看到网页编程上图所示的样子了。

放个预告

如果你对网页设计比较擅长的话,你也可以设计好看一些的页面,比如:

我们不仅可以在网页中控制 LED 灯的亮灭,也可以显示各种传感器的信息,这些内容以后再讲。

语音助手设置

前面说了那么多,终于来到语音识别设置部分了。

你是不是很好奇,代码中完全没有语音识别相关的部分,我们怎么做到语音识别呢?其实也很简单,既然可以通过网页访问相应的网址,我们是不是也可以让语音助手来访问相应的网址呢?

由于笔者手上没有其他语音助手或者智能音箱类产品,所以这里以 Siri 为例。

打开 iOS 系统自带的捷径 App(英文名称 Shortcuts),没有没有的话,也可以去 App Store 免费下载:

然后分别设置两个捷径,命名为开灯和关灯。两个捷径的设置都很简单,就是访问给定的 URL 地址。

由于 iPhone 中的捷径是支持 Siri 语音识别调用的,所以我们可以直接通过 Siri 来运行这两个捷径,从而达到语音开关灯的效果。

效果演示

唤醒你的 Siri 看看效果吧。不过这里需要注意的是,你的 iPhone 和掌控板,必须处于同一局域网中。

总结

在本章中,我们学习了:

WebServer 的基础用法,可以通过浏览器网页来控制 LED 灯的亮灭;

然后通过设计 HTML 网页代码,让交互界面更加友好方便;

最后通过 iOS 的捷径应用,实现了语音识别间接控制 LED 灯的功能

通过类似的方法,我们还能同时控制更多的 LED 灯、其他执行器,甚至通过语音识别来获得相应传感器的信息。当然你也可以将 Siri 语音识别的文字返回给掌控板,实现更多复杂好玩的创意。

代码下载

点击下方链接,查看完整代码下载地址:

https://mp.weixin.qq.com/s/iNKaNmAN3nTWsaPIg0lEXA

2.怎样将Siri语音控件添加到任何树莓派项目

39度创意研究所

2019-10-12

1869

分享海报

电子说

9375人已加入

+加入圈子

描述

步骤1:配置您的Gmail帐户

1) SiriControl需要Gmail帐户。出于安全原因,建议您创建一个新的Gmail帐户,因为您将必须在python脚本中输入用户名和密码。没关系,因为您不会将其用于个人日常使用-仅用于说出命令。

2)然后,需要打开对安全性较低的应用程序的访问权限,可以在此处完成。这是因为Google将python脚本和邮件服务器之间的连接确定为安全性较低。

3)由于该脚本使用IMAP协议来获取新的Notes,因此需要在以下位置启用IMAP: Gmail设置。

步骤2:准备IOS设备

1)现在,在“设置”和“添加您新创建的Gmail帐户:

设置》 Notes》帐户》添加帐户

2)打开该帐户的Notes。

3)确保用于创建Notes的默认帐户使用Siri是您的新Gmail帐户。

就是这样!现在,只需告诉Siri创建一个便笺,如下所示:

“便笺很棒”

新便笺应出现在您的Gmail帐户的“便笺”标签下。如果没有,请再次执行上述步骤。

步骤3:设置SiriControl

1)首先,克隆或下载

2),然后打开siricontrol.py并添加新Gmail帐户的用户名和密码。

3)现在,运行脚本并对Siri说:

“注意生命的意义”

答案应该打印出来,因为在“模块”文件夹中的“生命”模块中。设置现已完成。

步骤4:创建自己的模块

以上模块是默认模块,与SiriControl。可以在modules文件夹下找到。另外,还包含一个模板模块供参考。

moduleName –这是模块的名称,可以是您想要的任何名称。

commandWords –此数组

execute(command) –将在commandWords数组中的所有单词都说完后调用此函数。 “ command”参数是用户对Siri所说的命令。

请记住,您创建的所有模块都必须放在modules文件夹下,否则找不到。

第5步:尽情享受吧!

就是这样!现在,您可以通过创建自己的模块来控制任何内容,并为任何项目添加出色的语音控制。借助Siri的强大功能,一切皆有可能!

它打开了许多选项,例如IoT和家庭自动化,只要您具有Internet连接,就可以从世界任何地方命令Siri。尽管这是一种单向连接,但是您可以编程将电子邮件发送回给您,等等-无限的可能性!