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

本文主要是介绍AI 音频/文本对话机器人:Whisper+Edge TTS+OpenAI API构建语音与文本交互系统(简易版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


文章目录

  • 前言
  • 思路:
  • 环境配置
  • 代码
    • 1. 加载Whisper模型
    • 2. 使用Whisper语音转文本
    • 3. 使用OpenAI API生成文本进行智能问答
    • 4. 实现文本转语音功能
    • 5. 合并音频文件
    • 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库:

# ! 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模型:

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

2. 使用Whisper语音转文本

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

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,大家可以换不同的模型,也可以参考这一篇文章注册一个账号,新用户有一定的免费额度。
在这里插入图片描述

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.contentreturn result

4. 实现文本转语音功能

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

import edge_tts
import asyncioasync 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. 合并音频文件

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

from pydub import AudioSegmentdef 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 += audiomerged_audio.export(output_path, format="mp3")

6. 构建Gradio界面

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

import gradio as grdef 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_historywith 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页面的音频一直输出失败,比较玄学)

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应用开发上提供帮助!如果你有任何问题或建议,欢迎在评论区讨论。

这篇关于AI 音频/文本对话机器人:Whisper+Edge TTS+OpenAI API构建语音与文本交互系统(简易版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107998

相关文章

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹