环境:
AI-Sphere-Butler
WSL2
英伟达4070ti 12G
Win10
Ubuntu22.04
python>=3.8
torch>=1.13
torchaudio
问题描述:
AI-Sphere-Butler之Ubuntu服务器如何部署FunASR服务
解决方案:
一、安装
要求
bash
python>=3.8
torch>=1.13
torchaudio
1.创建新的 Conda 环境
bash
conda create --name funas_env python=3.9 -y

2.激活新环境
激活刚刚创建的新环境:
bash
conda activate funas_env
3.更新 pip 和 setuptools
确保 pip 和 setuptools 是最新的:
bash
pip install --upgrade pip setuptools
4.安装 PyTorch (>=1.13) 和 torchaudio
根据需求选择合适的 PyTorch 安装命令。确保安装的 PyTorch 版本不低于 1.13,
对于 GPU 版本(假设 CUDA 11.5):
查看版本nvcc --version
bash
(funas_env) root@ST-202207261848:/mnt/e/work/FunASR# nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Thu_Nov_18_09:45:30_PST_2021
Cuda compilation tools, release 11.5, V11.5.119
Build cuda_11.5.r11.5/compiler.30672275_0
(funas_env) root@ST-202207261848:/mnt/e/work/FunASR#
安装 torch
bash
pip install torch>=1.13 torchvision torchaudio --extra-index-url https://mirrors.aliyun.com/pytorch/wheels/cu115/
查看PyTorch版本
bash
python -c "import torch; print('PyTorch version:', torch.__version__); print('CUDA available:', torch.cuda.is_available()); print('CUDA version:', torch.version.cuda)"
bash
(funas_env) root@ST-202207261848:/mnt/e/work/FunASR# python -c "import torch; print('PyTorch version:', torch.__version__); print('CUDA available:', torch.cuda.is_available()); print('CUDA version:', torch.version.cuda)"
PyTorch version: 2.5.1+cu124
CUDA available: True
CUDA version: 12.4
5.在FunASR目录下进行安装
bash
git clone https://github.com/alibaba/FunASR.git && cd FunASR
pip3 install -e ./

6.在/FunASR/runtime/python/http进行安装依赖
bash
cd /FunASR/runtime/python/http
bash
pip install -r requirements.txt
pip install ffmpeg-python
pip install python-multipart
7.禁用更新
8.启动服务
bash
python server.py

pypi 安装方式
1.pip3 install -U funasr
Or install from source code
或从源代码安装
bash
git clone https://github.com/alibaba/FunASR.git && cd FunASR
pip3 install -e ./
Install modelscope or huggingface_hub for the pretrained models (Optional)
为预训练模型安装 modelscope 或 huggingface_hub(可选)
pip3 install -U modelscope huggingface_hub
2.安装 modelscope 和 funasr
bash
pip install -U modelscope funasr

3.在中国,可以使用国内镜像加速安装:
pip install -U modelscope funasr -i https://mirror.sjtu.edu.cn/pypi/web/simple
bash
git clone https://github.com/alibaba/FunASR.git && cd FunASR
4.安装 Server 的要求
bash
cd runtime/python/websocket
pip install -r requirements_server.txt

5.下载预训练模型:
确保你已经下载了适当的预训练模型,可以从 ModelScope 下载模型,并将其路径配置在启动命令中
bash
https://modelscope.cn/models/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online/files
bash
git clone https://www.modelscope.cn/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online.git

6.安装依赖
bash
cd /FunASR/runtime/python/http
bash
pip install -r requirements.txt
pip install ffmpeg
pip install torch
pip install torchaudio
7.启动 WebSocket 服务器:
使用 funasr_wss_server.py 脚本来启动 WebSocket 服务器。下面是一个简单的启动命令示例,其中指定了端口、使用的 ASR 模型等参数:
bash
python funasr_wss_server.py \
--port 10095 \ # 设置监听的端口号
--asr_model <your_offline_model_name> \ # 离线模式下的 ASR 模型名称
--asr_model_online <your_online_model_name> \ # 在线模式下的 ASR 模型名称(如果需要)
--punc_model <your_punc_model_name> \ # 断句模型名称(可选)
--ngpu 0 \ # 使用 CPU (0) 或 GPU (1)
--ncpu 10 \ # 使用的 CPU 核心数
--certfile <path_to_certfile> \ # SSL 证书文件路径(如果使用 SSL)
--keyfile <path_to_keyfile> # SSL 私钥文件路径(如果使用 SSL)
注意:如果你不需要 SSL 加密,则可以省略 --certfile 和 --keyfile 参数。
./start_funasr_server.sh
bash
#!/bin/bash
python funasr_wss_server.py \
--port 10095 \
--asr_model ./models/damo-speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online \
--ngpu 0 \
--ncpu 10 \
--mode online
验证服务器是否成功启动:
启动后,检查终端输出以确认服务器已成功启动并且正在监听指定的端口。如果没有错误信息,通常意味着服务器准备就绪,等待客户端连接。
bash
根据你提供的模型列表,选择合适的预训练模型来实现用于 API 的离线流式语音识别主要取决于以下几个因素:
### 实时 vs 非实时
- **非实时(离线)**:这种模式通常是指整个音频文件在开始处理之前就已经完全录制完毕。系统会一次性接收完整的音频数据并进行处理。适合于不需要即时反馈的应用场景,如批量处理录音文件。
- **实时(在线/流式)**:在这种模式下,音频数据是分块逐步发送给系统的,系统会在接收到每个数据块后立即开始处理,并尽可能快地返回结果。这非常适合需要即时响应的应用,例如实时语音转文字、电话会议转录等。
对于 **离线流式语音识别**,这意味着你需要一个能够在本地运行的模型(即离线),并且能够处理分段传入的音频数据(即支持流式处理)。因此,你应该选择那些标记为"实时"的模型,因为它们设计用来处理流式输入。
### 推荐模型
基于你的需求,以下是几个推荐的模型:
#### Paraformer 系列
- **Paraformer-large 实时** (`damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online`)
- **特点**:高性能的大规模中文和英文语音识别模型,适用于流式输入。
- **适用场景**:当你需要高精度且支持流式处理的离线语音识别时。
- **Paraformer 实时** (`damo/speech_paraformer_asr_nat-zh-cn-16k-common-vocab8404-online`)
- **特点**:中等大小的模型,适合大多数普通应用场景,同样支持流式输入。
- **适用场景**:如果你希望在性能和资源消耗之间取得平衡,这个模型是一个不错的选择。
#### UniASR 系列
- **UniASR** (`damo/speech_UniASR_asr_2pass-zh-cn-16k-common-vocab8358-tensorflow1-online`)
- **特点**:流式离线一体化模型,支持多种语言,包括中文和英文。
- **适用场景**:特别适合需要同时支持离线和在线识别的情况。
### 如何选择
- **性能要求**:如果你对识别精度有较高要求,并且有足够的计算资源(比如较强的 CPU/GPU),可以选择 `Paraformer-large 实时` 模型。
- **资源限制**:如果计算资源有限,或者你更关心模型的轻量化,那么可以考虑使用 `Paraformer 实时` 或者其他较小的模型。
- **多功能性**:如果你还需要额外的功能,如说话人识别或热词增强,应该查看相关模型是否提供了这些特性。
### 示例启动命令
假设你选择了 `Paraformer-large 实时` 模型,以下是启动 WebSocket 服务器的示例命令:
```bash
python funasr_wss_server.py \
--port 10095 \ # 设置监听的端口号
--asr_model damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online \ # 实时 ASR 模型名称
--ngpu 0 \ # 使用 CPU (0) 或 GPU (1)
--ncpu 4 \ # 使用的 CPU 核心数
--mode online # 流式识别模式
8.总结
为了实现离线流式语音识别,选择一个支持流式处理的"实时"模型是非常重要的。从上面列出的模型中挑选最适合你需求的那个,并按照上述步骤进行配置和启动
客户端测试
Start server 启动服务器
API-reference API 参考
```bash
python funasr_wss_server.py \
--port [port id] \
--asr_model [asr model_name] \
--asr_model_online [asr model_name] \
--punc_model [punc model_name] \
--ngpu [0 or 1] \
--ncpu [1 or 4] \
--certfile [path of certfile for ssl] \
--keyfile [path of keyfile for ssl]
Usage examples 使用示例
bash
python funasr_wss_server.py --port 10095
For the client 对于客户
Install the requirements for client
安装 client 的要求
bash
git clone https://github.com/alibaba/FunASR.git && cd FunASR
cd funasr/runtime/python/websocket
pip install -r requirements_client.txt
If you want infer from videos, you should install ffmpeg
如果你想从视频中推断,你应该安装 ffmpeg
bash
apt-get install -y ffmpeg #ubuntu
# yum install -y ffmpeg # centos
# brew install ffmpeg # mac
# winget install ffmpeg # wins
pip3 install websockets ffmpeg-python
Start client 启动客户端
API-reference API 参考
python funasr_wss_client.py \
--host [ip_address] \
--port [port id] \
--chunk_size ["5,10,5"=600ms, "8,8,4"=480ms] \
--chunk_interval [duration of send chunk_size/chunk_interval] \
--words_max_print [max number of words to print] \
--audio_in [if set, loadding from wav.scp, else recording from mircrophone] \
--output_dir [if set, write the results to output_dir] \
--mode [`online` for streaming asr, `offline` for non-streaming, `2pass` for unifying streaming and non-streaming asr] \
--thread_num [thread_num for send data]
Usage examples 使用示例
ASR offline client ASR 离线客户端
Recording from mircrophone
从麦克风录音
# --chunk_interval, "10": 600/10=60ms, "5"=600/5=120ms, "20": 600/12=30ms
python funasr_wss_client.py --host "0.0.0.0" --port 10095 --mode offline
Loadding from wav.scp(kaldi style)
来自 wav.scp 的 Loding(kaldi 样式)
# --chunk_interval, "10": 600/10=60ms, "5"=600/5=120ms, "20": 600/12=30ms
python funasr_wss_client.py --host "0.0.0.0" --port 10095 --mode offline --audio_in "./data/wav.scp" --output_dir "./results"
ASR streaming client ASR 流式处理客户端
Recording from mircrophone
从麦克风录音
# --chunk_size, "5,10,5"=600ms, "8,8,4"=480ms
python funasr_wss_client.py --host "0.0.0.0" --port 10095 --mode online --chunk_size "5,10,5"
Loadding from wav.scp(kaldi style)
来自 wav.scp 的 Loding(kaldi 样式)
# --chunk_size, "5,10,5"=600ms, "8,8,4"=480ms
python funasr_wss_client.py --host "0.0.0.0" --port 10095 --mode online --chunk_size "5,10,5" --audio_in "./data/wav.scp" --output_dir "./results"
ASR offline/online 2pass client
ASR 离线/在线 2pass 客户端
Recording from mircrophone
从麦克风录音
# --chunk_size, "5,10,5"=600ms, "8,8,4"=480ms
python funasr_wss_client.py --host "0.0.0.0" --port 10095 --mode 2pass --chunk_size "8,8,4"
Loadding from wav.scp(kaldi style)
来自 wav.scp 的 Loding(kaldi 样式)
# --chunk_size, "5,10,5"=600ms, "8,8,4"=480ms
python funasr_wss_client.py --host "0.0.0.0" --port 10095 --mode 2pass --chunk_size "8,8,4" --audio_in "./data/wav.scp" --output_dir "./results"
Websocket api Websocket 接口
# class Funasr_websocket_recognizer example with 3 step
# 1.create an recognizer
rcg=Funasr_websocket_recognizer(host="127.0.0.1",port="30035",is_ssl=True,mode="2pass")
# 2.send pcm data to asr engine and get asr result
text=rcg.feed_chunk(data)
print("text",text)
# 3.get last result, set timeout=3
text=rcg.close(timeout=3)
print("text",text)
要通过 API 调用来使用 FunASR 的流式识别服务,关注 Websocket API 示例确实是关键的一部分。
1. 理解 WebSocket 协议
WebSocket 是一种通信协议,它允许客户端和服务器之间进行全双工通信。这意味着一旦连接建立,双方都可以随时发送数据。对于实时应用(如语音识别),这非常有用,因为它减少了延迟并提高了效率。
2. 使用 Funasr_websocket_recognizer 类
正如你在 Websocket API 示例中看到的,Funasr_websocket_recognizer
类提供了一个简单的方法来与 FunASR WebSocket 服务器交互。以下是这个类的基本使用方法:
python
from funasr.runtime.python.websocket.Funasr_websocket_recognizer import Funasr_websocket_recognizer
# 创建一个识别器实例
rcg = Funasr_websocket_recognizer(
host="127.0.0.1", # 服务器地址
port="30035", # 端口号
is_ssl=False, # 是否使用 SSL 加密
mode="online" # 模式:'online' 表示流式识别
)
# 发送音频数据块给 ASR 引擎,并获取初步结果
text = rcg.feed_chunk(data) # data 应该是 PCM 格式的音频数据
print("初步识别结果:", text)
# 结束会话并获取最终结果
final_text = rcg.close(timeout=3)
print("最终识别结果:", final_text)
3. 准备音频数据
在调用 feed_chunk
方法之前,你需要准备好要发送的音频数据。通常情况下,音频是以 PCM 格式提供的。你可能需要从麦克风录制或从文件读取音频,并将其转换为合适的格式。
4. 处理并发和错误
- 并发处理:如果预期有多个请求同时到达,你应该考虑如何管理并发连接。可以使用多线程或多进程来处理并发。
- 错误处理:确保你的代码中有适当的错误处理机制,以应对可能出现的问题,例如网络中断、服务器响应超时等。
5. 安全性考量
如果你的服务是公开可用的,或者涉及敏感信息,确保采取适当的安全措施。例如,启用 SSL/TLS 加密(设置 is_ssl=True
并提供证书文件路径),并对用户输入进行验证。
6. API 文档和测试
- API 文档:仔细阅读 FunASR 提供的官方 API 文档,了解所有可用的参数及其含义。这将帮助你更好地配置和服务于你的应用场景。
- 测试:在生产环境中部署之前,务必充分测试你的实现,包括边界情况和异常情况下的行为。
7. 持续监控
一旦服务上线,持续监控其性能和稳定性非常重要。可以设置日志记录和报警系统,以便及时发现和解决问题。