掘金 人工智能 07月31日 16:53
长音频离线语音识别系统——基于Whisper.cpp的本地部署方案
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了如何利用OpenAI的Whisper模型及其C++实现Whisper.cpp,在本地环境中实现高效、高保密的语音转文本功能。文章从项目背景出发,阐述了选择本地化方案的原因,并提供了从克隆项目、安装依赖、编译构建到下载模型、格式转换、执行识别的完整技术步骤。同时,针对实际应用中可能遇到的繁体中文输出、中文识别准确度以及长音频识别错误等问题,文章给出了相应的解决方案和优化建议,并提供了一个包含音频预处理(音量增强、降噪、分割)和识别流程的自动化脚本,帮助用户更便捷地处理各类音频文件,满足对数据隐私和处理效率的双重需求。

✅ **Whisper.cpp的高效本地化语音识别能力**:Whisper.cpp作为OpenAI高性能语音识别模型Whisper的C++实现,提供了跨平台、离线运行的优势,特别适合对数据隐私要求高的内部会议记录等场景。其优化后的推理效率,能够显著提升语音转文本的处理速度,且资源占用较低,可部署于各种环境。

🔧 **本地部署Whisper.cpp的详细步骤**:文章提供了从GitHub克隆whisper.cpp仓库、安装CMake和ffmpeg等必要依赖、进行项目构建以生成whisper-cli可执行文件、下载并配置Whisper模型(如medium、large等版本)的完整指南,确保用户能够成功搭建本地语音识别环境。

💡 **解决中文识别及长音频问题的策略**:针对中文识别可能出现的繁体输出问题,可通过添加`--prompt`参数指定简体中文;为提升中文识别准确度,可选用专门的中文模型。对于长音频识别易出现的重复句子问题,可采用`--condition_on_previous_text False`参数或将长音频分割成小片段进行处理,以提高识别的稳定性和准确性。

🚀 **自动化脚本实现音频预处理与识别**:文章提供了一个实用的bash脚本,集成了音频格式转换(16kHz单声道16位WAV)、音量增强、降噪处理以及按指定时长分割音频等预处理步骤。随后,脚本能对分割后的片段进行批量语音识别,并最终合并结果,极大地简化了处理长音频文件的复杂流程,提高了工作效率。

背景

前段时间接到一个任务,需要将老板的会议录音转为文本,方便助理整理会议纪要。由于是内部会议,对内容保密性要求较高,因此不能使用第三方平台的商业化语音识别API,只能通过本地或公司内网部署的模型来实现。

经过调研,公司内部已经部署了ASR(语音识别)模型,并提供了现成的API。但该API仅支持60秒以内的短音频,而我们的会议录音通常长达2小时左右。如果采用分段切割音频、循环调用API、最后合并结果的方案,虽然可行,但实现起来较为复杂且不够高效。

于是,我开始寻找本地化的语音识别方案。在咨询纳米AI上的DeepSeek后,他们推荐了Whisper.cpp,这是一个能在本地高效运行的语音转文本方案,完美符合我们的需求。

本地部署Whisper

1. 简介

Whisper 是 OpenAI 推出的高性能语音识别模型,支持多语言转写。whisper.cpp 是其 C++ 实现版本,优化了推理效率,尤其适合本地部署和低资源环境。

它具有以下优势:

2.克隆Whisper项目

从 GitHub 克隆 whisper.cpp 仓库。终端运行以下命令:

git clone https://github.com/ggerganov/whisper.cpp.git
3.**安装必要依赖 **
4.构建&编译whisper.cpp

在 whisper.cpp 目录中,运行以下命令来构建项目:

cmake -B buildcmake --build build --config Release

完成后会在/build/bin/目录下面 生成一个whisper-cli可执行文件

pic

5.下载Whisper模型

model

whisper.cpp 需要使用预训练的 Whisper 模型进行语音识别。你可以从 OpenAI 提供的链接下载模型文件:

huggingface.co/ggerganov/w…

ggml.ggerganov.com

下载后,将模型文件放到其子目录models中。当然你也可以通过Whisper项目自带的脚本来下载模型

cd whisper.cppbash ./models/download-ggml-model.sh medium

Whisper 提供多个模型版本,主要差异在于参数数量、所需内存、处理速度和识别准确率。以下是各模型的简要对比:

模型版本参数量所需内存相对速度特点
tiny39M~1GB~10x速度快,准确率较低
base74M~1GB~7x平衡速度与准确率
small244M~2GB~4x准确率提升,速度适中
medium769M~5GB~2x高准确率,速度较慢
large1550M~10GB1x最高准确率,速度最慢
turbo809M~6GB~8x与 large 相比,速度提升约 5.4 倍,准确率略有下降

此外,.en 版本的模型专为英语优化,适用于仅处理英语的场景。以-q5 或是 -q8结尾的模型是进行了量化的版本。(量化是通过降低模型参数的位数来减小模型体积和加快处理速度的技术)

具体选择什么模块可以根据自己的电脑配置来选择,我这里选择的是medium版本的模型。

实现语音识别

存在问题

1. 识别后输出的是繁体中文的内容

截屏2025-05-23 14.41.20

这个问题的解决方案,可以通过在命令行后面加prompt参数搞定:

./whisper-cli -m models/ggml-whisper-large-zh-cv11-Q5_0.bin -f output.wav -l zh -t 4 --output-txt --prompt "以下是普通话的句子。"
2. 提升中文内容的识别准确度,使用专门的中文模型

可以通过链接huggingface.co/second-stat…

截屏2025-05-23 14.44.45

3. 长音频文件识别错误

有时候,处理较长的音频文件(> 20 分钟)时,可能会遇到识别错误,导致输出重复的句子。特别是当音频的声音不清晰,存在较长空白、杂音等内容时,就容易出现文本重复出现的问题。例如:

你好,今天天气不错我们一起去海边旅游吧我们一起去海边旅游吧我们一起去海边旅游吧...

解决方案一:

添加参数:–condition_on_previous_text False

--condition_on_previous_text 控制是否在处理一个新音频段(chunk)时,将前一段的识别结果作为上下文传递给当前段落。

解决方案二:

利用ffmpeg将音频资源进行分割,分割成小于20分钟的小片段,针对每个小片段进行语音识别,最后将识别的内容进行拼接。

假设你知道音频总长是 120 秒,你可以执行下面的命令将音频分割为两段60S的分段:

ffmpeg -i input.wav -ss 0 -t 60 output_part1.wavffmpeg -i input.wav -ss 60 -t 60 output_part2.wav

解释:

脚本自动化实现

针对上面长音频文件识别错误的问题,我利用ffmpeg对音频资源进行了识别前的预处理。主要包括下面几个方面:

./voice_whisper.sh 20250419_***.wav ggml-medium-q8_0.bin --volume 5 --no-denoise --split-duration 20

#### 总结以上就是使用Whisper进行语音识别的完整流程,当然除了使用`whisper-cli`进行本地语音识别之外,你可以利用`whisper-server`将其部署为对外的服务。会更多内容可以参考Whisper的项目介绍:https://github.com/openai/whisper

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Whisper.cpp 语音识别 本地部署 OpenAI AI技术
相关文章