最近开源了硕士论文中语音控制LED灯、直流电机以及语音陪护实验的源码,需要硕士论文原文的同学可以发邮件到我的邮箱(18261593885@163.com)或者直接在微信语音识别解码群私聊我,其主要实验内容如下:

1)  实验的具体源码链接:https://download.csdn.net/download/Xwei1226/12740275

2)  语音控制实验(语音控制LED灯以及语音控制直流电机)

3)语音陪护实验

以下内容为实验的具体方法与理论

研究接近两年的语音识别,最近一个月开始准备将自己的研究应用于实践中。从今年5月初开始研究语音控制,到今天才出一个简单的demo,最后演示结果如下:

(https://v.youku.com/v_show/id_XNDIyNDY2MjcxMg==.html?spm=a2h3j.8428770.3416059.1)

整体语音控制架构如下所示:

如果是调用科大讯飞、百度等企业的语音识别API则可以直接忽略服务端的一些操作,按照企业的要求以及通信协议进行文件传输,本文主要涉及客户端、硬件端以及控制端进行详细的阐述,服务器端如果有问题可以直接留言给作者。

一、客户端

客户端即为你所需要接收服务器响应的设备,本文使用的客户端为树莓派3b+(made in japan),通过WIFI与服务器端进行通信,硬件在第二节讲解,下面贴出一张笔者觉得不错的树莓派GPIO口的示意图:

树莓派基本的操作以及设备连接可以参考如下连接:http://shumeipai.nxez.com/

本文使用的GPIO口为11与6号口。

二、硬件端

本文涉及的硬件包括:

2.1 树莓派3b+;

2.2 麦克风(免驱动);

2.3 树莓派杜邦线若干;

2.4 LED灯;

2.5 电源;

2.6 串口连接;

2.7 树莓派扩展板等硬件设备。

三、控制端

前面的准备工作完成,则需要进行核心部分进行梳理。首先本文采用的是HTTP协议下的TCP/IP通信协议,为了防止服务端被攻击,笔者设计服务端为动态IP以防上述问题。

3.1 初始方案

首先对自己的树莓派进行声卡的检查以及声卡设备的录音、播放等问题进行排查,此为前提条件,由于之前对于树莓派不熟悉,或由于设备问题,作者在此卡了三天,下面整理一下初始方案:

本文使用的语音识别系统是基于DCNN-CTC构建的系统,如果对端到端感兴趣的朋友不妨关注一下个人博客以及个人github主页,内部有多种语音识别系统构建方法,笔者使用的是音节为建模单元构建的识别系统,具体可以参靠如下连接:(https://github.com/zw76859420)

由于训练语料均采用16khz、16bit的单通道WAV格式的语音文件。我曾在kaldi平台下做过在线语音识别,故而准备参考kaldi的方案移植到树莓派平台下构建在线语音识别系统,初始方案如下:

录音:pyaudio

  播放:omxplayer

但是作者不得不觉得很坑爹,树莓派官方是不允许录制16khz 的语料的,但是中文下写了一大堆关于在树莓派平台下使用pyaudio录制16khz 的语音,笔者信以为真,奈何三天,调了无数次的bug,一次次的安装、卸载pyaudio,均有错误产生,最后笔者不得不越墙而过,终于找到了一个替代方案,为了防止国人在此方向上进一步受挫,故而准备开源,调整方案如下:

录音:arecord

播放:omxplayer

故而最后的问题均解决,录音与播放均解决,所以不得不说,车到山前必有路!

四、代码

4.1 首先测试本地的声卡的录音与播放设备的可用性

4.1.1 使用arecord录制16khz、16bit语音,测试是否在pi目录下有语料生成

arecord -D "plughw:1,0" -f S16_LE -d 2 -r 16000 /home/pi/test.wav

4.1.2 测试播放语音功能

omxplayer -o local /home/pi/test.wav

若上述没有问题,则说明声卡可以正常使用,若有问题,一般是可以在pi目录下新建 .asoundrc 的隐藏文件,对其进行配置:

配置的结果如下:

pcm.!default {type asymcapture.pcm "mic"playback.pcm "speaker"
}
pcm.mic {type plugslave {pcm "hw:1,0"}
}

一般是这里的原因,如果有问题,直接在博主文章下留言,切忌使用pyaudio进行录音。

4.1.3 服务器端测试

#!/usr/bin/env python3
# -*- coding: utf-8 -*-'''
@author1: zhangwei Jiangnan University
@author2: nielei  Xidian University
asrserver测试专用客户端'''import requests
import wave
import numpy as np# requests.DEFAULT_RETRIES = 5
# s = requests.session()def read_wav_data(filename):'''获取文件数据以及采样频率;输入为文件位置,输出为wav文件数学表示和采样频率;'''wav = wave.open(filename, 'rb')num_frames = wav.getnframes()num_channels = wav.getnchannels()framerate = wav.getframerate()str_data = wav.readframes(num_frames)wav.close()wave_data = np.fromstring(str_data, dtype=np.short)wave_data.shape = -1, num_channelswave_data = wave_data.Treturn wave_data, framerateurl = 'http://10.25.158.143:20000/'wavsignal, fs = read_wav_data('/home/pi/test_01.wav')
# print(wavsignal)
datas={'token': token, 'fs': fs, 'wavs': wavsignal}
r = requests.post(url, datas)
r.encoding = 'utf-8'
print(r.text)

上述代码是在客户端访问服务器进行通信的代码,对服务器与客户端之间的通信进行处理,在此感谢西安电子科大的某位大牛师弟对此代码进行优化。

4.1.4 语音控制代码

对树莓派的11号引脚进行电压控制,其主要代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-'''
@author1: zhangwei Jiangnan University
@author2: nielei  Xidian University
asrserver测试专用客户端'''import requests
import wave
import numpy as np# requests.DEFAULT_RETRIES = 5
# s = requests.session()def read_wav_data(filename):'''获取文件数据以及采样频率;输入为文件位置,输出为wav文件数学表示和采样频率;'''wav = wave.open(filename, 'rb')num_frames = wav.getnframes()num_channels = wav.getnchannels()framerate = wav.getframerate()str_data = wav.readframes(num_frames)wav.close()wave_data = np.fromstring(str_data, dtype=np.short)wave_data.shape = -1, num_channelswave_data = wave_data.Treturn wave_data, framerateurl = 'http://10.25.158.143:20000/'wavsignal, fs = read_wav_data('/home/pi/test_01.wav')
# print(wavsignal)
datas={'token': token, 'fs': fs, 'wavs': wavsignal}
r = requests.post(url, datas)
r.encoding = 'utf-8'
print(r.text)if __name__ == '__main__':# audio_record(out_file=out_file, rec_time=rec_time)# print(get_api_result())GPIO.setmode(GPIO.BOARD)GPIO.setup(11, GPIO.OUT)while(True):print("=================JNU ASR DEMO==================")print("Please tell me the command(limits within 3 seconds)")# audio_record(out_file='/home/pi/test_python/wav/01.wav')os.system('arecord -D "plughw:1,0" -f S16_LE -d 2 -r 16000 /home/pi/test.wav')asr_results = get_api_result()print(asr_results)# if len(asr_results) != 0:#     print(asr_results)#     print("=================Start Control====================")re_asr_results = "".join(asr_results)if len(re_asr_results) != 0:if 'k' in re_asr_results:print("==================开灯======================")GPIO.output(11, GPIO.HIGH)passif 'gu' in re_asr_results:print("==================关灯======================")GPIO.output(11, GPIO.LOW)passif 'c' in re_asr_results:GPIO.output(11, GPIO.LOW)breakelse:pass

至此,基于DCNN-CTC语音识别系统以及基于树莓派的在线语音识别系统构建完毕,如果对本文的代码有问题,可以直接在下面留言。

基于树莓派语音控制—LED开关控制相关推荐

  1. STM32F40实现 按键密码锁、按键控制LED 、串口选择菜单 、串口控制LED开关 、串口控制蜂鸣器开关及响度 、串口控制蜂鸣器播放音乐 、按键控制LED的亮度

    本人第一次发文,很多都不懂,尤其害怕版权问题,如果有人质疑我有盗权行为,请联系我,因为项目也遇到很多问题,然后就解决嘛,可印象中只有播放音乐代码有借鉴,所以如果有质疑盗了权的,请务必联系我.板子是使用 ...

  2. Proteus仿真STM32F103R6微控制器的GPIO(按键控制LED开关)

    Proteus仿真STM32F103R6微控制器的GPIO,检查按键,控制LED灯的反转.. 输入:按键检测:输出:高低电平,控制LED. 一.原理图: 二.源码: #include "st ...

  3. 基于Arduino,使用三个开关控制电机的正转,反转,和停转

    通过三个开关控制直流电机的正反转以及停止. 当按下开关一,电机正转:按下开关二,电机反转:按下开关三,电机停止转动. 准备材料:Arduino nano开发板*1,L293D直插式电机驱动芯片*1,1 ...

  4. 单片机IO口应用-独立按键控制LED以及控制LED灯闪烁

    目录 P1=0xdf: sbit LED=P1^5; 输出控制 P1并行口第5位引脚IO置为1 P1并行口第5位引脚IO置为0 输入检测 延时函数 控制LED灯闪烁 方法一 方法二 方法三 P1=0x ...

  5. 基于android蓝牙zigbee的led路灯监控系统设计,基于ZigBee的智能小区LED路灯控制系统设计...

    引言 随着我国城市化建设的深入,大中型城市中智能化管理的高档小区.花园别墅.综合设施等( 以下统称"智能小区") 需要有与其配套的高效环保的智能化照明控制系统,要求在对照明设备信息 ...

  6. 基于51单片机的led灯控制小实验

    该小实验是为了更好的理解51单片机的使用,其完成的要求如下: 1.第一个键控制两个灯的翻转; 2.第二个键控制一个灯的翻转; 3.第三个键接在51单片机的外部中断口,每检测到一次,翻转三下; 4.第四 ...

  7. 基于51单片机的按键开关控制多种花样霓虹灯proteus仿真

    仿真电路图1: 具有6种模式 1.从中间分别向两边散开流动: 2.从两边分别向中间聚拢流动: 3.两个灯向从左边向右边流动: 4.两个灯向从右边向左边流动: 5.一个灯向从左边向右边流动: 6.一个灯 ...

  8. 麦克风控制LED,控制喇叭

    1.麦克风 相当于一个电容,有声音输入时候,在电容两端会产生交变电流. 2.电容 之前的电解电容可以用作蓄能,这里用的是独石电容,可以起到隔直通交的作用. 3.三极管的放大状态 注:之前讲的多级放大, ...

  9. 基于树莓派和LD3320模块的语音识别控制

    目录 树莓派模块 1-wiringPi库的安装 2-串口相关API函数说明 3-代码的编写 LD3320模块 1-代码分析 树莓派模块 本项目所用到的树莓派型号是3B,烧写的固件是官方的固件.固件版本 ...

  10. MT7621方案 LED 灯控制 (基于OpenWrt平台)

    注:出处不明,最开始是在这里看到的,图竟然没有...没有...相关资料也几乎木有...datasheet里也没有寄存器配置说明......MT7621还真是坑爹啊! 目前市面上大部分路由器方案是基于M ...

最新文章

  1. Rhel6服务器时间任务浅谈
  2. Win7启动Oracle出错
  3. 关于ASP.NET未能映射路径问题
  4. 一个简单的DWR入门例子
  5. vue 3D旋转木马轮播图
  6. ios assetlibrary
  7. POI Excel 合并数据相同的行
  8. SqlBulkCopy导入大数据
  9. C/C++网络编程工作笔记0003---客户服务端程序说明
  10. graphpad画生存曲线怎么样去掉删失点_GraphPad作生存曲线数据点超出轴限制
  11. WCF作为SAO技术的核心:契约
  12. python怎么看自己安装的第三方包_安装第三方包查看python版本/第三方包版本
  13. 2022高教社杯数学建模思路 - 案例:Apriori-关联规则挖掘算法
  14. 将DLL注册成COM组件
  15. 锂电池的充电原理以及快充原理
  16. element ui表单必填_element-ui设置下拉选择切换必填和非必填
  17. MIT线性代数笔记二十八讲 相似矩阵和若尔当标准型
  18. 全国青少年软件编程等级考试scratch一级考试大纲+考点
  19. Java学习 --- HTML
  20. python安装报错:User installations are disabled via policy on the machine. 0x80070643

热门文章

  1. 2008年最新姓氏排名
  2. 使用redis缓存来实现最近的浏览记录
  3. Python任意输入若干数求和
  4. 特征工程之特征选择(5)----包装法
  5. 熹妃传服务器更新维护2019年8月28,熹妃传厨艺大赛高分攻略大全
  6. 为什么我要建立自己的公众号?
  7. 微信公众号创建与审核相关注意事项
  8. 游戏开发中的沟通成本
  9. c语言编八卦图形,关于C语言实现一个八卦图!(我代码写好了,求人改动一下)
  10. 忘记了mysql的root密码(分享:重置密码过程)