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

发布于: 雪球转发:0回复:0喜欢:1

网页链接

作者 | 叶圣

出品 | AI科技大本营(ID:rgznai100)

导语:本篇文章将基于百度API实现对电脑的语音智能控制,不需要任何硬件上的支持,仅仅依靠一台电脑即可以实现。作者经过测试,效果不错,同时可以依据作者所给出的代码进行修改加入自己需要的功能,而所有代码的实现都是依靠python编程实现。试想,通过语音实现对电脑的控制,而电脑又可以对其他硬件进行控制,那么即可以实现语音对其他硬件的控制,即达到智能家具的效果。

在人工智能的发展越来越火热的今天,其中智能应用也在伴随着我们的生活,其中最为典型的便是语音识别,近几年来,语音识别技术取得显著进步,同时语音识别技术也慢慢渗入了工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。语音识别最基本的思想包括:信号处理、模式识别、概率论和信息论、发声机理和听觉机理、人工智能等等,而这里我将对语音识别进行生活中的很好应用,让机器能听懂人类讲话,并做出操作控制。

首先我们选用的编程语言是python,要用到的模块有jieba模块,用以实现对中文语句进行分段;os,win32con和sys模块用来实现对电脑的控制;time模块用来延时;wave 和pyaudio模块用来录音;pygame模块用来播放声音;pynput模块用来控制键盘;random模块随机选取;其中导入模块这一段代码为:

# encoding=utf-8import jieba from aip import AipSpeechimport osimport sysimport timeimport win32conimport waveimport numpy as np from pyaudio import PyAudio,paInt16import 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_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