当前位置:   article > 正文

自动语音对话系统 Python实现_python语音对话

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113

以上代码是监听并保存成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("你好!")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

该功能主要将对话呼叫"自定义唤醒词" 获取的语音识别后=msg 输入函数获取回答。
单进程情形下将呼叫后的语音调用import pyttsx3 模块可进行朗读回答

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/88275
推荐阅读
相关标签
  

闽ICP备14008679号