为了账号安全,请及时绑定邮箱和手机立即绑定

语音到语音RAG

txtai 是一个用于语义搜索、LLM编排和语言模型工作流的一站式嵌入式数据库。

有许多文章、笔记本和示例介绍了如何使用txtai进行向量搜索和/或检索增强生成(RAG)。较少为人所知的是,txtai内置了一个工作流组件。

工作流是一种简单而强大的构建,它接受一个可调用对象并返回元素。工作流能够高效地处理管道数据。工作流本质上是流式的,并且以批处理的方式处理数据。这使得能够高效地处理大量数据。

本文将演示如何使用txtai构建一个语音到语音(S2S)的工作流。

注意:由于使用了输入和输出音频设备,此过程应在本地机器上运行。

安装依赖项

安装 txtai 及所有依赖项。

    pip install txtai[pipeline-audio] autoawq

进入全屏模式 退出全屏模式

定义S2S RAG工作流

下一个部分定义了语音到语音(S2S)RAG工作流。该工作流的目标是近乎实时地响应用户请求。

txtai 支持使用 Python 和 YAML 定义工作流。我们将介绍这两种方法。

下面的S2S工作流从麦克风管道开始,该管道流式传输并处理输入音频。麦克风管道内置了语音活动检测(VAD)。当检测到语音时,管道返回捕获的音频数据。接下来,将语音转录为文本,然后传递给RAG管道提示。最后,将RAG结果通过文本到语音(TTS)管道处理,并流式传输到输出音频设备。

    import logging

    from txtai import Embeddings, RAG
    from txtai.pipeline import AudioStream, Microphone, TextToSpeech, Transcription
    from txtai.workflow import Workflow, StreamTask, Task

    # 启用DEBUG日志
    logging.basicConfig()
    logging.getLogger().setLevel(logging.DEBUG)

    # 麦克风
    microphone = Microphone()

    # 语音转文字
    transcribe = Transcription("distil-whisper/distil-large-v3")

    # 嵌入数据库
    embeddings = Embeddings()
    embeddings.load(provider="huggingface-hub", container="neuml/txtai-wikipedia")

    # 定义提示模板
    template = """
    使用以下上下文回答以下问题。仅包括具体讨论的信息。回答问题时不要解释你是如何找到答案的。

    问题: {question}
    上下文: {context}"""

    # 创建RAG管道
    rag = RAG(
        embeddings,
        "hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4",
        system="你是一个友好的助手。你回答用户的问题。",
        template=template,
        context=10
    )

    # 文本转语音
    tts = TextToSpeech("neuml/vctk-vits-onnx")

    # 音频流
    audiostream = AudioStream()

    # 定义语音到语音的工作流
    workflow = Workflow(tasks=[
        Task(action=microphone),
        Task(action=transcribe, unpack=False),
        StreamTask(action=lambda x: rag(x, maxlength=4096, stream=True), batch=True),
        StreamTask(action=lambda x: tts(x, stream=True, speaker=15), batch=True),
        StreamTask(action=audiostream, batch=True)
    ])

    while True:
        print("等待输入...")
        list(workflow([None]))

进入全屏模式 退出全屏模式

鉴于输入和输出都是音频,如果你是作为一篇文章来阅读这番内容的话,你可能需要发挥一下想象力。

查看此视频,看看实际工作流!以下示例将运行:

  • 告诉我关于罗马帝国的事情
  • 解释一下超光速旅行是如何工作的
  • 写一首关于维京人的短诗
  • 用法语告诉我关于罗马帝国的事情
YAML 中的 S2S 工作流

txtai 工作流的一个关键特性是它们可以使用 YAML 来定义。这使得在低代码或无代码环境中构建工作流成为可能。这些 YAML 工作流可以被“容器化”并运行。

让我们在下面定义相同的流程。

    # 麦克风
    microphone:

    # 基于语音的转录
    transcription:
      path: distil-whisper/distil-large-v3

    # 嵌入数据库
    cloud:
      provider: huggingface-hub
      container: neuml/txtai-wikipedia

    embeddings:

    # 信息检索与生成(RAG)
    rag:
      path: "hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4"
      system: 你是一个友好的助手。你需要回答用户的问题。
      template: |
        使用以下上下文回答以下问题。只包括具体讨论过的信息。不要解释你是如何找到答案的。

        问题: {question}
        上下文: {context}
      context: 10

    # 文本转语音
    texttospeech:
      path: neuml/vctk-vits-onnx

    # 音频流
    audiostream:

    # 从语音到语音的聊天工作流
    workflow:
      s2s:
        tasks:
          - microphone
          - action: transcription
            unpack: False
          - task: stream
            action: rag
            args:
              maxlength: 4096
              stream: True
            batch: True
          - task: stream
            action: texttospeech
            args:
              stream: True
              speaker: 15
            batch: True
          - task: stream
            action: audiostream
            batch: True

进入全屏模式 退出全屏模式

    从 txtai 导入 Application

    app = Application("s2s.yml")
    while True:
        print("等待输入...")
        list(app.workflow("s2s", [None]))

进入全屏模式 退出全屏模式

再一次,同样的想法,只是用不同的方式实现。在视频演示中,提出了以下查询。

  • 作为一名爱国者队的球迷,你猜我最喜欢的四分卫是谁?
  • 我个子高且跑得快,你觉得最适合我的足球位置是什么?
  • 我跑得慢,你觉得最适合我的足球位置是什么?

使用 YAML 工作流,可以在代码之外,例如通过网页界面,完全定义流程。也许有一天我们会在 txtai.cloud 看到这样的功能 😀

结束语

本文展示了如何使用txtai构建一个语音到语音(S2S)的工作流。虽然该工作流使用了一个现成的嵌入式数据库,但也可以轻松地用自定义的嵌入式数据库替换。从那里,我们就可以使用自己的数据进行S2S了!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消