作者:种子张:九章云极解决方案专家,从事大数据、人工智能行业18年,现从事智算领域工作,公司主要租赁弹性算力,欢迎大家与我交流,转载请注明出处,关注公号:疯聊AI。
摘要:之前我们写了一篇《开源语音TTS与ASR大模型选型指南(2025最新版)》,里边埋了一个伏笔,就是我们的项目是用的哪个ASR大模型,本篇就给大家解密,并给大家分享详细的部署过程,相信大家在这过程中可以学到很多东西。
一、Faster-whisper介绍
faster-whisper是基于OpenAI的Whisper模型的高效实现,它利用CTranslate2,一个专为Transformer模型设计的快速推理引擎。这种实现不仅提高了语音识别的速度,还优化了内存使用效率。faster-whisper的核心优势在于其能够在保持原有模型准确度的同时,大幅提升处理速度,这使得它在处理大规模语音数据时更加高效。faster-whisper是具有完全的 whsiper 模型参数,且自带 VAD加持的 whisper 版本,该版本使用了 CTranslate2 来重新实现 whsiper 模型,CT2 对 transformer 类网络进行了优化,使模型推理效率更高。 相比于 openai/whisper,该实现在相同准确性下速度提高了 4 倍以上,同时使用的内存更少。faster-whisper的技术优势不仅体现在速度上。它还支持8位量化,这一技术可以在不牺牲太多准确度的情况下,进一步减少模型在CPU和GPU上的内存占用。这使得faster-whisper在资源受限的环境中也能高效运行,如在移动设备或嵌入式系统上。
二、Faster-whisper部署要求
我们在项目主页:https://github.com/SYSTRAN/faster-whisper/tree/master首页(即readme.md文件)了解到,最新版本为faster-whipser1.1.1,它有small,large-v2,large-v3,如果在个人电脑上测试,没有GPU或GPU配置低的请选择small,这里我们为了支持生产环境实用,我们不缺GPU资源,因此部署large-v3版本。部署大模型最重要的是要弄清楚其基础环境,比如操作系统、Python、Pytorch、CUDA、cuDNN(深度神经网络库)的版本,特别是Pytorch、CUDA、cuDNN之间的版本是有对应关系的,我们先要确认这个问题,其它的还好。从官网readme.md查一下要求:
可以看出来要求是CUDA12和cuDNN9。安装方法是:pip install faster-whisper,默认安装最新的1.1.1版本。对了,从上图可以看出来如果我们的CUDA为12和cuDNN8,则需将ctranslate2重新安装成4.4.0版本即可,重装命令如下:
pip install --force-reinstall ctranslate2==4.4.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
也可以对照requirements.txt文件来评估环境需求。经分析,得出如下要求:
-
ubuntu 20.04.6 LTS (Focal Fossa)
-
python3.10.14
-
CUDA为12和cuDNN8(此项最重要,其它的问题不大,我们采用降级处理)
-
Faster-whisper1.1.1
工具:Vscode+Aladdin、Docker Desktop(本文默认读者已经安装)
相前知识前提:Python、k8s(初级)、linux。
三、相关概念提前了解
-
智算云服务:本质上是租赁GPU资源的服务(当然GPU不能单独运行,需要配套的CPU、内存、存储、网络资源)
-
虚拟化、池化:就是把大量的硬件资源放到一个池子里,大家按需取用,可选配不同配置的资源。
-
弹性容器集群(vks):基于k8s构建的容器集群,vks:virtual kubenetes service。是运行在Kubernetes集群之上的一个轻量级、可嵌套的Kubernetes环境。它模拟了Kubernetes的核心组件和API服务器,为用户提供了一个独立的、隔离的Kubernetes体验。在物理上,它是嵌套在宿主Kubernetes集群中的,但它为用户呈现了一个完整的Kubernetes集群视图。
-
Pod:Kubernetes中的最小可部署单元,它由一个或多个容器组成。这些容器共享存储、网络和生命周期,并且被调度到同一个Worker节点上运行。Pod是Kubernetes进行资源调度和管理的基本单位。
-
Container(容器):容器是Pod的组成部分,它包含了应用程序及其所需的依赖项、运行时环境等。容器通过容器运行时(如Docker)进行管理,它提供了资源隔离和安全性保障。在Kubernetes中,容器通常是以Docker镜像的形式进行分发和部署的。
-
Image(镜像):一个Docker镜像文件,加载副本到内存中运行,仓库里的镜像不受影响,我们也支持修改后再保存为新的镜像文件(这点好用)。
-
PVC:Pod持载的存储,Pod起来后将CPU、GPU、内存等资源拉起,但不会持久化,需要将文件存到PVC上进行持久化。
-
Aladdin:阿拉丁,九章云极提供的Vscode、Pycharm、cursor插件,方便选资源、配置镜像、在GPU上执行代码(当然CPU上运行也是可以的)。
-
Harbor:私有镜像仓库,为了复用相关程序,通常将它们打成镜像,这些镜像可以在Docker Desktop中运行,也可以在K8s下边的Pod中运行。
四、基于弹性容器集群(GPU)部署Faster-Whipser
这次我们用九章云极智算云以及九章提供的Aladdin插件工具来实现快速部署。智算云服务的本质呢跟原来传统云厂商的虚拟机有点类似,是用k8s容器实现的,更具弹性。如果是在本地,我们运行任何一个程序,需要用到CPU、内存、存储,或者有的需要GPU这些资源,这些资源在物理机通常分别对应的就是一块设备,在云上呢它们被虚拟化(也叫池化)后就可以不按原来的物理存在方式划分或隔离了,就可以弹性配置,例如我需要160核的CPU,它在云上可能来自好几块CPU物理硬件,其它的资源也是类似的。
以下是整个部署的流程图:
(1)注册开通九章智算云服务
注册、开通弹性容器集群vks及存储参见:
https://docs.alayanew.com/docs/documents/quickStart/OpenElasticContainerCluster
我选了1张80G显存的GPU,其实只做测试随便选一块卡就可以了:
存储开通了100G的文件存储和50G的镜像仓库:
(2)安装配置Aladdin(在vscode商店搜索并安装Aladdin即可)
Aladdin(Alaya AI Addin )是九章云极DataCanvas自主研发的IDE插件,专为大模型开发设计。在使用Aladdin之前,用户可能需要了解该产品涉及的概念。本文为用户介绍Aladdin的常用名词和基本概念,以便于用户可以更好地使用Aladdin。
(https://docs.alayanew.com/docs/documents/useGuide/Aladdin/introduction),安装好后左侧工具栏出现以下图示:
(3)镜像打包并上传私有仓库
在Docker Hub或Docker Desktop中搜索pytorch,找到需要的版本,这里我们选了2.3.1-cuda12.1-cudnn8-devel,实际上按官网文档可以选2.4.0-cuda12.1-cudnn9-devel。
在本地新建dockerfile文件(以后安不同的cuda和cudnn版本,可直接修改第三行最后边的内容即可),内容如下:
# 1. 基础镜像(保持CUDA 12.4环境)
#FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/pytorch/pytorch:2.3.1-cuda12.1-cudnn8-devel
# 2. 构建参数与环境变量(修正语法)
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai TIME_ZONE=Asia/Shanghai
# 3. 系统配置优化
RUN sed -i 's|http://ports.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 4. 合并依赖安装并清理缓存(减少层数+体积优化)[1,7](@ref)
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl wget net-tools git cmake poppler-utils \
tesseract-ocr tesseract-ocr-chi-sim libopenblas-dev \
ninja-build build-essential pkg-config tzdata \
openssh-server vim telnet iputils-ping unzip bzip2 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 5. Conda环境配置(合并指令)
RUN mkdir -p /workspace/envs && \
rm -rf /opt/conda/envs && \
ln -s /workspace/envs /opt/conda/envs && \
ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh
ENV PATH=/opt/conda/bin:$PATH
# 6. 初始化Conda(移除冗余操作)
RUN /opt/conda/bin/conda init bash --system && \
conda info --envs
# 7. CUDA路径配置(使用变量避免硬编码)
RUN echo "export PATH=/usr/local/cuda/bin:\$PATH" >> /etc/profile.d/cuda.sh && \
echo "export LD_LIBRARY_PATH=/usr/local/cuda/lib64:\$LD_LIBRARY_PATH" >> /etc/profile.d/cuda.sh && \
chmod +x /etc/profile.d/cuda.sh
# 9. 安全增强(非root用户运行)[8](@ref)
RUN useradd -m appuser && chown -R appuser /workspace
USER appuser
WORKDIR /workspace
通过以下命令进行构建:
在CMD或Powershell中cd到dockerfile的目录后执行build:
docker build -t myapp:latest .
给镜像打Tag(registry.hd-02.alayanew.com:8443/alayanew-cb704eeb-78c9-4c91-af5b-2df031933b10是用户开通的镜像存储地址,可在产品中心-存储管理-镜像仓库-访问页查看,每个人的后边一串内容不一样)
docker tag myapp:latest registry.hd-02.alayanew.com:8443/alayanew-cb704eeb-78c9-4c91-af5b-2df031933b10/myapp:latest
登录Harbor镜像仓库
docker login https://registry.hd-02.alayanew.com:8443/ -u zhangfeng -p Rbbue3fUY0
本地上传镜像文件至Harbor镜像仓库
docker push registry.hd-02.alayanew.com:8443/alayanew-cb704eeb-78c9-4c91-af5b-2df031933b10/myapp:latest
(4)配置Workshop
一个workshop可以理解对应一个pod,在Vscode中登录Aladdin:
登录后进入Workshop管理页:
在WORKSHOP栏右上角点击添加按钮:
配置说明:
选择之前上传的镜像,已经创建的VKS,Namespace选default,创建两个PVC用来放代码和模型文件(这样pod删除后代码和模型文件不会丢失)。
(5)启动workshop验证环境并安装faster-whisper
在需要启动的workshop节点右键点击启动,启动的时候会拉取镜像(第一次时间有点长)
验证Pod中的环境:
查看CUDA版本:
nvcc --version
结果:
root@workshop-2d5943fc-c10c-4136-a38f-82bfeb66265b:~# nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Mon_Apr__3_17:16:06_PDT_2023
Cuda compilation tools, release 12.1, V12.1.105
Build cuda_12.1.r12.1/compiler.32688072_0
查看 cuDNN版本:
cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
结果(8.9.0版本)
root@workshop-2d5943fc-c10c-4136-a38f-82bfeb66265b:~# cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 9
#define CUDNN_PATCHLEVEL 0
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)
Ctrl+Shift+P调出Python解释器选择菜单,选择需要的Python版本,这里我们选了。
确保Python与pip路径在同一目录下。
root@workshop-2d5943fc-c10c-4136-a38f-82bfeb66265b:~# which python
/opt/conda/bin/python
root@workshop-2d5943fc-c10c-4136-a38f-82bfeb66265b:~# which pip
/opt/conda/bin/pip
安装faster-whisper
pip install faster-whisper -i
https://pypi.tuna.tsinghua.edu.cn/simple
注意我们的cuDNN是8,需要对ctranslate2进行降级处理:
pip install --force-reinstall ctranslate2==4.4.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
因为我们在Pod里修改了镜像文件里的内容(例如安装了faster-whipser),需要将这个Pod再存为新的镜像:
在workshop列表中,右键当前这个节点,点击Save Env,在右边选择环境节点:
输入环境名称,回车,可以与现有的相同,也可以不同:
输入Tag:
回车。
上传完成,选择Yes。
(6)上传模型文件
将模型文件上传到model目录下(这是挂载存储哦,Pod删除后这个存储不会删除,而且不同Pod之间可共享这个存储)。
可以先本地下载https://huggingface.co/Systran/faster-whisper-large-v3/tree/main模型文件,再传到model目录下,也可以用model scope的工具下载,请自行网上查找方法。
(7)编写测试代码
从官网Copy以下代码:
from faster_whisper import WhisperModel
'''
local_files_only=True 表示加载本地模型
model_size_or_path=path 指定加载模型路径
device="cuda" 指定使用cuda
compute_type="int8_float16" 量化为8位
language="zh" 指定音频语言
vad_filter=True 开启vad
vad_parameters=dict(min_silence_duration_ms=1000) 设置vad参数
'''
# Run on GPU with FP16
#model = WhisperModel(r'D:\Mycode\TTS_ASR\faster-whisper-master\model\small', device="cuda", compute_type="float16")
# or run on GPU with INT8
# model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")
# or run on CPU with INT8
model = WhisperModel(r'/model/faster-whisper-large-v3', device="cuda", compute_type="int8_float16")
segments, info = model.transcribe(r"/root/test1.mp3", language='zh' ,beam_size=5, initial_prompt="请用简体中文输出,这里随便写点简体中文,我是种子张,请关注九章智算云公众号")#,vad_filter=True, vad_parameters=dict(min_silence_duration_ms=1000))
print("Detected language '%s' with probability %f" % (info.language, info.language_probability))
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
上传一个有人声的mp3文件做测试。
注意,我们本次用GPU执行。
(7)用GPU执行代码
在python文件中右键,选择GPU RUN:
选择环境(注意,这里要选择GPU和最新的镜像),点击Submit。
查看结果:
至此,我们的整个过程结束了,感兴趣的小伙伴们可以自行去试用一下,www.alayanew.com。
问题来了:
(1)效果咋样?
这么说吧,官方说的中文语音转文本准确率在95%,我自己测试应该更高一些,估计到了98%,主要是一些专业术语或语音不清楚或同音词的地方存在错误,将输出的文字稿交给文字大模型纠错就可以了。速度方面用GPU也是极快的。
(2)我想实现批量操作如何处理?
将想要转成文本的mp3文件批量上传至服务器运行以下代码:
from faster_whisper import WhisperModel
import os
# 初始化模型 - 使用更小的模型或调整参数以适应大文件
# model = WhisperModel(r'/model/faster-whisper-large-v3', device="cuda", compute_type="int8_float16")
# 改为使用中等大小的模型(如果有的话)或调整参数
model = WhisperModel(r'/model/faster-whisper-large-v3', device="cuda", compute_type="int8_float16")
# 输入和输出目录
input_dir = r"/root/mp3" # MP3文件所在目录
output_dir = r"/root/txt_output" # 输出TXT文件的目录
# 确保输出目录存在
os.makedirs(output_dir, exist_ok=True)
# 转录参数 - 调整这些参数可能有助于改善结果
language = 'zh'
beam_size = 5
initial_prompt = "请用简体中文输出,这里随便写点简体中文,我是种子张,请关注九章智算云公众号"
vad_filter = True # 启用VAD
vad_parameters = dict(
min_silence_duration_ms=500, # 减小静音阈值
speech_pad_ms=300 # 增加语音填充
)
# 遍历输入目录中的所有MP3文件
for filename in os.listdir(input_dir):
if filename.lower().endswith('.mp3'):
mp3_path = os.path.join(input_dir, filename)
# 构造对应的输出TXT文件路径
txt_filename = os.path.splitext(filename)[0] + '.txt'
txt_path = os.path.join(output_dir, txt_filename)
print(f"正在处理文件: {mp3_path}")
try:
# 转录音频文件 - 添加分段处理
segments, info = model.transcribe(
mp3_path,
language=language,
beam_size=beam_size,
initial_prompt=initial_prompt,
vad_filter=vad_filter,
vad_parameters=vad_parameters
)
print(f"检测到的语言: '{info.language}',概率: {info.language_probability:.4f}")
# 将转录结果写入TXT文件
with open(txt_path, 'w', encoding='utf-8') as f:
for segment in segments:
text = segment.text.strip()
if text: # 只写入非空文本
f.write(f"[{segment.start:.2f}s -> {segment.end:.2f}s] {text}\n")
print(f"转录完成,结果已保存到: {txt_path}\n")
except Exception as e:
print(f"处理文件 {mp3_path} 时出错: {str(e)}")
# 可以在这里添加错误处理逻辑,如跳过该文件或记录错误
print("所有文件处理完成!")
如果您有批量语音文件转成文本,不妨一试,费用也是相对极低的(具体可以联系小客服进行了解)。