基于python+文心一言开发的智能语音助手

东湖之滨  论坛元老 | 2025-4-25 22:32:29 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1799|帖子 1799|积分 5401

一、API接口搭建(百度云)

这里选用的是百度云的文心一言来实现智能问答,下面先容具体的接口搭建
1、进入官网注册账号

官方网址:百度智能云-登录 (baidu.com)


这里扫码登陆即可 百度APP或者百度网盘APP举行登录
2、按照步骤举行接口搭建


左侧往下翻找到应用接入点击,然后点击创建应用举行创建


这里根据本身的喜好举行填写应用名称 应用描述,下面的应用设置发起全部选择,然后点击确认即可

这里须要记下API Key 和 Secret Key,后面代码中会用到
到此百度云的API已经搭建完成,就可以进入第二步啦
二、项目整体分析

本项目是一个基于 Python 实现的语音助手,利用了 Vosk 语音识别库、百度文心一言 API 举行语音指令处理和响应,同时结合了 pyttsx3 实现语音合成。别的,还支持通过终端输入指令举行交互,具备多线程处理本领。
1.功能概述


  • 语音识别

    • 利用 Vosk 离线语音识别模子,对用户语音指令举行识别。
    • 支持中文语音识别,通过设定叫醒词(如“小智小智”“你好助手”)来触发语音助手。

  • 语音合成

    • 利用 pyttsx3 举行语音反馈,比方:在识别到指令后播报结果。
    • 封装了一个线程安全的语音合成类 ThreadSafeTTS,确保多线程环境下语音合成不会辩论。

  • 终端交互

    • 用户在终端中输入指令(如“你好小智”),也可以叫醒语音助手并处理相应指令。
    • 终端监听通过独立线程运行,支持输入 exit 指令来关闭步调。

  • 与百度文心一言 API 集成

    • 利用百度 AI 平台的文心一言 API,举行更复杂的自然语言处理和生成任务。
    • 通过 Access Token 鉴权,发送用户指令给 API,并吸收和处理 API 的响应。

  • 多线程机制

    • 实现了多线程处理,包罗语音监听线程、终端监听线程,以及指令处理线程。
    • 利用线程锁(threading.Lock)和队列(queue.Queue)确保线程安全。

2、项目架构与模块分析

(1)焦点类计划


  • ThreadSafeTTS 类

    • 封装 pyttsx3,实现线程安全的语音合成。
    • 在初始化时,自动选择中文语音并设置语速。
    • 提供 safe_speak 方法,确保在多线程环境下不会因重复调用 engine.runAndWait() 导致错误。

  • VoskVoiceAssistant 类

    • 语音助手的焦点逻辑实现,负责语音识别、指令处理和语音反馈。
    • 关键功能:

      • 初始化 Vosk 模子和语音识别器。
      • 启动语音监听线程,通过回调函数捕获音频并识别语音。
      • 启动终端监听线程,支持用户通过终端输入指令。
      • 调用百度 API 处理复杂指令,并返回结果。
      • 利用队列和线程锁,确保任务分发的线程安全性。


(2)关键函数与机制


  • 语音识别(_audio_callback 方法)

    • 利用 sounddevice 捕获及时音频流,将其转换为字节数据传递给 Vosk 识别器。
    • 识别结果通过 JSON 格式剖析,检测是否包罗叫醒词,若检测到则向任务队列添加“叫醒”任务。

  • 语音指令处理(_process_command 方法)

    • 从任务队列中获取“叫醒”任务后,开始录音,并将音频数据生存至缓冲区。
    • 在录音结束后,将音频提交给 Vosk 举行识别,剖析用户指令。
    • 调用 _call_wenxin 方法,与百度 API 交互,获取响应结果并用语音播报。

  • 百度 API 调用(_call_wenxin 方法)

    • 获取 Access Token:

      • 通过 API Key 和 Secret Key,向百度 OAuth 服务请求 access_token。

    • 调用文心一言 API:

      • 构建包罗用户指令的请求数据,发送给百度 API。
      • 吸收响应数据并剖析结果,返回给用户。

    • 非常处理:

      • 捕获网络请求或 API 响应中的非常,返回错误信息。


  • 终端指令监听(_terminal_input_listener 方法)

    • 独立线程运行,监听用户终端输入。
    • 若输入包罗叫醒词或特定指令(如 exit),向任务队列添加相应任务。

  • 主运行循环(run 方法)

    • 启动语音监听线程和终端监听线程。
    • 从任务队列中获取任务,根据任务范例(如“叫醒”或“关闭”)实行相应利用。
    • 支持通过 Ctrl+C 手动退出步调,并确保资源清理。

(3)辅助功能



  • 语音叫醒检测(_wake_detection 方法)

    • 利用 sounddevice 的 InputStream 实现及时音频流监听。
    • 基于 Vosk 的识别结果,检测是否说出叫醒词。

  • 多线程管理

    • 利用 threading.Thread 启动语音监听和终端监听线程。
    • 利用 queue.Queue 管理任务分发,确保线程间通信安全。
    • 利用 threading.Lock 克制多线程环境下对共享资源(如音频缓冲区、识别器)的辩论。

3、设置与依赖

1、Vosk 模子

须要下载 Vosk 的中文离线模子(vosk-model-cn-0.22)并指定路径。
设置路径:VOSK_MODEL_PATH。
2、百度 API 凭据

需提供百度 AI 平台的 API Key 和 Secret Key。
在 _call_wenxin 方法中替换为用户本身的凭据。
这里须要注意的是Vosk模子假如不会”科学上网“的话直接下载的话会非常慢乃至会产生报错信息,导致下载失败,固然可以采取一些镜像源比如清华镜像源或者阿里镜像源 但是貌似并没有这个模子,假如不发急的话可以在官网举行下载
官网地址:https://alphacephei.com/vosk/models/vosk-model-cn-0.22.zip 
进入下载即可 比较慢
这里直接分享一下百度网盘的链接:
链接: https://pan.baidu.com/s/1D0PKmMtlVI574EP0HO5fDQ?pwd=naxx 提取码: naxx 复制这段内容后打开百度网盘手机App,利用更方便哦
简单先容一下Vosk模子吧
Vosk模子可以大概支持连续的语音识别,并广泛实用于多种语言和平台,包罗Linux、Windows和Android等。该模子的工作原理主要基于深度神经网络(DNN),通过对大量语音数据举行训练,学习从语音信号中提取有用特性的本领。在识别阶段,Vosk模子将输入的语音信号转换为高维向量,与预训练的声学模子举行匹配,从而确定最大概的单词序列。
Vosk模子的优点在于它是一款轻量级、开源的语音识别工具,支持离线识别,无需依赖云端服务,有用掩护了用户隐私。同时,它具备多语言识别本领,顺应性强,可以在多种平台和装备上运行,为开发者提供了极大的便利。别的,Vosk模子还具有良好的及时性和准确性,可以大概满意大多数语音识别应用的需求。
3、焦点依赖库



  • vosk:离线语音识别。
  • sounddevice:音频流捕获。
  • pyttsx3:语音合成。
  • requests:与百度 API 通信。
  • numpy:处理音频数据。
  • json、queue、threading 等 Python 内置库。
安装主要有两种方法
第一种:

文件内里单击设置

选择Python表明器,点+号举行搜索后下载即可
第二种:
在终端中下载:

点击终端之后输入如下命令:pip install vosk sounddevice pyttsx3 requests numpy
假如下载不了的话 可以采取一些镜像源比如 清华镜像源命令如下:pip install vosk sounddevice pyttsx3 requests numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

安装好后 对于本项目标设置与依赖就已经完成啦,下面就是代码的编写
三、焦点代码编写及分析

在确保环境等设置无误后,就可以举行代码编写了 
1. 导入模块

代码首先导入了须要的Python模块,包罗sys、queue、json、os、threading、time、requests、sounddevice、numpy、vosk和pyttsx3等,用于实现语音识别、语音合成、线程管理、音频处理等功能。
2. 用户设置区域



  • VOSK_MODEL_PATH:指定Vosk语音识别模子的路径。
  • WAKE_WORDS:定义叫醒语音助手的关键词列表。
3. 系统参数



  • SAMPLE_RATE:音频采样率。
  • CHUNK_SIZE:音频处理块巨细。
  • RECORD_TIMEOUT:录音超时时间。
4. 线程安全语音合成类(ThreadSafeTTS)



  • 封装了pyttsx3语音合成库,确保在多线程环境下安全地输出语音。
  • _find_chinese_voice方法:设置中文语音。
  • safe_speak方法:线程安全地输出语音。
5. 语音助手类(VoskVoiceAssistant)



  • _init_vosk方法:初始化Vosk语音识别模子。
  • _audio_callback方法:音频回调函数,用于吸收音频数据并举行语音识别。
  • _wake_detection方法:启动语音叫醒检测线程,连续监听音频输入。
  • _process_command方法:处理语音指令,将识别结果通过百度文心一言API举行处理,并输出响应。
  • _call_wenxin方法:调用百度文心一言API,获取API响应。
  • speak方法:输出语音响应。
  • run方法:启动语音助手,包罗语音叫醒检测线程和终端输入监听线程。
6. 终端输入监听功能



  • _terminal_input_listener方法:独立线程监听终端输入,支持通过终端输入指令叫醒语音助手或关闭步调。
7. 主步调入口



  • 初始化语音助手并启动。
  • 捕获非常并输出错误信息。
8、功能概述



  • 语音助手支持通过语音或终端输入指令举行交互。
  • 利用Vosk举行离线语音识别,支持中文。
  • 利用百度文心一言API举行自然语言处理和响应生成。
  • 支持多线程,确保语音合成和指令处理不会阻塞其他功能。
9、源代码展示

[code]import sys
import queue
import json
import os
import threading
import time
import requests
import sounddevice as sd
import numpy as np
from vosk import Model, KaldiRecognizer
import pyttsx3

# ----------------- 用户配置区域 -----------------
VOSK_MODEL_PATH = "D:\\python\\pythonProject1\\.venv\\vosk-model-cn-0.22"
WAKE_WORDS = ["小智小智", "你好助手"]

# ----------------- 系统参数 -----------------
SAMPLE_RATE = 16000
CHUNK_SIZE = 8000
RECORD_TIMEOUT = 10


class ThreadSafeTTS:
    """线程安全的语音合成封装类"""

    def __init__(self):
        self.engine = pyttsx3.init()
        self.lock = threading.Lock()
        self._find_chinese_voice()

    def _find_chinese_voice(self):
        """配置中文语音"""
        for voice in self.engine.getProperty('voices'):
            if 'chinese' in voice.name.lower():
                self.engine.setProperty('voice', voice.id)
                self.engine.setProperty('rate', 160)
                break

    def safe_speak(self, text):
        """线程安全的语音输出"""
        with self.lock:
            try:
                # 确保事件循环未运行
                if not self.engine._inLoop:
                    self.engine.say(text)
                    self.engine.runAndWait()
            except Exception as e:
                print(f"❌ 语音合成失败: {str(e)}")

class VoskVoiceAssistant:
    def __init__(self):
        self._init_vosk()
        self.tts = ThreadSafeTTS() #使用线程安全封装

        self.task_queue = queue.Queue()
        self.is_listening = True
        self.recording = False
        self.audio_buffer = np.array([], dtype=np.int16)
        self.recognizer_lock = threading.Lock()
        self.recording_event = threading.Event()  # 添加录音状态事件

        self.processing_lock = threading.Lock()
        # 新增终端输入线程控制
        self.terminal_running = True

    def _init_vosk(self):
        if not os.path.exists(VOSK_MODEL_PATH):
            raise FileNotFoundError(f"模型未找到:{VOSK_MODEL_PATH}")
        self.model = Model(VOSK_MODEL_PATH)
        self.recognizer = KaldiRecognizer(self.model, SAMPLE_RATE)
        self.recognizer.SetWords(True)

    def _init_tts(self):
        self.engine = pyttsx3.init()
        for voice in self.engine.getProperty('voices'):
            if 'chinese' in voice.name.lower():
                self.engine.setProperty('voice', voice.id)
                self.engine.setProperty('rate', 160)
                break

    # 新增终端输入监听功能
    def _terminal_input_listener(self):
        """独立线程监听终端输入"""
        print("\n
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表