当前位置: 首页 > news >正文

Qwen3-ASR-1.7B代码实例:Python调用本地模型实现批量音频转文字脚本

Qwen3-ASR-1.7B代码实例:Python调用本地模型实现批量音频转文字脚本

你是不是也遇到过这样的烦恼?手头有一堆会议录音、访谈音频或者视频素材,需要把它们整理成文字稿。手动听写?效率太低。用在线工具?又担心隐私泄露,而且文件一多,上传下载也麻烦。

今天,我就带你用Python写一个脚本,直接在你自己的电脑上,调用强大的Qwen3-ASR-1.7B语音识别模型,实现批量音频转文字。整个过程完全本地运行,你的音频数据不会离开你的电脑,安全又高效。这个1.7B版本的模型,相比之前更小的版本,在处理复杂的长句子、中英文混合内容时,准确率有了质的飞跃。

这篇文章,我会手把手教你从环境搭建到代码编写,最后实现一个能处理文件夹里所有音频文件的实用脚本。即使你之前没怎么接触过语音识别,跟着步骤走,也能轻松搞定。

1. 项目与环境准备

在开始写代码之前,我们需要先把“舞台”搭好。这包括安装必要的软件库,以及准备好核心的语音识别模型。

1.1 核心工具介绍

我们这次的主角是Qwen3-ASR-1.7B。你可以把它理解为一个非常聪明的“耳朵”和“大脑”的结合体。它专门负责听音频,然后把听到的内容转换成文字。这个“1.7B”指的是它有17亿个参数,可以简单理解为它的“知识量”和“理解能力”达到了一个很强的水平,特别擅长处理那些句子很长、结构复杂或者中英文夹杂的语音。

整个工作流程会依赖几个关键的Python库:

  • Transformers:这是由Hugging Face提供的宝库,我们通过它来加载和使用Qwen3-ASR模型。
  • Torch (PyTorch):这是模型运行的计算引擎,尤其是如果你有NVIDIA显卡,它能利用GPU大大加快识别速度。
  • SoundFile / Librosa:这些是音频处理库,负责读取你硬盘上的MP3、WAV等各种格式的音频文件,并把它们转换成模型能理解的数字信号。

1.2 一步到位:环境安装

打开你的终端或命令提示符,我们用一个命令把需要的包都安装好。建议先创建一个独立的Python虚拟环境,避免包版本冲突。

# 安装核心依赖 pip install transformers torch soundfile librosa

如果你的电脑有NVIDIA显卡,并且已经安装了CUDA,那么torch会自动安装GPU版本。安装完成后,你可以通过下面的代码快速验证一下主要库是否就绪:

import torch print(f"PyTorch版本: {torch.__version__}") print(f"GPU是否可用: {torch.cuda.is_available()}") if torch.cuda.is_available(): print(f"GPU设备: {torch.cuda.get_device_name(0)}")

2. 编写批量转写脚本

环境准备好后,我们就可以动手编写核心脚本了。我们的目标是:指定一个文件夹,脚本能自动找出里面所有的音频文件,然后逐个转写成文字,并把结果保存下来。

2.1 脚本核心代码

创建一个新的Python文件,比如叫做batch_asr.py,然后把下面的代码复制进去。我会逐段为你解释。

import os from pathlib import Path import torch from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor import soundfile as sf import librosa class BatchAudioTranscriber: """ 批量音频转文字工具类 基于 Qwen3-ASR-1.7B 模型 """ def __init__(self, model_name="Qwen/Qwen3-ASR-1.7B", device="cuda"): """ 初始化转写器,加载模型和处理器 Args: model_name: 模型名称,默认为 Qwen3-ASR-1.7B device: 推理设备,cuda 或 cpu """ print(f"正在加载模型 {model_name}...") # 自动选择设备,如果指定了cuda但不可用,则回退到cpu if device == "cuda" and not torch.cuda.is_available(): print("警告:CUDA不可用,将使用CPU进行推理(速度较慢)") device = "cpu" self.device = device self.torch_dtype = torch.float16 if device == "cuda" else torch.float32 # 加载模型和处理器 self.model = AutoModelForSpeechSeq2Seq.from_pretrained( model_name, torch_dtype=self.torch_dtype, low_cpu_mem_usage=True, use_safetensors=True ).to(self.device) self.processor = AutoProcessor.from_pretrained(model_name) print("模型加载完成!") def transcribe_audio(self, audio_path): """ 转写单个音频文件 Args: audio_path: 音频文件路径 Returns: str: 识别出的文本 """ try: # 使用librosa加载音频,自动重采样到模型需要的16kHz speech_array, sampling_rate = librosa.load(audio_path, sr=16000, mono=True) # 准备模型输入 inputs = self.processor( audio=speech_array, sampling_rate=sampling_rate, return_tensors="pt" ).to(self.device, dtype=self.torch_dtype) # 生成识别结果 with torch.no_grad(): generated_ids = self.model.generate(**inputs, max_new_tokens=1024) # 解码识别结果 transcription = self.processor.batch_decode( generated_ids, skip_special_tokens=True )[0] return transcription except Exception as e: print(f"处理文件 {audio_path} 时出错: {e}") return None def transcribe_folder(self, folder_path, output_file="transcriptions.txt"): """ 批量转写文件夹内的所有音频文件 Args: folder_path: 包含音频文件的文件夹路径 output_file: 输出文本文件路径 """ folder = Path(folder_path) # 支持的音频格式 audio_extensions = {'.wav', '.mp3', '.m4a', '.ogg', '.flac', '.aac'} # 查找所有音频文件 audio_files = [] for ext in audio_extensions: audio_files.extend(folder.glob(f"*{ext}")) audio_files.extend(folder.glob(f"*{ext.upper()}")) if not audio_files: print(f"在文件夹 {folder_path} 中未找到支持的音频文件") return print(f"找到 {len(audio_files)} 个音频文件,开始批量转写...") results = [] for i, audio_file in enumerate(audio_files, 1): print(f"[{i}/{len(audio_files)}] 正在处理: {audio_file.name}") transcription = self.transcribe_audio(str(audio_file)) if transcription: results.append({ 'file': audio_file.name, 'text': transcription }) print(f" 转写成功: {transcription[:100]}...") # 只打印前100字符预览 else: print(f" 转写失败") # 保存结果到文件 self._save_results(results, output_file) print(f"\n批量转写完成!结果已保存至: {output_file}") def _save_results(self, results, output_file): """将转写结果保存到文本文件""" with open(output_file, 'w', encoding='utf-8') as f: for item in results: f.write(f"文件: {item['file']}\n") f.write(f"转写内容:\n{item['text']}\n") f.write("-" * 50 + "\n\n") # 使用示例 if __name__ == "__main__": # 初始化转写器,自动使用GPU(如果可用) transcriber = BatchAudioTranscriber(device="cuda") # 指定你的音频文件夹路径 audio_folder = "./my_audio_files" # 修改为你的文件夹路径 # 开始批量转写 transcriber.transcribe_folder(audio_folder, output_file="转写结果.txt")

2.2 代码要点解析

这段代码看起来有点长,但其实结构很清晰,主要分为三个部分:

  1. 初始化 (__init__):就像打开一个工具箱,这里负责把Qwen3-ASR模型这个“核心工具”从网上下载并加载到你的电脑内存或显卡里。torch_dtype=torch.float16这个设置是为了在GPU上节省显存,让1.7B的大模型也能在消费级显卡上运行。

  2. 单文件转写 (transcribe_audio):这是核心的“工作单元”。它做三件事:

    • 读取音频:用librosa库读取文件,并统一转换成模型需要的格式(单声道,16000Hz采样率)。
    • 送入模型:把处理好的音频数据喂给模型。
    • 输出文字:把模型“思考”后产生的文字解码出来。
  3. 批量处理 (transcribe_folder):这是脚本的“大脑”。它会自动扫描你指定文件夹里所有常见格式的音频文件(如.mp3, .wav等),然后一个一个地调用上面的“工作单元”进行处理,最后把所有结果整理好,保存到一个文本文件里。

3. 运行与实战演示

脚本写好了,我们来让它真正跑起来,看看效果。

3.1 准备音频并运行脚本

首先,在你放batch_asr.py脚本的同一个目录下,创建一个名为my_audio_files的文件夹(或者你也可以在代码里修改audio_folder变量指向任何已有的文件夹)。然后,放几个你想要转写的音频文件进去,比如meeting.mp3interview.wav

接着,在终端里运行这个脚本:

python batch_asr.py

你会看到类似下面的输出,这表明模型正在加载和运行:

正在加载模型 Qwen/Qwen3-ASR-1.7B... 模型加载完成! 找到 3 个音频文件,开始批量转写... [1/3] 正在处理: meeting.mp3 转写成功: 好的,我们开始今天的周会。首先回顾一下上周各项目的进展。小李,你先说一下A客户那边的情况... [2/3] 正在处理: interview.wav 转写成功: Q: Could you briefly introduce your research background? A: Sure. My research primarily focuses on... [3/3] 正在处理: presentation.m4a 转写成功: 接下来我们看第三季度的数据报表。从chart上可以明显看出,我们的用户增长率在七月份达到了一个peak... 批量转写完成!结果已保存至: 转写结果.txt

3.2 查看与使用结果

处理完成后,脚本会在当前目录生成一个转写结果.txt文件。用记事本或任何文本编辑器打开它,你会看到结构清晰的转写内容:

文件: meeting.mp3 转写内容: 好的,我们开始今天的周会。首先回顾一下上周各项目的进展。小李,你先说一下A客户那边的情况... -------------------------------------------------- 文件: interview.wav 转写内容: Q: Could you briefly introduce your research background? A: Sure. My research primarily focuses on... --------------------------------------------------

这个文件就是你的最终成果。你可以直接复制里面的文字到文档里编辑,或者用于其他分析。整个过程,你的音频数据从未离开过你的电脑。

4. 进阶技巧与问题排查

基本的脚本能工作后,我们再来看看如何让它更好用,以及遇到问题怎么办。

4.1 让脚本更实用:添加进度与格式支持

最初的脚本已经能用,但我们可以稍作改进,让它更友好。比如,增加一个进度条,并且更灵活地处理各种音频格式。你可以用Python的tqdm库来添加进度条。

pip install tqdm

然后修改transcribe_folder方法中的循环部分:

from tqdm import tqdm # ... 在 transcribe_folder 方法内,替换原来的for循环 ... print(f"找到 {len(audio_files)} 个音频文件,开始批量转写...") results = [] for audio_file in tqdm(audio_files, desc="转写进度"): transcription = self.transcribe_audio(str(audio_file)) if transcription: results.append({'file': audio_file.name, 'text': transcription}) # ... 后续保存代码不变 ...

4.2 常见问题与解决方法

在运行过程中,你可能会遇到下面几个常见问题:

  • 问题:显存不足 (CUDA out of memory)

    • 原因:1.7B模型在GPU上运行需要约4-5GB显存。如果你的显卡显存较小(比如只有4GB),可能会报错。
    • 解决:在初始化BatchAudioTranscriber时,将device参数改为"cpu"。虽然速度会慢一些,但肯定能运行。
      transcriber = BatchAudioTranscriber(device="cpu") # 强制使用CPU
  • 问题:无法加载模型或下载太慢

    • 原因:第一次运行需要从Hugging Face下载模型文件(约3.4GB),如果网络不好会失败或很慢。
    • 解决
      1. 使用国内镜像源,在运行脚本前设置环境变量:
        # Linux/macOS export HF_ENDPOINT=https://hf-mirror.com # Windows (命令行) set HF_ENDPOINT=https://hf-mirror.com
      2. 或者,在代码中指定镜像地址(需要修改 transformers 的下载逻辑,较为复杂,优先推荐方法1)。
  • 问题:某些音频文件识别效果差

    • 原因:音频质量太差(如背景噪音大、说话人距离麦克风远)、方言口音重、或语速过快。
    • 解决:对于重要的音频,可以先用音频编辑软件(如Audacity)进行降噪、音量标准化等预处理。Qwen3-ASR-1.7B对清晰、标准的普通话和英语支持最好。

5. 总结

通过这个项目,我们完成了一个非常实用的本地批量音频转文字工具。回顾一下整个过程和要点:

  1. 核心价值:我们利用Qwen3-ASR-1.7B这个强大的本地语音识别模型,实现了隐私安全、离线可用、批量高效的音频转文字功能。它特别适合处理需要保密的会议录音、大量的访谈素材或个人视频字幕制作。

  2. 关键步骤:整个过程分为三步——安装环境编写脚本运行处理。脚本的核心是一个类,它封装了模型加载、单文件转写和批量处理的所有逻辑,结构清晰,易于理解和修改。

  3. 效果优势:1.7B版本模型在长句子、复杂逻辑和中英文混合场景下的识别准确率显著优于更小的版本,生成的文本标点更合理,语义更连贯,实用性大大增强。

  4. 灵活扩展:这个脚本只是一个起点。你可以基于它轻松地扩展出更多功能,比如:

    • 将结果自动保存为Word或Excel格式。
    • 增加对视频文件(提取音频)的支持。
    • 开发一个带有图形界面的小软件。
    • 将转写服务集成到你的其他自动化工作流中。

最重要的是,整个流程完全在本地完成,你完全掌控自己的数据。希望这个脚本能成为你处理音频资料的高效助手。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.jsqmd.com/news/499320/

相关文章:

  • 抖音视频批量下载终极指南:3分钟搞定合集批量保存
  • GLM-OCR在计算机组成原理教学中的应用:自动识别电路图符号与说明
  • 风电功率预测避坑指南:TFT和N-HiTS模型在极端天气下的表现对比
  • 零基础国产GD32单片机编程入门(六)OLED动态显示与菜单设计实战
  • LED点阵驱动方案对比:为什么我最终选择了SM16306+74HC595D组合
  • RTL8367RB电路设计避坑指南:4层板千兆交换机信号完整性的5个关键细节
  • lychee-rerank-mm环境配置:Ubuntu 22.04 + CUDA 12.1 + PyTorch 2.3适配清单
  • 瑞芯微RK1126实战:用HTTP接口搞定ISP参数调优(附完整代码)
  • 2026双分子泵氦质谱检漏仪优质品牌推荐榜:氦检仪、氦气回收及提纯系统、真空箱检漏系统、移动式氦质谱检漏仪、双分子泵氦质谱检漏仪选择指南 - 优质品牌商家
  • SOONet部署标准化:Ansible Playbook一键部署至多台GPU服务器
  • 3分钟快速上手:抖音视频批量下载终极指南
  • 2026年口碑好的农村改造玻璃钢化粪池公司推荐:玻璃钢化粪池一体成型精选厂家 - 品牌宣传支持者
  • Qwen3-8B快速部署攻略:消费级GPU也能流畅运行的高性价比AI助手
  • 重装系统后一站式恢复AI开发环境:以水墨江南模型为例
  • Parse12306:构建全国高速列车数据采集系统的技术实现
  • Qwen3-0.6B-FP8作品集:轻量模型在法律条文摘要、医疗问答表现
  • Python数学建模从入门到实战:5本必读书籍推荐(附避坑指南)
  • 从零开始理解RC电路:硬件工程师的实用指南(含实例分析)
  • 汽车制造适用WF屋顶轴流风机厂家推荐榜:C1-6PB阿波罗APOLLO遥控器/C1-8PB阿波罗APOLLO遥控器/选择指南 - 优质品牌商家
  • FLUX.1创意应用:基于Qt的跨平台创作工具开发
  • 2026合肥有实力家具搬家公司推荐榜:合肥长途搬家公司、合肥附近搬家公司、合肥仓库搬家公司、合肥写字楼搬家公司选择指南 - 优质品牌商家
  • Volatility2实战指南:5个必学命令快速分析Windows内存取证(附真实案例)
  • Zemax OpticStudio通过C++编程动态调整Zernike面型参数
  • 2026年科特迪瓦电子货物跟踪单机构评测报告:布基纳法索电子货物跟踪单/科特迪瓦电子货物跟踪单/苏丹电子货物跟踪单/选择指南 - 优质品牌商家
  • Python离线安装包实战:如何为不同操作系统和Python版本定制你的安装包
  • 从零到一:手把手教你用Overleaf驾驭ACM官方模板
  • GD32实战:NAND Flash的ECC校验与坏块管理避坑指南
  • 从0到1:老设备复活计划——用OpenCore Legacy Patcher实现老Mac系统升级
  • 在IsaacLab中为Unitree H1_2配置强化学习任务环境:从资产导入到训练启动
  • Qwen3-ASR-1.7B效果展示:韩语KOL视频→中文字幕同步生成