whisper 推理脚本
import argparse import functools import gc import os import evaluate # Hugging Face评估库 import numpy as np import torch from torch.utils.data import DataLoader from tqdm import tqdm # 进度条显示 from transformers import WhisperForConditionalGeneration, WhisperProcessor # Whisper模型核心组件 # 自定义工具模块 from utils.data_utils import DataCollatorSpeechSeq2SeqWithPadding, remove_punctuation, to_simple from utils.reader import CustomDataset # 自定义数据集加载器 from utils.utils import print_arguments, add_arguments # 参数处理工具 # 创建命令行参数解析器 parser argparse.ArgumentParser(description__doc__) add_arg functools.partial(add_arguments, argparserparser) # 简化参数添加 # 添加评估所需的各种参数 add_arg(test_data, typestr, defaultdataset/test.json, help测试集的路径JSON格式) add_arg(model_path, typestr, defaultmodels/whisper-tiny-finetune, help合并模型的路径或者是huggingface上模型的名称) add_arg(batch_size, typeint, default16, help评估的batch size每次处理的音频数量) add_arg(num_workers, typeint, default8, help读取数据的线程数量多进程加载) add_arg(language, typestr, defaultChinese, help设置语言可全称也可简写如果为None则评估的是多语言) add_arg(remove_pun, typebool, defaultTrue, help是否移除标点符号影响评估指标计算) add_arg(to_simple, typebool, defaultFalse, help是否转为简体中文仅中文有效) add_arg(timestamps, typebool, defaultFalse, help评估时是否使用时间戳数据Whisper特有) add_arg(min_audio_len, typefloat, default0.5, help最小的音频长度单位秒过滤太短音频) add_arg(max_audio_len, typefloat, default30, help最大的音频长度单位秒过滤太长音频) add_arg(local_files_only, typebool, defaultTrue, help是否只在本地加载模型不尝试下载) add_arg(using_language_label, typebool, defaultFalse, help是否使用语言标签多语言模型) add_arg(decoder_start_index, typeint, default4, helpdecoder_start_index控制生成起始位置) add_arg(task, typestr, defaulttranscribe, choices[transcribe, translate], help模型的任务转录或翻译) add_arg(metric, typestr, defaultcer, choices[cer, wer], help评估方式字符错误率或词错误率) args parser.parse_args() print_arguments(args) # 打印所有参数配置 # 验证模型路径合法性 assert openai os.path.dirname(args.model_path) or os.path.exists(args.model_path), \ f模型文件{args.model_path}不存在请检查是否已经成功合并模型或者是否为huggingface存在模型 # 指定GPU设备使用第二块GPU device_map cuda:1 def main(): # 模型加载与配置 # 初始化Whisper处理器包含特征提取器分词器 processor WhisperProcessor.from_pretrained( args.model_path, languageargs.language, # 设置目标语言 taskargs.task, # 任务类型转录/翻译 no_timestampsnot args.timestamps, # 是否禁用时间戳 local_files_onlyargs.local_files_only # 仅使用本地文件 ) # 加载预训练模型 model WhisperForConditionalGeneration.from_pretrained( args.model_path, local_files_onlyargs.local_files_only ) # 关键配置调整解决生成问题 print(forced_decoder_ids: , model.config.forced_decoder_ids) # 打印原始强制解码配置 print(model.config.suppress_tokens: , model.config.suppress_tokens) # 打印抑制词配置 # 禁用强制解码规则允许模型自由生成 model.config.forced_decoder_ids None # 清空抑制词列表避免某些字符无法生成 model.config.suppress_tokens [] # 设置模型为评估模式 model.eval() # 将模型移动到指定GPU model model.to(device_map) # 数据准备 # 创建自定义测试数据集 test_dataset CustomDataset( data_list_pathargs.test_data, # 测试集路径 processorprocessor, # 处理器用于特征提取 timestampsargs.timestamps, # 是否包含时间戳 min_durationargs.min_audio_len, # 最小音频时长 max_durationargs.max_audio_len # 最大音频时长 ) print(f测试数据{len(test_dataset)} 条) # 创建数据收集器自动处理padding data_collator DataCollatorSpeechSeq2SeqWithPadding(processorprocessor) # 创建数据加载器 eval_dataloader DataLoader( test_dataset, batch_sizeargs.batch_size, num_workersargs.num_workers, collate_fndata_collator # 使用自定义收集函数 ) # 评估指标初始化 # 加载评估指标CER/字符错误率 或 WER/词错误率 metric evaluate.load(fmetrics/{args.metric}.py) # 模型评估流程 # 遍历测试数据集 for step, batch in enumerate(tqdm(eval_dataloader)): with torch.cuda.amp.autocast(): # 启用混合精度加速 with torch.no_grad(): # 禁用梯度计算评估阶段 # 音频特征处理 input_features batch[input_features].to(device_map) # 文本生成策略 if args.decoder_start_index: # 方案1使用指定数量的起始token如语言标签 print(decoder_start_index: , args.decoder_start_index) # 取labels的前N个token作为解码起始通常包含语言/任务token decoder_input_ids batch[labels][:, :args.decoder_start_index].to(device_map) # 生成文本限制最大255个新token generated_tokens model.generate( input_featuresinput_features, decoder_input_idsdecoder_input_ids, max_new_tokens255 ).cpu().numpy() else: # 方案2完全由模型自主生成起始 print(decoder_start_index: , args.decoder_start_index) generated_tokens model.generate( input_featuresinput_features, max_new_tokens255 ).cpu().numpy() # 真实标签处理 labels batch[labels].cpu().numpy() # 将-100填充标记替换为pad_token_id labels np.where(labels ! -100, labels, processor.tokenizer.pad_token_id) # 文本解码 # 将生成的token ID转为文本保留特殊token用于调试 decoded_preds processor.tokenizer.batch_decode(generated_tokens, skip_special_tokensFalse) # 将真实标签转为文本跳过特殊token decoded_labels processor.tokenizer.batch_decode(labels, skip_special_tokensTrue) # 文本后处理 # 打印原始预测和标签调试用 print(decoded_preds: , decoded_preds) print(decoded_labels: , decoded_labels) # 移除标点符号影响CER/WER计算 if args.remove_pun: decoded_preds remove_punctuation(decoded_preds) decoded_labels remove_punctuation(decoded_labels) # 繁体转简体仅中文 if args.to_simple: decoded_preds to_simple(decoded_preds) decoded_labels to_simple(decoded_labels) # 将处理后的结果添加到评估器 metric.add_batch(predictionsdecoded_preds, referencesdecoded_labels) # 内存管理 # 手动清理中间变量 del generated_tokens, labels, batch gc.collect() # 触发垃圾回收 # 计算最终结果 m metric.compute() # 计算整体错误率 print(f评估结果{args.metric.upper()}{round(m, 5)}) # 格式化输出结果 if __name__ __main__: main()

相关新闻

BUCK电源环路设计避坑指南:从PLECS仿真到DSP实现的5个关键点

BUCK电源环路设计避坑指南:从PLECS仿真到DSP实现的5个关键点

BUCK电源环路设计避坑指南:从PLECS仿真到DSP实现的5个关键点 在数字电源开发的世界里,环路设计常常被视为从理论走向稳定产品的“最后一公里”。许多工程师在仿真中看到完美的伯德图,却在DSP代码烧录后遭遇令人头疼的振荡或响应迟缓。这中间的…

2026/7/5 18:41:37 阅读更多 →
深入解析Linux内核5.4中的Utilization Clamping机制及其在任务调度中的应用

深入解析Linux内核5.4中的Utilization Clamping机制及其在任务调度中的应用

1. 从“一刀切”到“量体裁衣”:为什么我们需要Utilization Clamping? 大家好,我是老K,在Linux内核和性能优化这块摸爬滚打了十几年。今天想和大家聊聊Linux内核5.4版本里一个非常有意思,也特别实用的新机制——Utiliz…

2026/7/5 13:21:36 阅读更多 →
Vue3+Vant4移动端软键盘动态布局适配方案,告别页面错乱!

Vue3+Vant4移动端软键盘动态布局适配方案,告别页面错乱!

1. 移动端软键盘的“隐形杀手” 不知道你有没有遇到过这种情况:在手机上打开自己辛辛苦苦开发的H5页面,一切看起来都挺完美。但是,当用户点开一个输入框,准备输入用户名或者密码的时候,整个页面就像被一只无形的手猛地…

2026/7/5 0:41:54 阅读更多 →

最新新闻

OpenCV 4.8 双目立体匹配实战:BM/SGBM/GC 3种算法在Middlebury数据集上的精度与速度对比

OpenCV 4.8 双目立体匹配实战:BM/SGBM/GC 3种算法在Middlebury数据集上的精度与速度对比

OpenCV 4.8 双目立体匹配实战:BM/SGBM/GC算法在Middlebury数据集上的精度与速度对比双目立体视觉作为三维重建的核心技术之一,其核心挑战在于如何高效准确地计算左右图像间的视差图。OpenCV作为计算机视觉领域的瑞士军刀,提供了Block Matchin…

2026/7/6 0:07:19 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
免费二维码修复工具终极指南:三步拯救损坏二维码

免费二维码修复工具终极指南:三步拯救损坏二维码

免费二维码修复工具终极指南:三步拯救损坏二维码 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾经面对一个损坏的二维码束手无策?模糊、破损、打印质量差的二…

2026/7/5 23:59:17 阅读更多 →
AsrTools:如何用一款开源工具在5分钟内完成专业级语音转文字?

AsrTools:如何用一款开源工具在5分钟内完成专业级语音转文字?

AsrTools:如何用一款开源工具在5分钟内完成专业级语音转文字? 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your au…

2026/7/5 23:57:17 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻