本篇博客主要基于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 模块可进行朗读回答
结合手势检测和视频画面显示(问答广告、图片问答)的应用方法构建中。。。。