手把手带你搭建一个语音对话机器人,5分钟定制个人AI小助手(新手入门篇)

写在前面

如果你的身边有一个随时待命、聪明绝顶的AI小助手,能够听懂你的话,理解你的需求,用温暖的声音回应你,会是一种什么体验?

今天,带大家一起搭建一个语音对话机器人,拥有一个专属的个人AI小助手。

本文面向技术小白,以最通俗易懂的语言,最贴心的步骤指导,确保你能够轻松上手,快速掌握。

语音对话系统的基本组成有哪些?

一个可以实现语音对话的机器人,通常需要由硬件和软件构成,硬件可以理解为机器人的躯体。

本篇主要来聊聊语音对话机器人的软件部分。

说到软件部分,通常又可以抽象为三个部分:

  • 自动语音识别(Automatic Speech Recognition, 简称 ASR),相当于 机器人的耳朵,用于把我们的语音识别成文字;
  • 自然语言处理(Natural Language Processing, 简称 NLP),相当于 机器人的大脑,理解上一步得到的文字信息,并进行答复,当前主流的解决方案是大语言模型LLM
  • 文本到语音合成(Text to Speech,简称 TTS),相当于 机器人的嘴巴,把上一步的答复用语音回答出来

在这里插入图片描述

如何快速搭建语音对话系统?

为了帮助大家从0到1快速完成一个系统的搭建,本文将完全采用开源方案来实现。具体而言:

  • ASR 采用 FunASR,相比 OpenAI 开源的 Whisper,中文识别效果更好;

  • NLP 采用大语言模型(LLM)方案,比如我们这里可以采用 LLaMA3-8B,采用本地的 GPU 部署和运行,如果没有本地 GPU 资源,也可以调用云端 API 实现这一步;

  • TTS 采用 最新开源的 ChatTTS,它是专门为对话场景设计的文本转语音模型,支持英文和中文两种语言,效果非常惊艳。

1 语音识别 ASR

ASR 采用阿里开源的 FunASR,相比 OpenAI 开源的 Whisper,中文识别效果更好。

GitHub地址:https://github.com/modelscope/FunASR
模型调用参考:https://modelscope.cn/studios/iic/funasr_app_clipvideo/summary

通过如下代码,我们简单测试一下返回结果和模型效果:

from funasr import AutoModel
# asr model
funasr_model = AutoModel(model="iic/speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch",vad_model="damo/speech_fsmn_vad_zh-cn-16k-common-pytorch",punc_model="damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch",spk_model="damo/speech_campplus_sv_zh-cn_16k-common",)
rec_result = funasr_model.generate("test.wav", return_raw_text=False, is_final=True)

接下来我们需要将其封装成一个 API ,方便后续调用。最简单的我们可以采用 FastAPI 来实现封装,示例代码如下:

# 定义asr数据模型,用于接收POST请求中的数据
class ASRItem(BaseModel):wav : str # 输入音频,base64编码time_stamp : int = 0 # 时间戳,可选,默认为0app = FastAPI()
@app.post("/asr")
async def asr(item: ASRItem):time_stamp = int(item.time_stamp)try:data = base64.b64decode(item.wav)rec_result = funasr_model.generate(data, return_raw_text=False, is_final=True)res = rec_result[0]['sentence_info'] if time_stamp else rec_result[0]['text']result_dict = {"code": 0, "msg": "ok", "res": res}except Exception as e:result_dict = {"code": 1, "msg": str(e)}return result_dictif __name__ == '__main__':uvicorn.run(app, host='0.0.0.0', port=2002)

2 大语言模型(LLM)

为了实现对话功能,我们可以采用当前的大语言模型(LLM),对上一步识别出来的文字进行理解,并给出答复。

本文的 LLM 采用 LLaMA3-8B,开源社区已经实现了对 LLaMA3-8B 的中文指令微调,为此中文效果会比原始版本效果更好。

GitHub地址:https://github.com/ymcui/Chinese-LLaMA-Alpaca-3
模型地址:https://modelscope.cn/models/ChineseAlpacaGroup/llama-3-chinese-8b-instruct/summary

在上述的 GitHub 仓库中,给出了一键部署的脚本,非常方便。四步走搞定它:

  • 下载代码
  • 下载模型
  • 安装必要的包
  • 服务启动

step 1 下载代码:

git clone https://github.com/ymcui/Chinese-LLaMA-Alpaca-3

step 2 下载模型:

git clone https://www.modelscope.cn/ChineseAlpacaGroup/llama-3-chinese-8b-instruct.git

step 3 安装必要的包:

pip install fastapi uvicorn shortuuid sse_starlette peft bitsandbytes
pip install flash-attn --no-build-isolation # 如果要使用flash-attention的话

step 4 服务启动:
服务启动的代码如下,--base_model 替换为自己的模型路径,--load_in_4bit 指定了采用 4bit 量化。

注意:如果采用不量化的方案,显存占用12G,回复非常慢,有请求过来显存占用最高近14G,而采用4bit 量化,显存只占用 6G。

python scripts/oai_api_demo/openai_api_server.py \
--base_model /path/to/models/llama-3-chinese-8b-instruct/ \
--gpus 2 \
--port 2001 \
--load_in_4bit \
--use_flash_attention_2 \
> log.txt 2>&1 &

step 5 服务调用:
为了实现 LLM 的个性化回答,当然需要给它设定一个特定的人设啦 ~ ,这一步可以通过人设提示词来轻松搞定。下面给一个示例:

from openai import OpenAI# 枚举所有可用的模型服务
model_dict = {'llama3-8b': {'api_key': 'sk-xxx','base_url': 'http://10.18.32.170:2001/v1',},
}# 设置人设提示词,根据需要进行修改
prompt_dict = {'llama3-8b': [{"role": "system", "content": "你是猴哥的全能小助手,上知天文,下知地理,可解决生活中的一切困扰。"},],
}class LLM_API:def __init__(self, api_key, base_url, model):self.client =  OpenAI(api_key=api_key,base_url=base_url,)self.model = modeldef __call__(self, messages, temperature=0.7):completion = self.client.chat.completions.create(model=self.model,messages=messages,temperature=temperature,)return completion.choices[-1].message.contentif __name__ == '__main__':model = 'llama3-8b'llm = LLM_API(model_dict[model]['api_key'], model_dict[model]['base_url'], model)user_question = "你是谁"messages = prompt_dict[model] + [{"role": "user", "content": user_question},]print(llm(messages))

如果本地没有 GPU 资源部署 大语言模型,也可以选择调用云端 API 来实现这一步,猴哥下一篇就来梳理一下:
我们都可以调用哪些免费的 LLM API?

欢迎追更!

3 语音生成(TTS)

为了将大模型输出的文字生成语音返回,这里我们采用 2024.5 刚开源的项目 - ChatTTS,生成效果非常惊艳。关于 ChatTTS 的具体使用,猴哥会单独出一篇教程,否则本文的篇幅就太长了。

同样还是采用 FastAPI 来实现封装,和部署 ASR 模型类似,在此不再赘述。

(PS:需要源码的可到文末自取~)

4 前端交互实现(Gradio)

Gradio是一个用于快速创建机器学习模型的交互式演示的开源库。它允许开发者通过简单的Python代码快速构建一个用户界面。

为了快速搭建应用,我们还是要请出我们的老朋友 - Gradio,交互界面如图所示:
在这里插入图片描述

WebUI 代码奉上:

import gradio as gr 
from speech_client import asr_damo_api, tts_chat_api
from llm_client import LLM_API, prompt_dict, model_dicthost_avatar = 'assets/host_image.png'
user_avatar = 'assets/user_image.png'model = 'llama3-8b'
# model = 'gpt-4'
llm = LLM_API(model_dict[model]['api_key'], model_dict[model]['base_url'], model)with gr.Blocks(theme=gr.themes.ThemeClass) as demo:state = gr.State({'messages': []})with gr.Row():with gr.Column(scale=1):user_chatbot = gr.Chatbot(value=[[None, '欢迎你来!']],elem_classes="app-chatbot",avatar_images=[host_avatar, user_avatar],label="交互区",show_label=True,bubble_full_width=False,height=800)with gr.Column(scale=1):audio_user = gr.Audio(label="User Input", sources=['microphone'], type='filepath')user_text = gr.Textbox(label="语音识别内容")user_submit = gr.Button("提交", variant="primary")audio_bot = gr.Audio(label="Bot Output", autoplay=True, type='filepath')def process_audio(audio):print('Processing audio:', audio)text = asr_damo_api(audio, time_stamp=0, srt=False)print(text)return textdef user_submit_handler(user_text, state, chatbot):chatbot.append((user_text, None))yield (chatbot, None)messages = state['messages']if len(messages) == 0:messages = prompt_dict[model] + [{"role": "user", "content": user_text}]else:messages.append({"role": "user", "content": user_text})print(messages)response = llm(messages)chatbot.append((None, response))messages.append({"role": "assistant", "content": response})print(messages)state['messages'] = messagesaudio = tts_chat_api(response)print(audio)yield (chatbot, audio)audio_user.stop_recording(process_audio, inputs=audio_user, outputs=user_text)user_submit.click(user_submit_handler, inputs=[user_text, state, user_chatbot], outputs=[user_chatbot, audio_bot])demo.launch(server_name='0.0.0.0', server_port=7861)

最后我们来看下效果:

语音对话机器人-个人AI小助手

未完待续

至此,一个语音对话交互系统就搭建好了,当然目前只是为了演示基本功能,界面还比较简陋,在此基础上 ,还可以增加更多功能:

  • ASR : 目前采用的 FunASR 模型,在有噪声情况下识别效果还有待增强,需要找到更有效的平替;
  • LLM:模型本地部署对很多小伙伴还是有一定门槛,需要找到平价 or 免费的云端 API
  • TTS:ChatTTS的效果非常不错,后续可以增加说话人身份,实现更丰富的输出;支持流式对话,像 GPT-4o 那样自然打断。

如果本文对你有帮助,欢迎点赞收藏备用!

目前猴哥开始运营一个公众号,旨在分享关于AI效率工具、自媒体副业的一切。用心做内容,不辜负每一份关注。

如需要获取本项目的源码,可关注后台发送 “机器人” 获取👇。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

games101作业7光线追踪 含多线程和微表面提高

对于光线追踪进行综合运用。 光线与三角形求交 其它的emit那些,现在先不用管,后面看看作用是什么。 inline Intersection Triangle::getIntersection(Ray ray) {Intersection inter;if (dotProduct(ray.direction, normal) > 0)//光线从里面打&…

[Shell编程学习路线]——深入理解Shell编程中的变量(理论与实例)

🏡作者主页:点击! 🛠️Shell编程专栏:点击! ⏰️创作时间:2024年6月12日11点40分 🀄️文章质量:95分 文章目录 ————前言———— 1 自定义变量 🫠…

Zynq学习笔记--AXI4-Stream到视频输出IP是如何工作的?

目录 1. 简介 2. 原理详解 2.1 示例工程 2.2 AXI4-Stream to Video Out 3. Master/Slave Timing Mode 3.1 Slave Timing Mode 3.2 Master Timing Mode 4. 总结 1. 简介 本文主要介绍了 AXI4-Stream 到视频输出 的内容。其中,示例工程展示了一个具体的设计&…

GitLab教程(五):高效的工作模式——Feature Branching

文章目录 1.什么是Feature Branching2.Feature Branching的Git实践 1.什么是Feature Branching 特性分支(Feature Branching)是一种软件开发工作流,尤其在使用Git或其他版本控制系统时被广泛采用。这种策略鼓励开发者为每一个新功能、改进或…

推荐一款好用的读论文软件操作方法

步骤: 1. 使用一译 —— 文档和论文翻译、对照阅读、讨论和社区 2.上传自己想要翻译的论文即可。 示例 Planing论文双语翻译 1.1 Parting with Misconceptions about Learning-based Vehicle Motion Planning 中英文对照阅读 1.2 Rethinking Imitation-based Pl…

SCT82A32 是一款 100V 电压模式控制同步降压控制器

主要特征 ◦ 5.5V-100V 宽输入范围 ◦ 0.8V-60V 可调输出电压 ◦ 0.8V1% 参考电压 ◦ 最低占空比下的40ns 最小 tON ◦ 最高占空比下的150ns 最小 tOFF • 100 KHz 到 1.2 MHz 开关频率 ◦ 时钟同步输入/输出功能 ◦ 可选择二极管仿真或 FPWM • 7.5V 门极驱动器 ◦ 2.3A …

Spring Cloud Gateway 详解:构建高效的API网关解决方案

Spring Cloud Gateway 详解:构建高效的API网关解决方案 Spring Cloud Gateway 是 Spring Cloud 生态系统中用于构建 API 网关的核心组件。它基于 Spring WebFlux 构建,旨在提供简单且有效的方式来路由和增强 API 请求。以下是 Spring Cloud Gateway 的详…

【iOS】YYModel源码阅读笔记

文章目录 前言一、JSON转换库对比二、YYModel性能优化三、YYModel的使用四、架构分析YYClassInfo 剖析 五、流程剖析转换前准备工作 – 将JSON统一成NSDictionary将NSDictionary 转换为Model对象提取Model信息使用NSDictionary的数据填充Model 总结 前言 先前写了JSONModel的源…

如何计算可截素数

什么是可截素数? 它本身是一个素数,如果从左往右逐一截去数字,剩下的仍然都是素数,如果从右往左逐一截去数字,剩下的也仍然都是素数。 例如:3797就是一个可截素数。 从左往右截去数字:797&a…

利用three-csg-ts对做物体交互式挖洞

默认物体均为居中,如果指定位置没有发生偏移,可能是因为在执行布尔操作之前没有正确设置变换。确保在进行布尔运算之前应用所有必要的变换。以下是经过修正的完整代码示例,它会确保圆柱正确旋转并与盒子进行 CSG 操作。 安装依赖 首先&…

如何实现网络隔离后,军工单位内网数据导出的安全性?

在现代信息化战争中,军工单位在信息安全方面的需求尤为突出。通常会采用物理隔离,将网络隔离成内网和外网,防止外部网络的恶意入侵和数据窃取。隔离后的数据仍存在内外网交换的需求,即涉及到内网数据导出,因此每日会面…

盒马鲜生礼品卡如何使用?

盒马鲜生的礼品卡除了在门店用以外,还有什么用处啊 毕竟家附近的盒马距离都太远了,好多卡最后都闲置下来了,而且以前都不知道盒马卡还会过期,浪费了好多 还好最近发现了 盒马鲜生礼品卡现在也能在收卡云上兑现了,而且…

深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南

📢📢📢 深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南 Spring Cloud Sentinel 是阿里巴巴开源的一款强大的分布式系统流量防卫组件,专为微服务架构设计,提供流量控制、熔断降级…

watcher学习小结

架构 主要是watcher-api,watcher-applier,watcher-decision-engine watcher-applier watcher-decision-engine 将DecisionEngineManager和DecisionEngineSchedulingService封装到oslo_service,然后调service的launch_service,实…

NetSuite ERP项目中非批次物料—批次物料数据转换流程

最近在刚结束的项目上也再次碰到了非批次物料转换为批次物料的操作,因此也想把我们在处理数据流程中的心得写出来,以便复盘与总结,也分享给各位。 整体的步骤我们可分为准备工作,调整工作以及检查工作: 准备工作 主…

抖店退款退货率太高,平台也不帮助商家,快做不下去了怎么办?

我是王路飞。 现在很多商家对抖店的评价是:比拼多多还狠,动不动就扣保证金,退款率太高,而平台一边倒站买家,要是再遇到个别发疯的买家,商家真的很无助。 其实关于抖店退款退货率高、平台也不站在商家这一…

编译结果处理的shell脚本

#!/bin/bash WEB"web" DIST"dist" RED\033[0:31m GREEN\033[0;32m NC\033[0m #生产打包传参 BUILD"b" if [ -e ${WEB} ];then#删历史文件rm -r ${WEB}rm ${WEB}.zip fi #编辑文件 npm run build #检查构建是否成功 if[ -e ${DIST} ];then#改名mv…

分布式事务的八种方案解析(1)

针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知等方案,以下总结8 种常见的解决方案,帮助大家在实际的分布式系统中更好地运用事务。 1.2PC 二阶段提交协议(Two-phase commit protocol)&…

好用的视频压缩软件

在当今数字化时代,视频已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,视频都扮演着重要的角色。视频的存储空间也越来越大,这给我们的设备存储带来了不小的挑战。因此,学习如何将视频压缩小点成为了一项实用的…

叁[3],VM二次开发异常处理

1,开发环境 VS2022/WPF/.NetFramework4.8 VM4.2 2,"模块状态0,错误码10100005,错误信息:模块与平台不匹配" 现象描述: 1,WPF/NetFramework项目中打开方案,对工具做模板&#xff0c…