AI 音频/文本对话呆板人:Whisper+Edge TTS+OpenAI API构建语音与文本交互 ...

打印 上一主题 下一主题

主题 1619|帖子 1619|积分 4857



  

前言

在本篇博客中,我将分享如何使用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库:
  1. # ! pip install whisper pydub
  2. # ! pip install gradio
  3. # ! pip install openai-whisper==20231117
  4. # ! pip install ffmpeg==1.4
  5. # ! pip install edge-tts
  6. # ! pip install transformers
  7. # ! pip install openai
复制代码
代码

1. 加载Whisper模子

Whisper是OpenAI推出的一款强大的语音识别模子。我们可以选择不同尺寸的模子,以下代码展示了如何加载tiny模子:
  1. import whisper
  2. select_model = "tiny"  # 可选模型:['tiny', 'base']
  3. whisper_model = whisper.load_model(select_model)
复制代码
2. 使用Whisper语音转文本

使用Whisper模子可以将音频转换为文本。以下函数实现了这一功能:
  1. def convert_to_text(audio_path):
  2.     result = whisper_model.transcribe(audio_path, word_timestamps=True, fp16=False, language='English', task='translate')
  3.     return result["text"]
复制代码
3. 使用OpenAI API生成文本举行智能问答

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

  1. def phi_demo(prompt):
  2.     client = OpenAI(
  3.         base_url="https://integrate.api.nvidia.com/v1",
  4.         api_key="你的API key"
  5.     )
  6.     completion = client.chat.completions.create(
  7.         model="microsoft/phi-3-mini-128k-instruct",
  8.         messages=[{"role": "user", "content": prompt}],
  9.         temperature=0.4,
  10.         top_p=0.7,
  11.         max_tokens=512,
  12.         stream=True
  13.     )
  14.     result = ""
  15.     for chunk in completion:
  16.         if chunk.choices[0].delta.content is not None:
  17.             result += chunk.choices[0].delta.content
  18.     return result
复制代码
4. 实现文本转语音功能

为了将文本转为语音,我们使用了Edge TTS库。这里留意将文本举行了切片分别生成音频。以下是主要函数:
  1. import edge_tts
  2. import asyncio
  3. async def amain(TEXT, VOICE, OUTPUT_FILE):
  4.     communicate = edge_tts.Communicate(TEXT, VOICE)
  5.     await communicate.save(OUTPUT_FILE)
  6. def edge_free_tts(chunks_list, speed, voice_name, save_path):
  7.     if len(chunks_list) > 1:
  8.         chunk_audio_list = []
  9.         if os.path.exists("./content/edge_tts_voice"):
  10.             shutil.rmtree("./content/edge_tts_voice")
  11.         os.mkdir("./content/edge_tts_voice")
  12.         for k, i in enumerate(chunks_list, 1):
  13.             OUTPUT_FILE = f"./content/edge_tts_voice/{k}.mp3"
  14.             loop = asyncio.new_event_loop()
  15.             asyncio.set_event_loop(loop)
  16.             loop.run_until_complete(amain(i, voice_name, OUTPUT_FILE))
  17.             chunk_audio_list.append(OUTPUT_FILE)
  18.         merge_audio_files(chunk_audio_list, save_path)
  19.     else:
  20.         loop = asyncio.new_event_loop()
  21.         asyncio.set_event_loop(loop)
  22.         loop.run_until_complete(amain(chunks_list[0], voice_name, save_path))
复制代码
5. 归并音频文件

在处置惩罚长文本时,语音合成的结果大概会分为多个音频片断。我们须要将这些片断归并为一个完备的音频文件:
  1. from pydub import AudioSegment
  2. def merge_audio_files(audio_paths, output_path):
  3.     merged_audio = AudioSegment.silent(duration=0)
  4.     for audio_path in audio_paths:
  5.         audio = AudioSegment.from_file(audio_path)
  6.         merged_audio += audio
  7.     merged_audio.export(output_path, format="mp3")
复制代码
6. 构建Gradio界面

为了让用户可以方便地与系统交互,我们使用Gradio库搭建了一个简单的Web界面:
  1. import gradio as gr
  2. def run_text_prompt(message, chat_history):
  3.     bot_message = phi_demo(message)
  4.     edge_save_path = talk(bot_message)
  5.     display(Audio(edge_save_path, autoplay=True))
  6.     chat_history.append((message, bot_message))
  7.     return edge_save_path, chat_history
  8. with gr.Blocks() as demo:
  9.     chatbot = gr.Chatbot(label="Chat with Phi 3 mini 4k instruct")
  10.     msg = gr.Textbox(label="Ask anything")
  11.     msg.submit(run_text_prompt, [msg, chatbot], [msg, chatbot])
  12.     with gr.Row():
  13.         audio = gr.Audio(sources="microphone", type="filepath")
  14.         send_audio_button = gr.Button("Send Audio", interactive=True)
  15.         send_audio_button.click(run_audio_prompt, [audio, chatbot], [audio, chatbot])
  16. demo.launch(share=True, debug=True)
复制代码
留意

在edge-tts输出的音频为.MP3文件,然后我在中间加了一个代码将其转为.wav文件。(由于我这边web页面的音频不停输出失败,比力玄学)
  1. def convert_mp3_to_wav(mp3_file_path, wav_file_path):
  2.     audio = AudioSegment.from_mp3(mp3_file_path)
  3.     audio.export(wav_file_path, format="wav")
复制代码
总结

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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表