赞
踩
本篇博客主要基于Linux 上实现智能语音问答系统,主要采用的方法包含:语音采集、语音转换文字、自动问答、语音播报等。本次仿真是自摸索的方案,如有问题可指正交流哈!
实现一个语音问答系统?设计中主要在系统中建立监听进程,语音转文字+文字问答+播报进程,后续准备另开进行进行画面显示。。。
考虑1:系统麦克风如何打开后长时间监听声音?
考虑2:如何获取到问答系统的唤醒关键词?例如小爱音响在开机状态下都能够被“小爱同学”关键语音唤醒,如何实现?
考虑3:唤醒后如何获取对话的wav 片段声音?
考虑4:片段声音如何转换程中文片段?
考虑5:转换后文字片段如何获取智能答复?
考虑6:如何将回复的文字进行语音播报?
1.snowboy 实现监听关键词
2.pyaudio wave 获取并笔记本麦克风声音并保存wav格式音频
3.回答问题模块:调用开源api 接口
4.ASR自动语音识别算法(算法训练加理论介绍)
5.multiprocessing 多进程实现监听、语音识别和问答的流程
snowboy 是开源的、轻量级语音唤醒引擎,通过它创建属于自己的类似“小爱同学”,“hei,sir” ,“自定意"的唤醒词;可支持linux,android、ios 上进行开发和调用,git 后内置相关lib库。
关于如何安装可自行百度或者参考:安装和生成自定义的关键词
例如我们喊话"小爱同学"后,音响获取我们对话语音
#!/usr/bin/env python # -*- coding: UTF-8 -*- ''' @Project :talkboot @File :main.py @Author : AICode1 @Date :2023/1/1 下午6:40 ''' from . import snowboydecoder from awaken import snowboydecoder import signal import os import pyaudio import wave import numpy as np #设定基础定义 chunk = 1024 # Record in chunks of 1024 samples sample_format = pyaudio.paInt16 # 16 bits per sample channels = 1 fs = 16000 # Record at 44100 samples per second seconds = 5 ts="xxx?" oupts="" def recording_voice(): # print("{} ",a_lists) filename = "output.wav" p = pyaudio.PyAudio() # Create an interface to PortAudio print('开始录音!') stream = p.open(format=sample_format, channels=channels, rate=fs, frames_per_buffer=chunk, input=True) frames = [] # Initialize array to store frames # Store data in chunks for 3 seconds for i in range(0, int(fs / chunk * seconds)): data = stream.read(chunk) frames.append(data) # Stop and close the stream stream.stop_stream() stream.close() # Terminate the PortAudio interface p.terminate() print('完成记录!') # Save the recorded data as a WAV file wf = wave.open(filename, 'wb') wf.setnchannels(channels) wf.setsampwidth(p.get_sample_size(sample_format)) wf.setframerate(fs) wf.writeframes(b''.join(frames)) wf.close() class Rundev(): def __init__(self,model,sensitivity=0.5,sleep_time=0.03): # 外置参数 self.model = model self.sensitivity = sensitivity self.sleep_time = sleep_time #内置参数 self.interrupted = False # self.detected_back=detected def interrupt_callback(self): return self.interrupted def signal_handler(self,signal, frame): self.interrupted = True def run(self): print('正在监听中.........','按 Ctrl+C 停止运行') # capture SIGINT signal, e.g., Ctrl+C signal.signal(signal.SIGINT, self.signal_handler) detector = snowboydecoder.HotwordDetector( self.model, sensitivity =self.sensitivity) # main loop detector.start(detected_callback=recording_voice, interrupt_check=self.interrupt_callback, sleep_time=self.sleep_time) print("awak end!") # 使终止 detector.terminate() dev = Rundev(os.getcwd()+"/awaken/ninhao.pmdl") def RunQa(): print(os.getcwd()+"/ninhao.pmdl") dev.run() def get_awak_out(): outs=AwOut return outs # 测试 if __name__ == "__main__": pass RunQa()
以上代码是监听并保存成wav 的测试代码,在main 中需要起一进程进行监听并保存至指定地址(实现进程件共享)
1.调用百度、阿里等大厂api 接口,可在他们的云平台上进行注册和查看api 文档实现,需要获取key
2.免费的图灵接口:
直接调用函数实现:
#!/usr/bin/env python # -*- coding: UTF-8 -*- ''' @Project :talkboot @File :main.py @Author : AICode1 @Date :2023/1/1 下午6:40 import urllib import requests def talkRobot(msg): url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg={}'.format(urllib.parse.quote(msg)) html = requests.get(url) return html.json()["content"] if __name__ == "__main__": res=talkRobot("你好!")
该功能主要将对话呼叫"自定义唤醒词" 获取的语音识别后=msg 输入函数获取回答。
单进程情形下将呼叫后的语音调用import pyttsx3 模块可进行朗读回答
结合手势检测和视频画面显示(问答广告、图片问答)的应用方法构建中。。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。