实时语音助手DIY

APPLICATION Jan 2, 2025

借助现代库和 API,创建响应式实时 AI 语音助手变得越来越容易。在本博客中,我们将探索一种 Python 实现,该实现融合了语音识别、文本转语音 (TTS) 和自定义大型语言模型 (LLM) 提示,从而让受 Jarvis 启发的助手栩栩如生。

1、系统概述

该助手会听取用户输入、将语音处理为文本、与 LLM 交互,并以声音和文本形式回复。该助手名为“Jarvis”,旨在模仿钢铁侠宇宙中的人物形象——礼貌、诙谐、简洁。

2、关键组件

该实现结合了多种技术:

  • 语音识别:使用 Speech_recognition 库转录用户语音。
  • 文本转语音 (TTS):利用 pyttsx3 进行实时音频响应。
  • 自定义 AI 提示:采用 LangChain 和 Ollama LLM 生成智能、上下文感知的响应。

让我们一步一步深入研究代码。

3、设置基础

首先,导入必要的库,并使用 dotenv 加载环境变量以管理敏感凭据。

import speech_recognition as sr
import pyttsx3
import os
from dotenv import load_dotenv
load_dotenv()

这可确保涉及 API 密钥或敏感配置的项目具有安全和模块化的设置。

4、塑造 Jarvis 的个性

助手的行为通过 ChatPromptTemplate 进行塑造,确保响应符合角色。

from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama.llms import OllamaLLM
template = """
You are Jarvis, Charan's personal AI assistant from the Iron Man universe.
Your style is polite, witty, and succinct.
You address the user respectfully as \"Sir,\" or by name if provided.
You add subtle humor where appropriate, and you always stay in character as a resourceful AI.
Keep the responses short and to the point, and avoid overly verbose or complex replies.
Context / Conversation so far:
{history}
User just said: {question}
Now, Jarvis, please reply:
"""
prompt = ChatPromptTemplate.from_template(template)
model = OllamaLLM(model="llama3.1")
chain = prompt | model

这定义了一个“Jarvis 角色”,并设置了 LLM 以根据对话历史生成响应。

5、使用 pyttsx3 进行语音合成

为了确保助手能够发出声音,以下函数初始化了一个 TTS 引擎:

def SpeakText(text):
    engine = pyttsx3.init()
    voices = engine.getProperty("voices")
    engine.setProperty("rate", 180)  # Adjust speed
    engine.setProperty("volume", 1.0)  # Max volume
    engine.say(text)
    engine.runAndWait()

自定义语音选择和调整选项(例如速度和音量)允许定制 Jarvis 的声音。

6、使用speech_recognition进行语音识别

以下代码块持续监听用户输入并将其转换为文本:

def record_text():
    while True:
        try:
            with sr.Microphone() as source2:
                r.adjust_for_ambient_noise(source2, duration=0.2)
                print("Listening...")
                audio2 = r.listen(source2)
                print("Recognizing...")
                MyText = r.recognize_google(audio2)
                MyText = MyText.lower()
                print("You said:", MyText)
                return MyText
        except sr.RequestError as e:
            print(f"Could not request results; {e}")
        except sr.UnknownValueError:
            print("Unknown error occurred, please try again.")

此函数利用Google的语音识别API提供准确的转录。adjust_for_ambient_noise方法可提高嘈杂环境中的识别率。

7、使用对话历史记录维护上下文

为了提供上下文感知响应,需要维护消息历史记录:

messages = []
messages.append({"role": "system", "content": "You are Jarvis, Charan's AI."})
def send_to_jarvis(message):
    history_text = "".join([
        f"{msg['role'].title()}: {msg['content']}\n" for msg in messages
    ])
    response = chain.invoke({"history": history_text, "question": message})
    return response

助手的响应通过之前的交流得到丰富,确保了一致的交互。

8、主循环

应用程序不断监听输入、处理输入并做出响应:

while True:
    user_message = record_text()  # get user speech
    messages.append({"role": "user", "content": user_message})
    jarvis_response = send_to_jarvis(user_message)
    messages.append({"role": "assistant", "content": jarvis_response})
    print("Jarvis:", jarvis_response)
    SpeakText(jarvis_response)

此循环创建了一种交互式体验,用户可以自然地与 Jarvis 交谈。

9、增强功能和用例

  • 可定制角色:修改提示以创建具有独特个性或专业知识的助手。
  • 环境感知响应:添加模块以获取天气、控制物联网设备或检索上下文信息。
  • 多用户支持:增强系统以区分用户并提供个性化响应。

10、结束语

该项目重点介绍了如何组合现成的库来创建智能交互式语音助手。借助 LangChain、Ollama 和 Speech_recognition 等工具,开发人员可以专注于微调用户体验,而无需从头开始构建复杂的 NLP 系统。

立即尝试构建你自己的 AI 助手,并让我们知道你如何增强它!


原文链接:Building a Real-Time Voice Assistant: Integrating Speech Recognition, Text-to-Speech, and LLMs

汇智网翻译整理转载请标明出处

Tags