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

简介: 本文介绍了如何从零开始搭建一个语音对话机器人,涵盖自动语音识别(ASR)、自然语言处理(NLP)和文本到语音合成(TTS)三大核心模块。通过使用开源工具如FunASR、LLaMA3-8B和ChatTTS,以及FastAPI和Gradio等技术,详细指导读者轻松实现个人AI小助手的构建,适合技术新手快速上手。

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

今天,带大家从0到1搭建一个语音对话机器人,让你分分钟拥有一个专属的个人 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 # 时间戳,可选,默认为0

app = 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_dict

if 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 服务调用:

为了定制你的个人 AI 助手,实现 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 = model

def __call__(self, messages, temperature=0.7):
    completion = self.client.chat.completions.create(
        model=self.model,
        messages=messages,
        temperature=temperature,
    )
    return completion.choices[-1].message.content

if 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_dict

host_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 text

def 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'] = messages
    audio = 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)
未完待续
至此,一个语音对话交互系统就搭建好了,当然目前只是为了演示基本功能,界面还比较简陋,在此基础上 ,还可以增加更多功能:

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

相关实践学习
阿里小蜜中的机器阅读技术
阿里云智能对话机器人(原云小蜜)依托阿里云AI技术,为企业提供一体化对话机器人服务,帮助企业构建新一代全时段智能交互系统,精准理解用户意图,支持界面化流程配置、自定义三方业务集成等功能,降本增效,广泛适用于智能客服问答、智能办公助理、售前业务咨询等场景。
目录
相关文章
|
5月前
|
数据采集 人工智能 自然语言处理
AI终于能听懂宝宝说话了!ChildMandarin:智源研究院开源的低幼儿童中文语音数据集,覆盖22省方言
ChildMandarin是由智源研究院与南开大学联合推出的开源语音数据集,包含41.25小时3-5岁儿童普通话语音数据,覆盖中国22个省级行政区,为儿童语音识别和语言发展研究提供高质量数据支持。
442 20
AI终于能听懂宝宝说话了!ChildMandarin:智源研究院开源的低幼儿童中文语音数据集,覆盖22省方言
|
5月前
|
人工智能 算法 数据可视化
机器人训练师狂喜!Infinite Mobility:上海AI Lab造物神器1秒生成可动家具,成本只要1分钱
上海AI Lab推出的Infinite Mobility采用程序化生成技术,可高效生成22类高质量可交互物体,单个生成仅需1秒且成本低至0.01元,已应用于机器人仿真训练等领域。
175 2
机器人训练师狂喜!Infinite Mobility:上海AI Lab造物神器1秒生成可动家具,成本只要1分钱
|
4月前
|
人工智能 Java API
Spring AI 实战|Spring AI入门之DeepSeek调用
本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。
1330 71
Spring AI 实战|Spring AI入门之DeepSeek调用
|
2月前
|
人工智能 弹性计算 运维
通勤路上修故障?钉钉机器人+ OOS AI 助手实现 7×24 小时运维自由
通过钉钉机器人配置阿里云 OOS AI 助手,您可以直接在钉钉群内发送文字指令,实现免登录、跨设备、秒级响应的阿里云运维操作。
|
6月前
|
人工智能 自然语言处理 机器人
9.9K star!大模型原生即时通信机器人平台,这个开源项目让AI对话更智能!
"😎高稳定、🧩支持插件、🦄多模态 - 大模型原生即时通信机器人平台"
170 0
|
3月前
|
人工智能 文字识别 安全
趣丸千音MCP首发上线魔搭社区,多重技术引擎,解锁AI语音无限可能
近日,趣丸千音(All Voice Lab)MCP正式首发上线魔搭社区。用户只需简单文本输入,即可调用视频翻译、TTS语音合成、智能变声、人声分离、多语种配音、语音转文本、字幕擦除等多项能力。
424 32
|
2月前
|
人工智能 Android开发 iOS开发
安卓版快捷指令,加了AI语音可以一句话操作v0.2.7
Shortcuts for Android(SFA)是一款安卓自动化工具,支持语音创建快捷指令,实现听歌、导航、发消息等操作。操作简单,提升效率,快来体验语音控制的便捷!
159 0
安卓版快捷指令,加了AI语音可以一句话操作v0.2.7
|
2月前
|
人工智能 自然语言处理 语音技术
深度解析:AI语音客服系统如何重塑客户服务体验与主流解决方案探析
在数字化浪潮下,AI语音客服凭借高效、便捷、24小时在线的优势,成为企业提升服务效率、优化体验的重要工具。本文详解其核心技术、应用价值、选型要点及市场主流方案,如阿里云通义晓蜜、合力亿捷等,助力企业智能化升级。
219 1
|
3月前
|
人工智能 移动开发 开发工具
H5录音、图文视频IndexDB储存最佳实践:用AI生成语音备忘录
随心记是一个由 AI 生成的网页备忘录,它支持语音录入(可下载)、图文视频记录。最重要的是,它支持离线使用,所有数据都储存在浏览器中,不依赖后端,刷新页面数据也不会丢失!
65 0
H5录音、图文视频IndexDB储存最佳实践:用AI生成语音备忘录
|
2月前
|
存储 人工智能 Java
Springboot集成AI Springboot3 集成阿里云百炼大模型CosyVoice2 实现Ai克隆语音(未持久化存储)
本项目基于Spring Boot 3.5.3与Java 17,集成阿里云百炼大模型CosyVoice2实现音色克隆与语音合成。内容涵盖项目搭建、音色创建、音频合成、音色管理等功能,适用于希望快速掌握Spring Boot集成语音AI技术的开发者。需提前注册阿里云并获取API Key。