作者 | 叶圣
出品 | AI科技大本营(ID:rgznai100)
 
导语:本篇文章将基于百度API实现对电脑的语音智能控制,不需要任何硬件上的支持,仅仅依靠一台电脑即可以实现。作者经过测试,效果不错,同时可以依据作者所给出的代码进行修改加入自己需要的功能,而所有代码的实现都是依靠python编程实现。试想,通过语音实现对电脑的控制,而电脑又可以对其他硬件进行控制,那么即可以实现语音对其他硬件的控制,即达到智能家具的效果。
在人工智能的发展越来越火热的今天,其中智能应用也在伴随着我们的生活,其中最为典型的便是语音识别,近几年来,语音识别技术取得显著进步,同时语音识别技术也慢慢渗入了工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。语音识别最基本的思想包括:信号处理、模式识别、概率论和信息论、发声机理和听觉机理、人工智能等等,而这里我将对语音识别进行生活中的很好应用,让机器能听懂人类讲话,并做出操作控制。
首先我们选用的编程语言是python,要用到的模块有jieba模块,用以实现对中文语句进行分段;os,win32con和sys模块用来实现对电脑的控制;time模块用来延时;wave 和pyaudio模块用来录音;pygame模块用来播放声音;pynput模块用来控制键盘;random模块随机选取;其中导入模块这一段代码为:
# encoding=utf-8
import jieba from aip
import AipSpeech
import os
import sys
import time
import win32con
import wave
import numpy as np from pyaudio
import PyAudio,paInt16
import pygame from pynput.keyboard
import Key, Controller from random
import choice

然后在百度api申请账号可以得到密码和用户名,申请语音识别项目,至于为什么不用电脑自带的微软语音识别,是考虑到其识别效果的不准确。其中这一段代码为:
#开始录音标识
APP_ID = '15118279'#百度分配的APP_ID注册时可以看到,这里是我的
API_KEY ='xUx0Gm2AG2YMtA3FnGfwoKdP'#百度分配的API_KEY注册时可以看到,这里是我的
SECRET_KEY = 'hdxyMvABhUD4xnacGtDdeHbEOUGmdjNx'#百度分配的SECRET_KEY注册时可以看到,这里是我的
然后用代码client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)实现对百度语音识别的调用;result = client.synthesis('语音控制开始', 'zh', 1, {'vol': 5,})用以标志语音控制的开始语句,同时接上下面的判断语句判断模块调用是否成功:
# 识别正确返回语音二进制错误则返回dict 参照下面错误码
if not isinstance(result,dict): with open('audio.mp3', 'wb') as f:  f.write(result)#将“语音控制开始”这段文字语音翻译成音频文件audio.mp3

接着依靠pygame模块对audio.mp3进行播放,即可以听到电脑说了句“语音控制开始”这句话,即标志着你可以进行说话以达到控制的效果。代码如下:
pygame.mixer.init()
track = pygame.mixer.music.load('audio.mp3')
pygame.mixer.music.play()
time.sleep(2)
pygame.mixer.music.stop()
print("开始")

紧接着下面的是录音,将你的声音录制下来才能对录制下来的音频文件进行识别,这里主要依靠wave模块进行录音,代码如下:
#############################
class GenAudio(object): def __init__(self): self.num_samples = 2000  # pyaudio内置缓冲大小   self.sampling_rate = 8000  # 取样频率  self.level = 1500  # 声音保存的阈值   self.count_num = 20  # count_num个取样之内出现COUNT_NUM个大于LEVEL的取样则记录声音   self.save_length = 8  # 声音记录的最小长度:save_length?*?num_samples?个取样 self.time_count = 8  # 录音时间,单位s self.voice_string = [] def save_wav(self, filename):   wf = wave.open(filename, 'wb')   wf.setnchannels(1)  wf.setsampwidth(2)  wf.setframerate(self.sampling_rate) wf.writeframes(np.array(self.voice_string).tostring())  wf.close()  def read_audio(self):   pa = PyAudio() stream = pa.open(format=paInt16,channels=1, rate=self.sampling_rate, input=True,   frames_per_buffer=self.num_samples)    save_count = 0 save_buffer = []   time_count = self.time_count   while True: time_count -= 1    # ?读入num_samples个取样 string_audio_data =stream.read(self.num_samples)   # ?将读入的数据转换为数组  audio_data =np.fromstring(string_audio_data, dtype=np.short)  # 计算大于?level?的取样的个数 large_sample_count =np.sum(audio_data > self.level) print(np.max(audio_data)), "large_sample_count=>",large_sample_count  # ?如果个数大于COUNT_NUM,则至少保存SAVE_LENGTH个块    if large_sample_count >self.count_num:   save_count = self.save_length  else:   save_count -= 1    if save_count < 0:   save_count = 0 if save_count > 0:   save_buffer.append(string_audio_data)   else:   if len(save_buffer) > 0: self.voice_string =save_buffer save_buffer = []   print("Recode?a?piece?of??voice?successfully!")   return True if time_count == 0:   if len(save_buffer) > 0: self.voice_string =save_buffer save_buffer = []   print("Recode?a?piece?of??voice?successfully!")   return True else:   return True

接着用
r = GenAudio()
r.read_audio()

r.save_wav("test.wav")这一段语句用以保存录制下来的声音为test.wav的音频文件。再紧接着用ffmpeg实现对录音文件的上传,以达到语音识别的目的,代码如下:
#百度语音识别
# 读取文件
def get_file_content(filePath): cmd_str = "ffmpeg -y  -i %s -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s.pcm"%(filePath,filePath)   os.system(cmd_str)  # 调用系统命令ffmpeg,传入音频文件名即可    with open(filePath + ".pcm",'rb') as fp:   return fp.read()
然后用# 识别本地文件
a =client.asr(get_file_content('test.wav'), 'pcm', 16000, {    'dev_pid': 1536,
})
if a.get('result'):   a=a.get('result')[0]
print(a)即可实现对录音文件的识别,此时会输出识别的结果,例如a=“我想问下徐州的天气”。再接着依靠jieba分词对你说的话分段
seg_list = jieba.cut(a)
s=("".join(seg_list))
print(s)
a="["+s+"]"
此时就会将你说的话一个字一个字的分开,并保存为数组a。
再定义几个数组为
song=["歌","歌曲","音乐","听"]
movie=["播放","电视","看","电影"]
brower=["搜索","浏览"]

用以判断你说的话中有没有在以上数组中,如果你说的话有关键字在song这个数组中,就播放音乐,即为下面代码要实现的功能。
如果你说的话中有“酷狗”这两个字的话,就打开酷狗,具体代码如下:
if "酷狗" in a:   os.startfile("D:\program files(x86)\kugou\KuGou.exe")

这里D:\program files (x86)\kugou\KuGou.exe为我的电脑酷狗的安装路径,具体路径可以对其快捷方式右键打开所在文件位置找到。
如果你说的话中有“优酷”这两个字的话,就打开优酷,具体代码如下:
if "优酷" in a:  os.startfile(r"E:\YouKu\YoukuClient\proxy\YoukuDesktop.exe")

这里E:\YouKu\YoukuClient\proxy\YoukuDesktop.exe e为我的电脑优酷的安装路径,具体路径可以对其快捷方式右键打开所在文件位置找到。
如果你说的话中有“关机”这两个字的话,就关机,具体代码如下:
if "关机" in a:  os.system("shutdown -p")
如果你说的话中有“wifi”这两个字的话,就连接wifi,具体代码如下:
if "wifi" in a:   os.startfile(r'F:\代码\python\连接WiFi\jgh.exe')

这里jgh.exe为我编的一个自动连WiFi的程序,我自己可以直接调用。
如果你说的话中有"搜索","浏览"这几个字的话,就打开浏览器并搜索对应的内容,具体代码如下:
for i in brower:  if i in a:  os.startfile(r"D:\program files(x86)\360se6\Application\360se.exe")   time.sleep(20)  keyboard = Controller()    keyboard.type(s)    time.sleep(2)   keyboard.press(Key.enter)

如果你说的话中有"歌","歌曲","音乐","听"这几个字的话,就打开随机播放你电脑里下载的音乐,具体代码如下:
for i in song:  if i in a:  Newdir = []    path = r'C:\Users\asus\Music'    filelist = os.listdir(path)  # 该文件夹下所有的文件(包括文件夹) for files in filelist:  # 遍历所有文件    Olddir = os.path.join(path,files)  # 原来的文件路径   if os.path.isdir(Olddir):  # 如果是文件夹则跳过  continue    filename =os.path.splitext(files)[0]  # 文件名    filetype = os.path.splitext(files)[1]  # 文件扩展名 new = path + "\\" + files  if filetype == ".mp3":  Newdir.append(new)  os.startfile(choice(Newdir))

其中C:\Users\asus\Music为我下载音乐的路径,具体路径根据自己的电脑而定。
至此,语音控制功能基本实现,其中包括的功能有,语音播放音乐,语音打开浏览器并搜索你所的话,语音打开优酷,语音打开酷狗,语音实现自动关机,并且进过测试,其中语音识别效果甚好,即使你的声音很沧桑,很小也可以识别的很准确,所以说这一项应用的实现是真正有价值的,并且其中如果要加入其他的功能的话,可以依据我的思维进行填补实现,比如语音锁屏,语音换壁纸等等。
总结一下程序的总体思维为:让电脑说“语音控制开始”,用来判断模块是否完整,同时也是标志着你可以进行对电脑控制了;然后对周围环境录音,对录音文件语音识别成文字,如果你说的话有一些定义的关键词的话,就执行对应的操作。例如“我想听首歌”这句话有“歌”这个关键字,就会执行播放歌曲的功能,至此智能控制功能完美实现。
作者简介:
叶圣,中国矿业大学,擅长Python,vbs,bat,vc++,H5等等,自研安卓武侠游戏,桌面智能宠物,vip视频解析等等
(*本文为 AI科技大本营投稿,载请微信联系 1092722531

精彩推荐

2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。

即日起,限量 5 折票开售,数量有限,扫码购买,先到先得!

推荐阅读

  • @程序员:Python 3.8正式发布,重要新功能都在这里

  • AutoML很火,过度吹捧的结果?

  • AI大佬“互怼”:Bengio和Gary Marcus隔空对谈深度学习发展现状

  • Python脚本BUG引发学界震动,影响有多大?

  • 太鸡冻了!我用Python偷偷查到暗恋女生的名字

  • 苹果 5G 芯片“难产”

  • 如果把线程当作一个人来对待,秒懂

  • C 语言这么厉害,它自身是用什么语言写的?

  • 从4个维度深度剖析闪电网络现状,在CKB上实现闪电网络的理由 | 博文精选

你点的每个“在看”,我都认真当成了AI

实战:手把手教你实现用语音智能控制电脑 | 附完整代码相关推荐

  1. 手把手教你入门深度强化学习(附链接代码)

    来源:机器之心 本文约2600字,建议阅读10分钟. GitHub 开源了一份深度强化学习的教程,总结了从 DQN 到彩虹模型的理论和代码实现. 深度强化学习在机器学习领域的热度一直很高.最近,Git ...

  2. 实战:掌握PyTorch图片分类的简明教程 | 附完整代码

    作者 | 小宋是呢 转载自CSDN博客 1.引文 深度学习的比赛中,图片分类是很常见的比赛,同时也是很难取得特别高名次的比赛,因为图片分类已经被大家研究的很透彻,一些开源的网络很容易取得高分.如果大家 ...

  3. 内网渗透-实战|手把手教你如何进行内网渗透

    实战|手把手教你如何进行内网渗透 x00 Preface 内网渗透主要是基于前期外围打点getshell的webserver,通过收集webserver上的信息,然后对其他内网主机进行口令上的攻击,当 ...

  4. 简单有趣的 NLP 教程:手把手教你用 PyTorch 辨别自然语言(附代码)

     简单有趣的 NLP 教程:手把手教你用 PyTorch 辨别自然语言(附代码) 雷锋网(公众号:雷锋网)按:本文作者甄冉冉,原载于作者个人博客,雷锋网已获授权. 最近在学pyTorch的实际应用 ...

  5. 手把手教你开发photoshop面板插件(附demo和工具)

    手把手教你开发photoshop面板插件(附demo和工具) 一.前言 二.插件演示 三.目录文件介绍 3.1 插件安装 3.2 开启ps开发模式 3.3 插件文件介绍 3.4 manifest 文件 ...

  6. 实战|手把手教你如何使用抓包神器MitmProxy

    大家好,我是阿辰,今天教大家如何使用MitmProxy抓包工具. 玩爬虫的小伙伴都知道,抓包工具除了MitmProxy外,还有Fiddler.Charles以及浏览器netwrok等 既然都有这么多抓 ...

  7. AST实战|手把手教你还原ob混淆:ob混淆代码特征

    ob混淆过的代码有那些特征? 特征一: 大数组 + 移位自执行函数 + 解密字符串函数. 下面的代码是一个之前我在官网上混淆的一个例子: ‍ 可以看到,大数组为变量 _0x33fc,移位自执行函数体比 ...

  8. 实战案例,手把手教你构建电商用户画像 | 附代码

    导读:本文以真实案例,手把手教你搭建电商系统的用户画像. 先来看该电商用户画像用到的标签. 数据内容包括user_id(用户身份).item_id(商品).IDbehavior_type(用户行为类型 ...

  9. 最详细的爬虫实战 | 手把手教你用Python爬虫(附详细源码)

    什么是爬虫? 实践来源于理论,做爬虫前肯定要先了解相关的规则和原理,要知道互联网可不是法外之地,你一顿爬虫骚操作搞不好哪天就- 首先,咱先看下爬虫的定义:网络爬虫(又称为网页蜘蛛,网络机器人,在FOA ...

最新文章

  1. Unity UI和引用的管理中心
  2. sql表中只有子节点的递归_动态规划与静态规划、递归、分治、回溯
  3. linux内核关闭tcp校验,linux内核tcp调优规范与方案
  4. 王道408数据结构——第五章 树与二叉树
  5. 阿里P8架构师谈:多线程、架构、异步消息、Redis等性能优化策略
  6. “用于无监督图像生成解耦的正交雅可比正则化”论文解读
  7. 在 Kubernetes 集群中使用 MetalLB 作为 Load Balancer(上)
  8. 垃圾回收算法与实现系列-String在虚拟机中的实现
  9. 将ONNX对象检测模型转换为iOS Core ML(一)
  10. 力扣 二叉搜索树的最小绝对差
  11. 如何用C#代码判断一个类的类型
  12. 解决Iphonex 底部按钮fixed,bottom:0 底部留白问题
  13. ValueError: You are trying to load a weight file containing 0 layers into a model with 16 layers.
  14. Intellij IDEA 初学入门图文教程(六) —— IDEA 在 Performing VCS Refresh 卡死
  15. vivo Xplay的usb调试模式在哪里,打开vivo Xplayusb调试模式的教程
  16. 网站使用微信登录接口,所踩的坑...
  17. 2021-03-03 地理配准
  18. 神州数码交换机CS6200命令(一)
  19. SYN480R模块解码EV1527教程
  20. 2021-2027全球与中国植物基牛奶替代品市场现状及未来发展趋势

热门文章

  1. js init : function ()
  2. WinAPI: Arc - 绘制弧线
  3. [原]对Linux环境下任务调度一点认识
  4. js获取Html元素的实际宽度高度
  5. jquery mobie导致超链接不可用
  6. eclipes 安装 pytdev,svn,插件
  7. java继承中的一些该注意的问题
  8. MySQL两主多从,且故障转移配置
  9. mysql查询指定日期
  10. mysql的调用有哪三种方式_MySQL数据库之mysql命令行中执行sql的几种方式总结