如何基于本地语音识别,搭建一款智能聊天机器人?

sw

作者|李秋键

责编|屠敏

出品|CSDN(ID:CSDNnews)

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

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

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

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

下面简单介绍下语音识别应用近几年来的发展趋势:

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

趋于更强的个性化功能。使用类似的方法,可能会使得语音助手会用你喜欢的方式与你交谈。比如提供像匹配谈话对象的口音和音量这样的简单的功能。或者,智能助手也可以改变其表达方式。

由被动变主动。优秀的助手会在你提出要求的时候给你做事,而卓越的助手则不需要你提出要求,而是能够前瞻性地主动帮你解决问题。

新的交互方式。语音助手应该不仅仅局限于语音互动的想法,而是可以使用大量不同的信号来得出结论,比如心理学、读心术等等。

下面我们就正式进入我们今天的项目搭建!


实验前的准备

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

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


语音聊天的建立

1、录音麦克风

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

classGenAudio(object):
def__init__(self):
_samples=2000取样频率
=1500count_num个取样之内出现COUNT_NUM个大于LEVEL的取样则记录声音
_length=8录音时间,单位s
_string=
defsave_wav(self,filename):
wf=(filename,'wb')
(1)
(2)
(_rate)
((_string).tostring)

defread_audio(self):
pa=PyAudio
stream=(format=paInt16,channels=1,rate=_rate,input=True,
frames_per_buffer=_samples)
save_count=0
save_buffer=
time_count=_count
whileTrue:
time_count-=1
将读入的数据转换为数组
audio_data=(string_audio_data,dtype=)
如果个数大于COUNT_NUM,则至少保存SAVE_LENGTH个块
iflarge_sample__num:
save_count=_length
else:
save_count-=1
ifsave_count0:
save_count=0
ifsave_count0:
save_(string_audio_data)
else:
iflen(save_buffer)0:
_string=save_buffer
save_buffer=
print("Recode?a?piece?of??voice?successfully!")
returnTrue
iftime_count==0:
iflen(save_buffer)0:
_string=save_buffer
save_buffer=
print("Recode?a?piece?of??voice?successfully!")
returnTrue
else:
returnTrue
r=GenAudio
_audio
_wav("")

2、本地语音识别

目的在于让电脑知道你说了什么。主要是借助于Keras库进行读取模型,glob读取录音文件,使用pickle解码,具体如下:

_model
fromkerasimportbackasK
importnumpyasnp
importlibrosa
frompython_speech_featuresimportmfcc
importpickle
importglob
wavs=('data/*.wav')
withopen('','rb')asfr:
[char2id,id2char,mfcc_mean,mfcc_std]=(fr)
mfcc_dim=13
model=load_model('')
index=(len(wavs))
print(wavs[index])
audio,sr=(wavs[index])
energy=(audio)
frames=(energy=(energy)/5)
indices=_to_samples(frames)[1]
audio=audio[indices[0]:indices[-1]][0:0]
X_data=mfcc(audio,sr,numcep=mfcc_dim,nfft=551)
X_data=(X_data-mfcc_mean)/(mfcc_std+1e-14)
print(X_)
withopen(wavs[index]+'.trn','r',encoding='utf8')asfr:
label=[0]
print(label)
pred=(_dims(X_data,axis=0))
pred_ids=(_decode(pred,[X_[0]],greedy=False,beam_width=10,top_paths=1)[0][0])
pred_ids=pred_
print(''.join([id2char[i]foriinpred_ids]))

3、加载聊天

在识别语音的基础上,让电脑在网上搜索如何合理的回复你的话。这里输入的结果是语音识别后的文字,输出的结果同样为文字,最后再通过文字转为语音达到语音回复效果!

num=3
ifprocess=='':
print("not")
else:
header={
'User-Agent':'Mozilla/5.0(;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36'}
url=(""+process,headers=header)
print()
object=()
正则匹配搜索出来答案的所有网址
为了防止中文乱码,编码使用原网页编码
_for_status
=_encoding
print(head)
文字转录音
APP_ID='15118279'
API_KEY='xUx0Gm2AG2YMtA3FnGfwoKdP'
SECRET_KEY='hdxyMvABhUD4xnacGtDdeHbEOUGmdjNx'
client=AipSpeech(APP_ID,API_KEY,SECRET_KEY)
deftext_to_audio(text):
file_name='luyin'识别正确返回语音二进制错误则返回dict参照下面错误码
ifnotisinstance(result,dict):
withopen('%'%(file_name),'wb')asf:
(result)
return'%'%(file_name)

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


文章版权声明:除非注明,否则均为纵投光影网原创文章,转载或复制请以超链接形式并注明出处。

上一个 晶合光电Micro-LED和DLP投影大灯亮相ALE 2025

下一个 75寸电视长宽多少厘米?75寸电视最佳观看距离?25年75寸电视推荐