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 whisper select_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.content return result 

4. 实现文本转语音功能

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

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

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

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界面:

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

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构建一个功能强大的语音与文本交互系统。这个系统可以广泛应用于语音助手、智能客服等场景,极大地提升用户体验。

后续优化的地方:

处理速度慢,后续将继续学习LLM 推理加速这一块。特别是音频分块后合成导致LLM生成文本后加载的时间比较长。 多进程,如果打开多个页面,会出现报错的现象。后续还要进一步排查。 因为英伟达api调用次数的限制,后续会部署自己的LLM open ai接口。
希望这篇博客能为你在语音处理和AI应用开发上提供帮助!如果你有任何问题或建议,欢迎在评论区讨论。

总结

### 文章总结
本文详细阐述了如何使用Whisper语音转文本模型、Edge TTS文本转语音服务以及OpenAI API实现一个具有语音与文本交互功能的AI系统。该系统能够实现用户通过输入音频或文本的方式与AI进行对话,并实时返回语音和文本形式的回答。以下是主要内容的总结:
#### 前言
- **目的**:构建一个可用于智能助手、语音交互应用等场景的语音与文本交互系统。
- **背景**:基于英伟达系列课程的学习,利用所学知识设计了支持文本和语音问答的AI机器人。
#### 环境配置
- **Python库安装**:包括whisper、pydub、gradio、edge-tts、transformers和openai等库。
#### 实现步骤
1. **加载Whisper模型**:根据需要选择tiny或base尺寸的模型进行加载。
2. **语音转文本**:使用Whisper模型实现音频到文本的转换。
3. **智能问答**:通过OpenAI API(案例中使用了英伟达提供的api,但可以替换为其他LLM模型)接收文本输入并生成回答。
4. **文本转语音**:使用Edge TTS库将生成的文本转换为语音,并处理长文本分段生成的多个音频片段。
5. **合并音频文件**:将分段生成的音频片段合并为一个完整的音频文件。
6. **构建Gradio交互界面**:使用Gradio搭建Web界面,支持用户通过音频或文本方式与AI进行聊天。
#### 注意事项
- **音频格式问题**:由于网页播放音频的兼容性问题,将Edge TTS输出的MP3文件转换为WAV格式。
#### 总结与展望
- **系统功能**:系统结合了Whisper、Edge TTS和OpenAI API的强大功能,形成了一个完整的语音与文本交互系统。
- **应用场景**:该系统可应用于智能助手、智能客服等场景,提升用户体验。
- **后续优化**:包括提升推理速度、解决多进程问题以及解除API调用次数限制等。
### 文章亮点
- **详细代码**:提供了各环节的具体代码实现,便于读者参考和复现。
- **完整流程**:从环境配置到功能实现及界面搭建,详细介绍了整个开发流程。
- **实际应用**:展示了系统的具体应用场景和潜在价值。
希望这篇博客能够为广大AI爱好者和开发者提供实用的参考和借鉴。 whisperttsapiopenaichatgradiobotmp3ai apitpuchatbot文本交互语音转文本prompt文本转语音llmios机器人cli音频片段
  • 本文作者:李琛
  • 本文链接: https://wapzz.net/post-20350.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
本站部分内容来源于网络转载,仅供学习交流使用。如涉及版权问题,请及时联系我们,我们将第一时间处理。
文章很赞!支持一下吧 还没有人为TA充电
为TA充电
还没有人为TA充电
0
  • 支付宝打赏
    支付宝扫一扫
  • 微信打赏
    微信扫一扫
感谢支持
文章很赞!支持一下吧
关于作者
2.3W+
5
0
1
WAP站长官方

【AIGC】因果注意力(Causal Attention)原理及其代码实现

上一篇

零刻首发AMD Zen5迷你机:旗舰锐龙AI 9 HX 370核显媲美RTX 3050

下一篇
  • 复制图片
按住ctrl可打开默认菜单