实战:一文讲清ASR语音转文本大模型Faster-Whisper部署全过程

作者:种子张:九章云极解决方案专家,从事大数据、人工智能行业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 --versionnvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2023 NVIDIA CorporationBuilt on Mon_Apr__3_17:16:06_PDT_2023Cuda compilation tools, release 12.1, V12.1.105Build 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/pythonroot@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("所有文件处理完成!")

如果您有批量语音文件转成文本,不妨一试,费用也是相对极低的(具体可以联系小客服进行了解)。

<think>嗯,用户想在Linux环境下使用Faster-Whisper实现实时语音文本。首先,我需要了解Faster-Whisper的基本情况。根据引用[2],Faster-WhisperWhisper的优化版本,使用CTranslate2进行加速,支持实时处理。那用户可能需要安装相关的依赖库。 接下来,安装步骤应该包括Python环境、PyTorch以及Faster-Whisper本身。可能需要用pip安装,还要确保有FFmpeg来处理音频输入。然后,用户需要下载模型,通常有tiny、base、small等不同大小的模型,选择适合实时性的模型,比如tiny或base,因为速度更快。 实时处理的关键是音频流的处理,可能需要用到sounddevice库来捕获麦克风输入,然后分块处理。VAD(语音活动检测)可能也很重要,用来检测何时有人说话,减少不必要的处理。代码示例里应该包括循环读取音频数据,换成模型需要的格式,然后调用transcribe方法。 另外,性能优化方面,用户可能需要调整计算类型,比如使用int8来提升速度,或者选择更小的模型。同时,多线程处理可能有助于提高实时性。引用[2]提到Whisper.cpp是C++实现的高性能版本,如果用户对延迟要求极高,可能可以考虑这个,但问题明确提到Faster-Whisper,所以还是以Python方案为主。 用户可能遇到的问题包括安装依赖时的错误,比如缺少libssl-dev或者FFmpeg,需要提醒他们安装这些系统包。还有模型下载可能较慢,可以建议换镜像源。实时处理中的延迟问题,可能需要调整音频块的大小和步长,以及合理使用VAD。 最后,生成相关问题时要考虑用户可能的后续疑问,比如优化延迟、处理背景噪音、与其他工具集成等。确保覆盖安装、配置、性能调优和实际应用场景。</think>以下是在Linux环境下使用Faster-Whisper实现实时语音文本的完整方案: ### 一、环境准备 1. 安装基础依赖: ```bash sudo apt update && sudo apt install -y python3-pip ffmpeg portaudio19-dev libssl-dev ``` 2. 创建虚拟环境: ```bash python3 -m venv whisper_env source whisper_env/bin/activate ``` 3. 安装核心组件: ```bash pip install faster-whisper torch sounddevice ``` ### 二、实时语音处理实现 ```python from faster_whisper import WhisperModel import sounddevice as sd # 初始化模型(使用int8量化加速) model = WhisperModel("tiny", compute_type="int8") # 实时录音参数 SAMPLE_RATE = 16000 CHUNK = 4096 # 每次处理的音频块大小 def transcribe_realtime(): with sd.InputStream(callback=audio_callback, samplerate=SAMPLE_RATE, channels=1, blocksize=CHUNK): print("开始实时录...") while True: pass # 音频处理回调函数 def audio_callback(indata, frames, time, status): segments, info = model.transcribe( audio=indata[:,0], language="zh", vad_filter=True # 启用语音活动检测[^2] ) for seg in segments: print(f"[{seg.start:.2f}s -> {seg.end:.2f}s] {seg.text}") if __name__ == "__main__": transcribe_realtime() ``` ### 三、关键优化参数 1. 模型选择建议: - `tiny`:最低延迟(~32ms),精度较低 - `base`:平衡选择(~65ms) - `small`:高精度(~140ms) 2. 性能调优参数: ```python model.transcribe( ... beam_size=5, # 平衡速度与准确度 temperature=0.5, # 控制输出随机性 condition_on_previous_text=False # 禁用上下文依赖降延迟 ) ``` ### 四、常见问题解决 1. **音频延迟问题**: - 减小`CHUNK`值(最低可设1024) - 使用`nvidia-smi`监控GPU利用率(如果使用GPU加速) - 增加`vad_threshold`过滤背景噪音 2. **模型加载失败**: ```bash # 指定镜像源下载模型 huggingface-cli download --resume-download --cache-dir ./model-cache guillaumekln/faster-whisper-tiny ``` ### 五、扩展应用 结合引用[2]提到的语音克隆技术,可实现: ```python # 伪代码示例:语音克隆+实时录 from cosyvoice import VoiceClone clone_model = VoiceClone("speaker_embedding.pt") cloned_audio = clone_model.generate(text_input) transcribed = model.transcribe(cloned_audio) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值