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


CSDN@如何基于本地语音识别,搭建一款智能聊天机器人?
本文插图
作者 | 李秋键 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 近几年来 , 人工智能发展火热 , 尤其是语音识别方面的落实项目更是普遍存在于我们的生活中 , 像手机中常见的语音助手、Siri 和电脑中的小娜等等 , 但是他们却很难做到私人订制的效果 , 即达到个人个性化的需求 , 所以今天我们的目的在于搭建一个个性化适用于自己的语音聊天机器人 。 这里我们这个项目的优点在于:

  1. 本地语音识别 , 可以彻底摆脱互联网 , 在自己电脑上实现语音识别;
  2. 搭建适用于自己的语音聊天库 , 当然这里我们将简单的借助互联网强大的知识库作为聊天库;
  3. 循环调用 , 实现监控效果 。
下面简单介绍下语音识别应用近几年来的发展趋势:
  1. 具有越来越充实的专业知识库 。 就是指针对特定用例的专家级系统 , 比如帮助航空公司客服回答客户的问题 , 或者帮助医生做笔记 。
  2. 趋于更强的个性化功能 。 使用类似的方法 , 可能会使得语音助手会用你喜欢的方式与你交谈 。 比如提供像匹配谈话对象的口音和音量这样的简单的功能 。 或者 , 智能助手也可以改变其表达方式 。
  3. 由被动变主动 。 优秀的助手会在你提出要求的时候给你做事 , 而卓越的助手则不需要你提出要求 , 而是能够前瞻性地主动帮你解决问题 。
  4. 反馈机制 。 我们的机器如何知道自己做对还是做错?就是通过反馈机制进行纠正错误 。
  5. 新的交互方式 。 语音助手应该不仅仅局限于语音互动的想法 , 而是可以使用大量不同的信号来得出结论 , 比如心理学、读心术等等 。
下面我们就正式进入我们今天的项目搭建!
实验前的准备
首先我们使用的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_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 = http://news.hoteastday.com/a/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: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 save_buffer =printreturn True else:return Truer = GenAudior.read_audior.save_wav("test.wav")


推荐阅读