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

作者 | 叶圣
出品 | 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 折票开售,数量有限,扫码购买,先到先得!

640?wx_fmt=png


推荐阅读

640?wx_fmt=png

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

  • 8
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我了解您的要求,下面是回答: Apriori算法是一种常用的关联规则挖掘算法,用于发现数据集中的频繁项集。其原理是通过迭代的方式不断削减候选项集的大小,找到所有满足最小支持度要求的频繁项集。 Apriori算法的步骤如下: 1. 初始化:找到所有单项集的支持度,并筛选出支持度大于等于最小支持度的频繁项集; 2. 迭代:根据频繁项集生成候选项集,并筛选出支持度大于等于最小支持度的频繁项集; 3. 终止条件:重复步骤2,直到无法再生成新的频繁项集。 下面是用Python实现Apriori算法的代码: ```python def loadDataSet(): return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] def createC1(dataSet): C1 = [] for transaction in dataSet: for item in transaction: if not [item] in C1: C1.append([item]) C1.sort() return list(map(frozenset, C1)) def scanD(D, Ck, minSupport): ssCnt = {} for tid in D: for can in Ck: if can.issubset(tid): if not can in ssCnt: ssCnt[can] = 1 else: ssCnt[can] += 1 numItems = float(len(D)) retList = [] supportData = {} for key in ssCnt: support = ssCnt[key] / numItems if support >= minSupport: retList.insert(0, key) supportData[key] = support return retList, supportData def aprioriGen(Lk, k): retList = [] lenLk = len(Lk) for i in range(lenLk): for j in range(i+1, lenLk): L1 = list(Lk[i])[:k-2]; L2 = list(Lk[j])[:k-2] L1.sort(); L2.sort() if L1 == L2: retList.append(Lk[i] | Lk[j]) return retList def apriori(dataSet, minSupport = 0.5): C1 = createC1(dataSet) D = list(map(set, dataSet)) L1, supportData = scanD(D, C1, minSupport) L = [L1] k = 2 while (len(L[k-2]) > 0): Ck = aprioriGen(L[k-2], k) Lk, supK = scanD(D, Ck, minSupport) supportData.update(supK) L.append(Lk) k += 1 return L, supportData ``` 以上就是用Python实现Apriori算法的代码,您可以根据自己的需求进行调整和修改。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值