专栏名称: AI科技大本营
迎来到AI科技大本营。这里汇集了优秀的AI学习者,技术大咖和产业领袖;提供接地气的实战课程。在这里和优秀的人一起成长。
目录
相关文章推荐
爱可可-爱生活  ·  【[228星]Flock:基于工作流的低代码 ... ·  2 天前  
新智元  ·  10美元成功复现DeepSeek顿悟时刻,3 ... ·  3 天前  
爱可可-爱生活  ·  晚安~ #晚安# -20250221223032 ·  3 天前  
爱可可-爱生活  ·  【Savanna:为卷积多混合模型(Stri ... ·  4 天前  
51好读  ›  专栏  ›  AI科技大本营

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

AI科技大本营  · 公众号  · AI  · 2019-10-16 16:46

正文


作者 | 叶圣
出品 | 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_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








请到「今天看啥」查看全文