【自己搭建一个:端到端的语音+大模型聊天机器人】

发布时间 2023-12-06 15:58:44作者: AI生产力

概要

发篇文章记录一下最近搞的语音+大模型聊天机器人的搭建过程,供交流学习。有正反馈的话会继续优化。

整体架构流程

注意:借传统的基于RASA的对话机器人的图一用,本博会把NLU(Natural Language Understanding)和 Dialogue Management这两个组件,用大模型来替代。

组件及模型说明:

  1. 用户通过麦克风输入语音(就是说话,本博是用户对着PC上的麦克风说话)
  2. STT(Speech-To-Text)模型:语音到文本的转换模型,本博采用开源的wenet模型(https://wenet.org.cn/wenet/python_package.html)
  3. NLU(Natural Language Understanding)和 Dialogue Management:本博采用Chinese-LLaMA-Alpaca-2(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/llamacpp_zh)
  4. TTS(Text-To-Speech)模型:文本到语音的转换模型,本博采用开源的PaddleSpeech(https://github.com/PaddlePaddle/PaddleSpeech/wiki/PaddleSpeech-Server-RESTful-API)

硬件部分

采用了两台CentOS7.9的云服务器,具体配置如下:

第一台服务器(192.168.0.92):

4vCPUs | 16GiB | s3.xlarge.2 | CentOS 7.9 64bit

第二台服务器(192.168.0.222):

4vCPUs | 8GiB | s3.xlarge.2 | CentOS 7.9 64bit

环境部分

需要在两台服务器上准备Anaconda的Python环境,操作命令如下:

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh
vi ~/.bashrc
export PATH=$PATH:~/miniconda3/bin # 将此命令加入到.bashrc中
source ~/.bashrc

conda config --add channels https://mirrors.aliyun.com/anaconda/pkgs/main/
conda config --add channels https://mirrors.aliyun.com/anaconda/pkgs/free/
conda config --add channels https://mirrors.aliyun.com/anaconda/pkgs/r/

pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/
pip config set install.trusted-host mirrors.aliyun.com
pip install -U pip

STT(Speech-To-Text)模型

注意:部署在第一台服务器上(本博是:192.168.0.92),请暴露 8501 端口,操作命令如下:

conda create wenet python==3.9
source activate wenet # 或者conda activate wenet
git clone https://github.com/wenet-e2e/wenet.git
cd wenet
pip install -e .

git clone git@e.coding.net:genhot/learning/voice-chatbot.git
pip install -r requirements.text

nohup python ./runtime/web/app.py > wenet.log 2>&1 &

完成后,你应该可以通过http://your_first_ip:8501来访问gradio的页面了。但是功能还没完成,它依赖于接下来的TTS模型和LLM模型,让我们继续。

TTS(Text-To-Speech)模型

注意:部署在第一台服务器上(本博是:192.168.0.92),请暴露 8090 端口,操作命令如下:

git clone https://e.coding.net/genhot/learning/PaddleSpeech.git
conda create -n paddle python=3.8
conda activate paddle
conda install -y -c conda-forge sox libsndfile swig bzip2
sudo yum install gcc gcc-c++
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
# 部分用户系统由于默认源的问题,安装中会出现 kaldiio 安转出错的问题,建议首先安装pytest-runner:
pip install pytest-runner -i https://pypi.tuna.tsinghua.edu.cn/simple 
# 请确保目前处于PaddleSpeech项目的根目录
pip install . -i https://pypi.tuna.tsinghua.edu.cn/simple --use-pep517
pip install opencc-python-reimplemented==0.1.6

#测试一下安装是否成功
paddlespeech tts --input "你好啊!" --output output.wav

LLM(Large Language Model)模型

注意:部署在第二台服务器上(本博是:192.168.0.222),请暴露 2900 端口,操作命令如下:

先创建一个Conda环境

conda create -n llamacpp python==3.10 # 我们后面会用llamacpp来对Chinese-Alpaca-2-7B做量化,好让模型在4核8G的CPU上能推理起来
source activate llamacpp

量化工具(llama-cpp)准备

##开始编译llama-cpp
git clone git@e.coding.net:genhot/learning/llama-cpp.git
sudo yum install -y centos-release-scl
yum install devtoolset-11
source /opt/rh/devtoolset-11/enable
gcc --version
cd llama-cpp
make
## 编译结束

## 安装python依赖
source activate llamacpp
cd llama-cpp
pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/
pip config set install.trusted-host mirrors.aliyun.com
pip install -U pip
pip install -r requirements.txt
pip install -r requirements-hf-to-gguf.txt

模型下载和量化

llama-cpp准备完工,我们开始从自己的百度网盘上下载Chinese-Alpaca-2-7B模型(我很大,你忍一下,哈哈哈)。
我们会部署Chinese-Alpaca-2-7B(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2)模型,具体细节不在今天的文章中,我们先用它。 很多朋友会碰到不能从huggingface下载模型的囧境。可以考虑把这个模型保存到自己的百度网盘中,再用bypy工具下载到自己的服务器。

pip install bypy
bypy info # 认证自己的百度网盘账号,完成认证后,百度网盘上“我的应用数据”下面会出现一个bypy文件夹

请先把https://pan.baidu.com/share/init?surl=Qk3U1LyvMb1RSr5AbiatPw&pwd=bfis保存到自己的百度网盘,然后把模型文件夹移动到百度网盘的bypy目录下,完成后,我们开始下载和量化模型。

mkdir zh-models
cd zh-models
bypy downdir llms/chinese-alpaca-2-7b-hf
cd chinese-alpaca-2-7b-hf
python convert.py zh-models/chinese-alpaca-2-7b-hf/
./quantize ./zh-models/chinese-alpaca-2-7b-hf/ggml-model-f16.gguf ./zh-models/chinese-alpaca-2-7b-hf/ggml-model-q4_0.gguf q4_0

量化完成,让我们启动LLM Server

cd llama-cpp
nohup ./server -m ./zh-models/chinese-alpaca-2-7b-hf/ggml-model-q4_0.gguf -c 512 --host 0.0.0.0 --port 2900  > server.log 2>&1 &

启动成功后,LLM模型的服务地址是 http://your_second_ip:2900(本博是 http://192.168.0.222:2900

总结部分

如果以上步骤你顺利完成了,我们至此会有以下服务:

  1. 语音输入及识别:http://192.168.0.92:8501。用于把语音转换为文字,是实验的入口。
  2. 大模型服务:http://192.168.0.222:2900。以第一步的结果为输入,大模型输出会话结果。
  3. 文字到语音服务:http://192.168.0.92:8090。把第二部的输出文字转换为语音,并且在第一步的界面上播放

附录部分

非Https浏览器禁用麦克风的问题

Chrome浏览器对非Https的链接,现在统统禁用麦克风,解决办法如下:
在Chrome浏览器中输入chrome://flags/#unsafely-treat-insecure-origin-as-secure,然后在"Insecure origins treated as secure"中填入你的地址,例如http://your_ip:8501,这地方的your_ip一般是你第一台服务器的公网IP地址。