首页 » 科学 » 若何基于本地语音识别搭建一款智能聊天机械人?_年夜众_语音

若何基于本地语音识别搭建一款智能聊天机械人?_年夜众_语音

落叶飘零 2024-08-30 01:03:28 0

扫一扫用手机浏览

文章目录 [+]

责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

若何基于本地语音识别搭建一款智能聊天机械人?_年夜众_语音 科学

近几年来,人工智能发展火热,尤其是语音识别方面的落实项目更是普遍存在于我们的生活中,像手机中常见的语音助手、Siri 和电脑中的小娜等等,但是他们却很难做到私人订制的效果,即达到个人个性化的需求,以是本日我们的目的在于搭建一个个性化适用于自己的语音谈天机器人。
这里我们这个项目的优点在于:

本地语音识别,可以彻底摆脱互联网,在自己电脑上实现语音识别;

搭建适用于自己的语音谈天库,当然这里我们将大略的借助互联网强大的知识库作为谈天库;

循环调用,实现监控效果。

下面大略先容下语音识别运用近几年来的发展趋势:

具有越来越充足的专业知识库。
便是指针对特定用例的专家级系统,比如帮助航空公司客服回答客户的问题,或者帮助年夜夫做条记。

趋于更强的个性化功能。
利用类似的方法,可能会使得语音助手会用你喜好的办法与你交谈。
比如供应像匹配发言工具的口音和音量这样的大略的功能。
或者,智能助手也可以改变其表达办法。

由被动变主动。
精良的助手会在你提出哀求的时候给你干事,而卓越的助手则不须要你提出哀求,而是能够前瞻性地主动帮你办理问题。

反馈机制。
我们的机器如何知道自己做对比样做错?便是通过反馈机制进行纠正缺点。

新的交互办法。
语音助手该当不仅仅局限于语音互动的想法,而是可以利用大量不同的旗子暗记来得出结论,比如生理学、读心术等等。

下面我们就正式进入我们本日的项目搭建!

实验前的准备

首先我们利用的python版本是3.6.5。
所测试的系统有windows10,windows7,Linux系统以及苹果系统。
从这点也可以看出python多平台和多拓展性、易于迁移的优点。

所利用的的Python库有request库,其目的是用来加载网络谈天库;keras库用来加载本地语音识别模型等等。

语音谈天的建立

1、录音麦克风

首先我们将要借助pyaudio库进行录音个中定义参数有取样频率,声音阈值等等。
详细可见下面详细代码:

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_lengthnum_samples个取样self.time_count = 8 # 录音韶光,单位sself.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.closedef read_audio(self):pa = PyAudiostream = pa.open(format=paInt16, channels=1, rate=self.sampling_rate, input=True,frames_per_buffer=self.num_samples)save_count = 0save_buffer =time_count = self.time_countwhile 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_lengthelse:save_count -= 1if save_count < 0:save_count = 0if save_count > 0:save_buffer.append(string_audio_data)else:if len(save_buffer) > 0:self.voice_string = save_buffersave_buffer =print(\"大众Recode?a?piece?of??voice?successfully!\"大众)return Trueif time_count == 0:if len(save_buffer) > 0:self.voice_string = save_buffersave_buffer =print(\公众Recode?a?piece?of??voice?successfully!\公众)return Trueelse:return Truer = GenAudior.read_audior.save_wav(\公众test.wav\"大众)

2、本地语音识别

目的在于让电脑知道你说了什么。
紧张是借助于Keras库进行读取模型,glob读取录音文件,利用pickle解码,详细如下:

from keras.models import load_modelfrom keras import backend as Kimport numpy as npimport librosafrom python_speech_features import mfccimport pickleimport globwavs = glob.glob('data/.wav')with open('dictionary.pkl', 'rb') as fr:[char2id, id2char, mfcc_mean, mfcc_std] = pickle.load(fr)mfcc_dim = 13model = load_model('asr.h5')index = np.random.randint(len(wavs))print(wavs[index])audio, sr = librosa.load(wavs[index])energy = librosa.feature.rmse(audio)frames = np.nonzero(energy >= np.max(energy) / 5)indices = librosa.core.frames_to_samples(frames)[1]audio = audio[indices[0]:indices[-1]] if indices.size else audio[0:0]X_data = mfcc(audio, sr, numcep=mfcc_dim, nfft=551)X_data = (X_data - mfcc_mean) / (mfcc_std + 1e-14)print(X_data.shape)with open(wavs[index] + '.trn', 'r', encoding='utf8') as fr:label = fr.readlines[0]print(label)pred = model.predict(np.expand_dims(X_data, axis=0))pred_ids = K.eval(K.ctc_decode(pred, [X_data.shape[0]], greedy=False, beam_width=10, top_paths=1)[0][0])pred_ids = pred_ids.flatten.tolistprint(''.join([id2char[i] for i in pred_ids]))

3、加载谈天

在识别语音的根本上,让电脑在网上搜索如何合理的回答你的话。
这里输入的结果是语音识别后的笔墨,输出的结果同样为笔墨,末了再通过笔墨转为语音达到语音回答效果!

num=3if process == '':print(\公众not\公众)else:header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}url = requests.get(\公众https://www.baidu.com/s?wd=\"大众 + process, headers=header)# 为了防止中文乱码,编码利用原网页编码url.raise_for_statusurl.encoding = url.apparent_encoding# print(url.text)object = etree.HTML(url.text)# print(object)# 正则匹配搜索出来答案的所有网址# 获取页面head =object.xpath('//div[@id=\"大众page\"大众]//a/@href')txt0=''for i in range(num):header0 = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}url0 = requests.get(\"大众https://www.baidu.com\公众 + head[i], headers=header0)# 为了防止中文乱码,编码利用原网页编码url0.raise_for_statusurl0.encoding = url0.apparent_encoding# print(url.text)object0 = etree.HTML(url.text)para0 = object.xpath('/html/body//div[@class=\"大众c-abstract\公众]/text')para10 = object.xpath('/html/body//div[@class=\"大众c-abstract\"大众]/em/text')txt0 = ''for i in range(len(para0)):try:txt0 = txt0 + para0[i] + para10[i]except:pass#print(head)# 详细内容para = object.xpath('/html/body//div[@class=\公众c-abstract\公众]/text')para1 = object.xpath('/html/body//div[@class=\"大众c-abstract\公众]/em/text')txt = ''for i in range(len(para)):try:txt = txt + para[i] + para1[i]+txt0except:passreturn txttxtk=baiketxtd=baiduresult=txtk+txtdprint(result)

4、笔墨转语音进行回答

#笔墨转录音APP_ID = '15118279'API_KEY = 'xUx0Gm2AG2YMtA3FnGfwoKdP'SECRET_KEY = 'hdxyMvABhUD4xnacGtDdeHbEOUGmdjNx'client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)def text_to_audio(text):file_name ='luyin' # 担保文件名不重复result = client.synthesis(text, 'zh', 1, {'spd':5,'vol': 5,'pit':5,'per':0})# 识别精确返回语音二进制 缺点则返回dict 参照下面缺点码if not isinstance(result, dict):with open('%s.mp3'%(file_name), 'wb') as f:f.write(result)return '%s.mp3'%(file_name)

终极我们的测试效果便是:语音和笔墨同步显示!
我问了句“什么是语文?”电脑语音并加上笔墨显示回答了“语文是措辞笔墨、措辞文章、措辞文学、的简称,其本义是措辞笔墨。
措辞包括和。
口头措辞较随意,直接易懂,而书面措辞讲究准确和语法;文学包括中外古今文学等。

作者简介:李秋键,CSDN 博客专家,CSDN达人课作者。
硕士在读于中国矿业大学,开拓有taptap安卓武侠游戏一部,vip视频解析,文意转换工具,写作机器人等项目,揭橥论文多少,多次高数竞赛获奖等等。

标签:

相关文章