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

相关文章

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行