AI 音频/文本对话机器人:Whisper+Edge TTS+OpenAI API构建语音与文本交互系统(简易版)


文章目录

  • 前言
  • 思路:
  • 环境配置
  • 代码
    • [1. 加载Whisper模型](#1. 加载Whisper模型)
    • [2. 使用Whisper语音转文本](#2. 使用Whisper语音转文本)
    • [3. 使用OpenAI API生成文本进行智能问答](#3. 使用OpenAI API生成文本进行智能问答)
    • [4. 实现文本转语音功能](#4. 实现文本转语音功能)
    • [5. 合并音频文件](#5. 合并音频文件)
    • [6. 构建Gradio界面](#6. 构建Gradio界面)
    • 注意
  • 总结

前言

在本篇博客中,我将分享如何利用Whisper模型进行语音转文本(ASR),通过Edge TTS实现文本转语音(TTS),并结合OpenAI API实现文本生成的语音与文本交互系统。这个系统可以用于构建智能助手、语音交互应用等场景。

前段时间学了英伟达系列课程,最近有时间基于视频中的demo设计了一个支持文本和语音问答的ai机器人。实现效果如下:

代码运行后台:

一个内网ip可供访问,

一个公网ip 72小时有效


视频效果展示

AI 音频/文本对话机器人

参考链接:https://github.com/kinfey/Microsoft-Phi-3-NvidiaNIMWorkshop/

思路:

左边用户输入音频或者文本。输入音频需要通过whisper model转为文本。然后输入到LLM中进行QA问答输出文本。之后通过egde_tts转换为音频。Gradio网页同时输出音频和文本。

环境配置

首先,安装所需的Python库:

bash 复制代码
# ! pip install whisper pydub 
# ! pip install gradio
# ! pip install openai-whisper==20231117 
# ! pip install ffmpeg==1.4
# ! pip install edge-tts
# ! pip install transformers
# ! pip install openai

代码

1. 加载Whisper模型

Whisper是OpenAI推出的一款强大的语音识别模型。我们可以选择不同尺寸的模型,以下代码展示了如何加载tiny模型:

python 复制代码
import whisper

select_model = "tiny"  # 可选模型:['tiny', 'base']
whisper_model = whisper.load_model(select_model)

2. 使用Whisper语音转文本

使用Whisper模型可以将音频转换为文本。以下函数实现了这一功能:

python 复制代码
def convert_to_text(audio_path):
    result = whisper_model.transcribe(audio_path, word_timestamps=True, fp16=False, language='English', task='translate')
    return result["text"]

3. 使用OpenAI API生成文本进行智能问答

这里用到的是英伟达提供的api,大家可以换不同的模型,也可以参考这一篇文章注册一个账号,新用户有一定的免费额度。

python 复制代码
def phi_demo(prompt):
    client = OpenAI(
        base_url="https://integrate.api.nvidia.com/v1",
        api_key="你的API key"
    )
    completion = client.chat.completions.create(
        model="microsoft/phi-3-mini-128k-instruct",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.4,
        top_p=0.7,
        max_tokens=512,
        stream=True
    )
    result = ""
    for chunk in completion:
        if chunk.choices[0].delta.content is not None:
            result += chunk.choices[0].delta.content
    return result

4. 实现文本转语音功能

为了将文本转为语音,我们使用了Edge TTS库。这里注意将文本进行了切片分别生成音频。以下是主要函数:

python 复制代码
import edge_tts
import asyncio

async def amain(TEXT, VOICE, OUTPUT_FILE):
    communicate = edge_tts.Communicate(TEXT, VOICE)
    await communicate.save(OUTPUT_FILE)

def edge_free_tts(chunks_list, speed, voice_name, save_path):
    if len(chunks_list) > 1:
        chunk_audio_list = []
        if os.path.exists("./content/edge_tts_voice"):
            shutil.rmtree("./content/edge_tts_voice")
        os.mkdir("./content/edge_tts_voice")

        for k, i in enumerate(chunks_list, 1):
            OUTPUT_FILE = f"./content/edge_tts_voice/{k}.mp3"
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            loop.run_until_complete(amain(i, voice_name, OUTPUT_FILE))
            chunk_audio_list.append(OUTPUT_FILE)

        merge_audio_files(chunk_audio_list, save_path)
    else:
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(amain(chunks_list[0], voice_name, save_path))

5. 合并音频文件

在处理长文本时,语音合成的结果可能会分为多个音频片段。我们需要将这些片段合并为一个完整的音频文件:

python 复制代码
from pydub import AudioSegment

def merge_audio_files(audio_paths, output_path):
    merged_audio = AudioSegment.silent(duration=0)
    for audio_path in audio_paths:
        audio = AudioSegment.from_file(audio_path)
        merged_audio += audio
    merged_audio.export(output_path, format="mp3")

6. 构建Gradio界面

为了让用户可以方便地与系统交互,我们使用Gradio库搭建了一个简单的Web界面:

python 复制代码
import gradio as gr

def run_text_prompt(message, chat_history):
    bot_message = phi_demo(message)
    edge_save_path = talk(bot_message)
    display(Audio(edge_save_path, autoplay=True))
    chat_history.append((message, bot_message))
    return edge_save_path, chat_history

with gr.Blocks() as demo:
    chatbot = gr.Chatbot(label="Chat with Phi 3 mini 4k instruct")
    msg = gr.Textbox(label="Ask anything")
    msg.submit(run_text_prompt, [msg, chatbot], [msg, chatbot])

    with gr.Row():
        audio = gr.Audio(sources="microphone", type="filepath")
        send_audio_button = gr.Button("Send Audio", interactive=True)
        send_audio_button.click(run_audio_prompt, [audio, chatbot], [audio, chatbot])

demo.launch(share=True, debug=True)

注意

在edge-tts输出的音频为.MP3文件,然后我在中间加了一个代码将其转为.wav文件。(因为我这边web页面的音频一直输出失败,比较玄学)

python 复制代码
def convert_mp3_to_wav(mp3_file_path, wav_file_path):

    audio = AudioSegment.from_mp3(mp3_file_path)

    audio.export(wav_file_path, format="wav")

总结

在这篇博客中,我们介绍了如何使用Whisper、Edge TTS与OpenAI API构建一个功能强大的语音与文本交互系统。这个系统可以广泛应用于语音助手、智能客服等场景,极大地提升用户体验。

后续优化的地方:

  1. 处理速度慢,后续将继续学习LLM 推理加速这一块。特别是音频分块后合成导致LLM生成文本后加载的时间比较长。
  2. 多进程,如果打开多个页面,会出现报错的现象。后续还要进一步排查。
  3. 因为英伟达api调用次数的限制,后续会部署自己的LLM open ai接口。
    希望这篇博客能为你在语音处理和AI应用开发上提供帮助!如果你有任何问题或建议,欢迎在评论区讨论。
相关推荐
朗迪锋5 分钟前
航空维修培训中的虚拟现实辅助工程技术应用
大数据·人工智能·安全·vr·虚拟现实
张琪杭17 分钟前
卷积神经网络(二)CIFAR100类别分类
人工智能·分类·cnn
AI创客岛29 分钟前
如何通过LlamaIndex工作流程简化我的研究和演示
人工智能·计算机视觉
gomogomono1 小时前
【FFMPEG】FFplay音视频同步分析(下)
ffmpeg·音视频
标贝科技1 小时前
标贝科技个性化音色定制方案 解锁语音合成无限可能
人工智能·科技·人机交互·语音识别
廾匸07051 小时前
《人工智能安全治理框架》1.0版
人工智能·安全
爱敲代码的小崔1 小时前
深度神经网络
人工智能·深度学习·神经网络
张3蜂2 小时前
人工智能领域的AGI指的是什么?
人工智能·agi
芙蓉姐姐陪你写论文2 小时前
别再为创新点发愁了!ChatGPT助你快速搞定!
大数据·论文阅读·人工智能·chatgpt·ai写作·论文笔记·aipapergpt
96772 小时前
神经网络的线性部分和非线性部分
人工智能·深度学习·神经网络