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应用开发上提供帮助!如果你有任何问题或建议,欢迎在评论区讨论。
相关推荐
QY_Research_6 分钟前
2026房地产NFT平台创业机遇与落地指南分析报告
大数据·人工智能·物联网·机器人·制造
机器人零零壹1 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
电子元件小说家2 小时前
2026年四季度电感市场观察:AI算力与汽车电子驱动下的选型与验证建议智能硬件
人工智能·汽车
网易CodeWave-小码哥3 小时前
支持多模块 Java 微服务导入|CodeWave SDD V4.5.10 上线
人工智能
AI你一生一世3 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
belldeep3 小时前
python:genesis-world, Genesis-Embodied-AI
人工智能·python·ai·genesis
怕浪猫3 小时前
小程序成长计划上新:10 亿 Token 现在能调 DeepSeek-v4.1-flash了
人工智能·aigc·ai编程
ss2733 小时前
为什么PostgreSQL适合AI场景?
数据库·人工智能·postgresql
七牛云行业应用4 小时前
DeepSeek Super-agent 与 Grok Bot:开源 Agent 架构和聊天助手有何区别
人工智能·ai·架构·ai编程
维克兜率天4 小时前
【维克】趋势型CTA:期货市场的“追涨杀跌“
人工智能·python