快速构建语音数据集FireRedASR Pro批量处理脚本编写与Label Studio对接如果你正在为语音识别项目准备训练数据面对堆积如山的原始音频文件手动转写和校对的工作量无疑是巨大的。传统的纯人工标注方式不仅耗时耗力成本高昂而且难以保证数据质量的一致性。我们团队在经历了初期的“人海战术”后摸索出了一套高效的自动化解决方案核心就是利用FireRedASR Pro进行批量预识别再通过Label Studio进行高效的人工校对。今天我将手把手带你搭建这套“人机协作”的语音数据标注流水线。你将学会如何编写脚本让FireRedASR Pro自动处理成百上千个音频文件并如何将这些初步结果无缝导入Label Studio让标注员的工作从“从零打字”变为“校对修改”效率提升立竿见影。1. 自动化标注流水线为什么是“人机协作”的最佳实践在深入技术细节之前我们先明确一个核心理念让机器做它擅长的事让人做机器做不好的事。对于语音数据标注机器ASR模型擅长快速、不知疲倦地将声音信号转化为文本完成基础的“听写”工作。但它可能在人名、专业术语、背景嘈杂或口音独特的片段上出错。而人类擅长理解上下文、辨析模糊语音、处理专业领域知识。因此最理想的流程是机器初筛用高性能ASR模型如FireRedASR Pro对全部音频进行第一轮转写生成带有时间戳的文本草稿。这一步速度极快能完成约70%-80%的基础工作。人工精修标注员在友好的工具界面如Label Studio中对照音频审阅机器生成的草稿只专注于修改错误、补充遗漏、标记特殊片段。这极大地提升了人的工作效率和专注度。这套流程的价值在于效率倍增标注员无需从空白文档开始工作重心从“打字”转向“审校”单位时间处理量可提升数倍。成本可控减少了对大量初级标注员的依赖资深人员可以专注于质量把控和复杂案例处理。质量一致机器提供的初稿在一定程度上统一了转写风格如数字、缩写格式减少了不同标注员之间的差异。流程可追溯每一步都有记录便于问题回溯和质量评估。接下来我们就从零开始构建这条流水线。2. 工具链全景与准备工作我们的流水线主要由两个核心工具构成它们通过我们编写的脚本连接起来。FireRedASR Pro作为“自动预识别引擎”。我们通过调用其API实现音频的批量转写。Label Studio作为“人工校对与标注平台”。我们向其导入音频和预识别文本为标注员提供高效的校对界面。在开始之前请确保你已经完成以下准备部署FireRedASR Pro假设你已通过CSDN星图镜像广场或其他方式成功部署了FireRedASR Pro服务并知道其API访问地址例如http://your-server-ip:8502。安装Label Studio在标注人员使用的机器或服务器上安装Label Studio。整理音频数据将你需要标注的原始音频文件集中放在一个文件夹内。建议使用WAV、FLAC、MP3等通用格式。为了示例清晰我们假设目录结构如下/datasets/raw_audio/ ├── session_001.wav ├── session_002.mp3 ├── interview_003.flac └── ...3. 第一步编写FireRedASR Pro批量处理脚本我们的第一个目标是让FireRedASR Pro自动处理raw_audio文件夹下的所有文件。我们需要编写一个Python脚本其核心任务是遍历文件夹 - 调用API - 保存结果。3.1 脚本核心单个音频识别函数首先我们定义一个函数用于处理单个音频文件。你需要根据你的FireRedASR Pro API的实际参数进行调整。import os import requests import json import time from pathlib import Path # 配置部分 请根据你的实际情况修改 # 1. FireRedASR Pro 服务地址 ASR_API_URL http://localhost:8502/v1/audio/transcriptions # 替换为你的实际API地址 # 2. 你的原始音频文件夹路径 RAW_AUDIO_DIR Path(/datasets/raw_audio) # 3. 预识别结果输出文件夹路径 PRELABEL_OUTPUT_DIR Path(./prelabel_results) PRELABEL_OUTPUT_DIR.mkdir(parentsTrue, exist_okTrue) # def transcribe_single_audio(file_path): 调用FireRedASR Pro API识别单个音频文件。 返回识别结果的JSON字典失败则返回None。 try: with open(file_path, rb) as f: files {file: f} # 注意根据你的API文档可能需要传递其他参数如‘model’, ‘language’等 data {model: fireredasr-pro} print(f 正在发送请求: {file_path.name}) response requests.post(ASR_API_URL, filesfiles, datadata, timeout60) response.raise_for_status() # 如果状态码不是200抛出异常 result response.json() print(f 识别成功。) return result except requests.exceptions.RequestException as e: print(f 请求失败: {e}) return None except json.JSONDecodeError as e: print(f 响应解析失败: {e}) return None3.2 脚本主体批量处理与结果保存接下来编写主函数来遍历目录并保存结构化的结果。def batch_transcribe_audio(): 批量处理原始音频目录中的所有支持文件 # 支持的文件扩展名 SUPPORTED_EXT (.wav, .mp3, .flac, .m4a, .ogg, .aac) audio_files [f for f in RAW_AUDIO_DIR.iterdir() if f.suffix.lower() in SUPPORTED_EXT] if not audio_files: print(f在目录 {RAW_AUDIO_DIR} 中未找到支持的音频文件。) return print(f开始批量处理共找到 {len(audio_files)} 个音频文件。) for idx, audio_file in enumerate(audio_files, 1): print(f[{idx}/{len(audio_files)}] 处理文件: {audio_file.name}) # 调用识别函数 asr_result transcribe_single_audio(audio_file) if asr_result: # 构建输出文件路径使用相同的文件名后缀改为.json output_file PRELABEL_OUTPUT_DIR / f{audio_file.stem}.json # 在结果中补充原始音频文件名信息方便后续追溯 asr_result[metadata] { original_filename: audio_file.name, processed_time: time.strftime(%Y-%m-%d %H:%M:%S) } # 保存结果为JSON文件 with open(output_file, w, encodingutf-8) as f: json.dump(asr_result, f, ensure_asciiFalse, indent2) print(f 结果已保存至: {output_file}\n) else: print(f 文件 {audio_file.name} 处理失败已跳过。\n) # 建议添加短暂延迟避免对服务器造成瞬时压力 time.sleep(0.5) print(批量预识别任务全部完成) if __name__ __main__: batch_transcribe_audio()运行这个脚本后你会在prelabel_results文件夹下得到一系列.json文件。每个文件都包含了对应音频的识别文本、可能的时间戳信息以及元数据。这就是我们流水线的“中间产品”。4. 第二步配置Label Studio项目与数据导入现在我们需要将“中间产品”音频预识别文本导入到Label Studio中为人工校对做好准备。4.1 启动并初始化Label Studio项目首先在标注服务器上安装并启动Label Studio。# 安装 pip install label-studio # 初始化并启动一个项目项目根目录为 ./my_asr_labeling label-studio start my_asr_labeling --init执行命令后按照终端提示在浏览器中打开Label Studio通常是http://localhost:8080完成初始用户注册。4.2 创建语音转写校对模板在Label Studio的Web界面中创建一个新项目例如命名为ASR_Dataset_Refinement。 最关键的一步是配置“标签设置”Labeling Interface。我们需要一个包含音频播放器和可编辑文本域的模板。将以下代码粘贴到“Code”编辑器中View Header value语音转写校对任务/ Audio nameaudio value$audio_url hotkeyctrlenter/ Header value转写文本请根据音频内容进行校对和修改/ TextArea nametranscription toNameaudio rows8 editabletrue transcriptiontrue placeholder请在此处编辑文本... maxSubmissions1/ /View这个模板提供了音频播放控件和一个可编辑的文本框标注员可以边听边改。4.3 编写数据转换与导入脚本Label Studio需要特定格式的JSON文件来导入任务和预标注。我们需要编写一个脚本将prelabel_results中的JSON文件与原始音频关联起来并转换成Label Studio能识别的格式。假设你的音频文件可以通过一个URL访问例如上传到了Label Studio本机或某个静态文件服务器。如果音频在Label Studio服务器本地通常需要先通过Label Studio的UI上传音频或者将其放在Label Studio可访问的目录下。以下脚本生成一个包含“预标注”的导入文件import json from pathlib import Path # 配置部分 请根据你的实际情况修改 # 预识别结果目录 PRELABEL_DIR Path(./prelabel_results) # 音频文件访问的基础URL或路径根据你的部署方式调整 # 情况1音频已上传至Label Studio使用/data/upload/filename格式 # 情况2音频可通过网络URL直接访问 AUDIO_BASE_PATH /data/upload # 或 http://your-file-server/audios # 输出给Label Studio的导入文件 LS_IMPORT_FILE Path(./tasks_with_predictions.json) # def create_label_studio_tasks(): 将预识别结果转换为Label Studio任务格式 tasks [] # 获取所有预识别结果文件 json_files list(PRELABEL_DIR.glob(*.json)) for json_file in json_files: with open(json_file, r, encodingutf-8) as f: asr_data json.load(f) # 从元数据或文件名推断原始音频文件名 original_filename asr_data.get(metadata, {}).get(original_filename, json_file.stem) # 假设音频文件扩展名是.wav如果不是请调整 audio_filename f{Path(original_filename).stem}.wav # 构建音频在Label Studio中的访问路径 # 这里需要你根据实际情况确定音频的最终存储位置和访问方式 audio_url_or_path f{AUDIO_BASE_PATH}/{audio_filename} # 提取识别文本字段名‘text’需根据FireRedASR Pro实际返回结构调整 predicted_text asr_data.get(text, ) # 构建一个Label Studio任务Task task { data: { audio: audio_url_or_path, # Label Studio将通过这个字段加载音频 filename: audio_filename # 附加信息方便查看 }, # “predictions”字段用于存储预标注结果 predictions: [{ result: [{ from_name: transcription, # 对应模板中TextArea的name to_name: audio, # 对应模板中Audio的name type: textarea, value: { text: [predicted_text] # 预填充的文本 } }], score: 0.8, # 预标注的置信度分数可以是一个固定值或从API结果中提取 model_version: FireRedASR-Pro-v1 }] } tasks.append(task) print(f已处理: {audio_filename}) # 保存为JSON文件 with open(LS_IMPORT_FILE, w, encodingutf-8) as f: json.dump(tasks, f, ensure_asciiFalse, indent2) print(f\n成功共生成 {len(tasks)} 个任务。) print(f导入文件已保存至: {LS_IMPORT_FILE}) print(\n下一步请在Label Studio项目中使用‘Import’功能上传此JSON文件。) if __name__ __main__: create_label_studio_tasks()关键点说明audio_url_or_path这是脚本中最需要根据你的实际部署环境调整的部分。你必须确保Label Studio能通过这个路径或URL访问到对应的音频文件。predictions这个字段是预标注的核心。它告诉Label Studio在transcription这个文本区域中预先填入predicted_text。运行此脚本后你会得到一个tasks_with_predictions.json文件。4.4 在Label Studio中导入任务回到Label Studio的Web界面在你的项目页面点击“Import”按钮。选择“Upload Files”先上传你的所有原始音频文件。上传后Label Studio会为每个音频生成一个任务但文本是空的。再次点击“Import”但这次选择“Import Predictions”或类似选项不同版本可能名称略有不同。上传刚刚生成的tasks_with_predictions.json文件。导入成功后你会发现每个音频任务都已经自动填好了FireRedASR Pro识别出的文本。标注员现在可以直接播放音频并在预填文本的基础上进行修改和校对工作效率得到极大提升。5. 第三步高效人工校对与后处理当标注员在Label Studio中完成所有校对后你可以导出最终结果。导出数据在Label Studio项目页面点击“Export”选择JSON或JSON-MIN格式。这会下载一个包含所有标注结果的压缩包。格式转换导出的JSON结构可能比较复杂通常我们需要将其转换为模型训练所需的简单格式例如每行包含“音频路径”和“转录文本”的TXT或TSV文件。import json # 从Label Studio导出的结果文件 exported_json_path ./project-1-at-2025-01-01-export.json # 最终训练数据清单 final_manifest_path ./train_manifest.txt with open(exported_json_path, r, encodingutf-8) as f: labeled_data json.load(f) # 可能是列表也可能是字典根据实际导出格式调整 with open(final_manifest_path, w, encodingutf-8) as out_f: for task in labeled_data: # 解析结构获取音频路径和最终标注文本 # 注意以下路径解析需要根据你实际的导出结构和音频存储方式调整 audio_path task[data].get(audio) # 或 task[data][audio] # 获取最终的人工标注结果取第一个标注者的结果 # Label Studio的标注结果存储在‘annotations’里 annotations task.get(annotations, []) if annotations: # 获取校对后的文本路径可能与预标注时不同 for res in annotations[0][result]: if res[from_name] transcription: final_text res[value][text][0] break else: final_text [未标注] else: # 如果没有人工标注则回退到预标注文本 final_text task.get(predictions, [{}])[0].get(result, [{}])[0].get(value, {}).get(text, [])[0] # 写入标准清单格式音频文件路径[TAB]转录文本 out_f.write(f{audio_path}\t{final_text}\n) print(f训练数据清单已生成: {final_manifest_path})现在你得到的train_manifest.txt文件就是一份高质量的、可用于训练定制化语音识别模型的数据集。6. 总结通过本文的步骤我们成功搭建了一条从原始音频到高质量训练数据的自动化流水线。回顾关键节点批量预识别利用FireRedASR Pro的API和Python脚本我们实现了对海量音频的自动转写得到了高质量的文本草稿。无缝对接通过编写数据转换脚本我们将预识别结果与原始音频关联并格式化成Label Studio可直接导入的预标注任务。高效校对标注员在Label Studio中基于预填文本进行校对工作模式从“听打”转变为“审校”准确率和效率双双提升。数据产出校对完成后导出并转换数据获得可直接用于模型训练的标准化数据集。这套流程的精髓在于自动化与人性化的结合。它并非要完全取代人工而是通过技术手段将人从重复劳动中解放出来聚焦于价值更高的质量复核和难点处理。你可以根据自身项目的具体需求对此流程进行微调例如增加对低置信度片段的特殊标记、集成说话人分离结果等。希望这套方案能为你构建语音数据集带来实质性的效率提升。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。