概要
发篇文章记录一下最近搞的语音+大模型聊天机器人的搭建过程,供交流学习。有正反馈的话会继续优化。
整体架构流程
注意:借传统的基于RASA的对话机器人的图一用,本博会把NLU(Natural Language Understanding)和 Dialogue Management这两个组件,用大模型来替代。
组件及模型说明:
- 用户通过麦克风输入语音(就是说话,本博是用户对着PC上的麦克风说话)
- STT(Speech-To-Text)模型:语音到文本的转换模型,本博采用开源的wenet模型(https://wenet.org.cn/wenet/python_package.html)
- NLU(Natural Language Understanding)和 Dialogue Management:本博采用Chinese-LLaMA-Alpaca-2(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/llamacpp_zh)
- 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 [email protected]: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 [email protected]: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)
总结部分
如果以上步骤你顺利完成了,我们至此会有以下服务:
- 语音输入及识别:http://192.168.0.92:8501。用于把语音转换为文字,是实验的入口。
- 大模型服务:http://192.168.0.222:2900。以第一步的结果为输入,大模型输出会话结果。
- 文字到语音服务: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地址。