自动语音对话系统 Python实现

自动语音对话系统 Python实现

本篇博客主要基于Linux 上实现智能语音问答系统,主要采用的方法包含:语音采集、语音转换文字、自动问答、语音播报等。本次仿真是自摸索的方案,如有问题可指正交流哈!

如何设计自动问答系统?

实现一个语音问答系统?设计中主要在系统中建立监听进程,语音转文字+文字问答+播报进程,后续准备另开进行进行画面显示。。。
考虑1:系统麦克风如何打开后长时间监听声音?
考虑2:如何获取到问答系统的唤醒关键词?例如小爱音响在开机状态下都能够被“小爱同学”关键语音唤醒,如何实现?
考虑3:唤醒后如何获取对话的wav 片段声音?
考虑4:片段声音如何转换程中文片段?
考虑5:转换后文字片段如何获取智能答复?
考虑6:如何将回复的文字进行语音播报?

Python 仿真调用的主要包

1.snowboy 实现监听关键词
2.pyaudio wave 获取并笔记本麦克风声音并保存wav格式音频
3.回答问题模块:调用开源api 接口
4.ASR自动语音识别算法(算法训练加理论介绍)
5.multiprocessing 多进程实现监听、语音识别和问答的流程

snowboy 安装和使用

snowboy 是开源的、轻量级语音唤醒引擎,通过它创建属于自己的类似“小爱同学”,“hei,sir” ,“自定意"的唤醒词;可支持linux,android、ios 上进行开发和调用,git 后内置相关lib库。

1.如何安装

关于如何安装可自行百度或者参考:安装和生成自定义的关键词

2 如何交互使用?
如何实现监听并获取对话语音?

例如我们喊话"小爱同学"后,音响获取我们对话语音

#!/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
@Date2023/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 模块可进行朗读回答

如何构建多模态系交互系统?

结合手势检测和视频画面显示(问答广告、图片问答)的应用方法构建中。。。。

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值