SenseVoice Small听写效率提升方案批量音频处理与结果导出教程1. 引言从单文件到批量处理的效率革命如果你用过语音转文字工具大概率经历过这样的场景手头有十几个会议录音、几十段采访音频需要一个一个上传、等待、复制结果。整个过程枯燥、重复还容易出错。单文件处理在少量任务时还能应付一旦面对成批的音频文件效率瓶颈就暴露无遗。这正是我们今天要解决的问题。基于阿里通义千问SenseVoiceSmall模型构建的极速语音转文字服务本身已经具备了多语言智能识别和GPU极速推理的优势。但它的Web界面主要针对单文件交互设计。对于需要处理大量音频的用户——比如媒体编辑整理采访、学生整理课堂录音、企业处理客服录音——手动操作依然是效率的“拦路虎”。本教程将带你超越基础的单文件转写实现批量音频的自动化处理与结构化结果导出。你将学会如何通过简单的脚本一次性处理整个文件夹的音频并将所有转写结果自动整理成清晰的文本文件或表格。这不是对原有服务的改造而是在其强大识别引擎之上构建的一套高效“流水线”。学完本教程你将能轻松应对数十甚至上百个音频文件的转写任务将重复劳动交给程序把时间留给更有价值的内容整理与分析。2. 环境准备与核心思路在开始编写批量处理脚本之前我们需要确保基础环境就绪并理解整个自动化流程的骨架。2.1 基础服务状态确认批量处理脚本依赖于SenseVoice服务本身正常运行。请确保你已经通过CSDN星图镜像或其他方式成功部署了该服务并且可以通过浏览器访问其Web界面通常是一个本地地址如http://localhost:8501。在浏览器中手动上传一个音频文件测试确保识别功能正常工作。这是后续所有自动化的基石。2.2 批量处理的核心逻辑我们的目标是不用打开浏览器通过一个脚本完成“上传-识别-保存结果”的全过程。SenseVoice服务提供了一个基于HTTP的API接口即使它主要是个Web应用我们的脚本将通过模拟浏览器请求的方式与这个接口“对话”。整个流程可以拆解为以下几步扫描与准备脚本自动扫描指定文件夹找出所有支持的音频文件如.wav, .mp3等。序列化处理针对每个文件构造一个包含音频数据和语言设置的网络请求发送给SenseVoice服务。接收与解析接收服务返回的识别结果通常是JSON格式。结构化保存将每个文件的识别结果连同文件名、时长等信息保存到文本文件或CSV表格中。我们将使用Python来实现这个流程因为它有丰富的库来处理文件、网络请求和数据分析。2.3 所需Python库打开你的终端或命令提示符使用pip安装以下必要的库pip install requests tqdm pandasrequests用于向SenseVoice服务发送HTTP请求上传文件数据。tqdm用于在命令行中显示美观的进度条在处理大量文件时能直观看到进度。pandas用于将最终结果整理并导出为结构清晰的CSV表格文件可选但推荐。如果你的SenseVoice服务部署在本地环境就已经准备好了。如果服务部署在远程服务器你只需要知道它的可访问地址URL即可。3. 构建批量处理脚本现在我们开始编写核心的Python脚本。我们将创建一个名为batch_sensevoice.py的文件。3.1 脚本基础框架与配置首先导入必要的库并设置一些基础配置。import os import glob import json import time from pathlib import Path import requests from tqdm import tqdm import pandas as pd # 配置区域 # SenseVoice 服务的访问地址 (根据你的实际部署情况修改) SERVICE_URL http://localhost:8501 # 如果服务在本地 # SERVICE_URL http://your-server-ip:8501 # 如果服务在远程服务器 # 指向服务中处理文件上传和识别的后端端点 # 通常Streamlit应用的文件上传处理逻辑在内部我们需要找到正确的端点。 # 这里我们假设通过模拟前端表单提交到根路径。如果不行可能需要查看浏览器网络请求确定端点。 UPLOAD_ENDPOINT f{SERVICE_URL}/ # 初始尝试根路径 # 要处理的音频文件夹路径 AUDIO_FOLDER ./audio_files # 替换为你的音频文件夹路径 # 支持的文件格式 SUPPORTED_EXTENSIONS (.wav, .mp3, .m4a, .flac, .WAV, .MP3, .M4A, .FLAC) # 识别语言可选auto, zh, en, ja, ko, yue LANGUAGE auto # 结果输出文件名 OUTPUT_JSON transcription_results.json OUTPUT_CSV transcription_results.csv # 配置结束 关键点解释SERVICE_URL这是最重要的配置必须指向你正在运行的SenseVoice服务。本地部署通常是http://localhost:8501。UPLOAD_ENDPOINT由于Streamlit应用的处理逻辑是内部的直接调用API端点可能比较困难。我们首先尝试通过模拟向应用主地址提交数据。如果这种方法不行教程后续会提供备选方案。AUDIO_FOLDER把你需要批量处理的音频文件都放到一个文件夹里然后在这里指定这个文件夹的路径。3.2 文件扫描与准备函数接下来编写一个函数来获取所有需要处理的音频文件列表。def get_audio_files(folder_path): 扫描文件夹获取所有支持的音频文件路径列表。 audio_files [] for ext in SUPPORTED_EXTENSIONS: # 使用 glob 递归查找所有匹配扩展名的文件 pattern os.path.join(folder_path, **, f*{ext}) files glob.glob(pattern, recursiveTrue) audio_files.extend(files) # 去重并排序按文件名 audio_files sorted(list(set(audio_files))) print(f在文件夹 {folder_path} 中找到 {len(audio_files)} 个音频文件。) return audio_files3.3 核心转写函数模拟表单提交这是脚本的核心负责与SenseVoice服务通信。我们首先尝试最通用的方法模拟浏览器上传文件时发送的multipart/form-data请求。def transcribe_audio_simulate_upload(file_path, languageauto): 通过模拟表单上传的方式将单个音频文件发送给SenseVoice服务进行转写。 返回转写文本如果失败则返回None。 try: with open(file_path, rb) as audio_file: # 构建表单数据字段名需要根据实际Web界面确定。 # 通常文件字段名为 file 或 uploaded_file语言字段可能为 language。 files { file: (os.path.basename(file_path), audio_file, audio/mpeg) # 类型可通用 } data { language: language } # 发送POST请求 response requests.post(UPLOAD_ENDPOINT, filesfiles, datadata, timeout60) if response.status_code 200: # 尝试从响应中提取文本。这取决于服务返回的HTML结构。 # 我们需要解析HTML找到显示结果的元素。 # 这是一个简化的示例实际可能需要更复杂的解析。 # 首先尝试查找是否包含特定标识结果的文本或JSON。 if transcription in response.text.lower() or result in response.text.lower(): # 这里需要根据实际返回的页面结构进行解析。 # 作为示例我们假设服务在成功后会跳转或刷新页面包含结果。 # 更可靠的方法是如果服务提供了纯API接口应使用那个接口。 # 此处我们先打印一部分响应用于调试。 print(f 请求成功但需要解析HTML。响应长度{len(response.text)}) # 临时方案返回一个标记表明需要更精确的端点或解析方法。 return [待解析: 需要更精确的API端点] else: print(f 请求成功但未在响应中找到明确的结果区域。) return None else: print(f 请求失败状态码{response.status_code}) print(f 响应内容{response.text[:500]}) # 打印前500字符用于调试 return None except Exception as e: print(f 处理文件 {file_path} 时发生异常{e}) return None重要说明上述方法是一个尝试。因为Streamlit应用默认不提供纯粹的REST API直接模拟表单提交可能无法直接从返回的HTML中提取出干净的文本结果。更稳定的方法需要服务本身提供API端点。3.4 备选方案使用服务内置API如果可用一个更优雅的解决方案是检查SenseVoice服务是否在启动时暴露了专门的API端口例如7860端口常见于Gradio或FastAPI后端或者是否有可调用的内部函数。你可以查看服务启动时的日志或者尝试访问http://localhost:7860或http://localhost:8000等常见API端口。如果发现了这样的API端点核心转写函数可以变得更简洁、更可靠def transcribe_audio_via_api(file_path, languageauto, api_urlhttp://localhost:7860/transcribe): 通过专用API端点进行转写如果服务提供。 假设API接收JSON或表单返回JSON。 try: with open(file_path, rb) as audio_file: files {file: audio_file} data {language: language} # 如果API需要 # 或者以JSON形式发送: json{language: language} response requests.post(api_url, filesfiles, datadata, timeout120) if response.status_code 200: result response.json() # 假设返回的JSON格式为 {text: 识别出的文字, ...} transcribed_text result.get(text, ) return transcribed_text else: print(f API请求失败状态码{response.status_code}) return None except Exception as e: print(f 调用API处理 {file_path} 时发生异常{e}) return None如何判断使用哪种方法首先运行上面的transcribe_audio_simulate_upload函数看它打印的响应内容。如果响应是包含“识别结果XXX”的HTML你可以尝试用BeautifulSoup库解析HTML来提取文本。更推荐的方法是联系该SenseVoice镜像的提供者或查阅其文档确认是否有专用的API调用方式。这是最稳定、最推荐的做法。为了教程的完整性我们假设你已经找到了可用的API端点http://localhost:7860/transcribe并将在主流程中使用transcribe_audio_via_api函数。3.5 主处理流程与结果保存现在我们将所有部分组合起来并添加进度显示和结果保存功能。def main(): 主处理函数 print( SenseVoice Small 批量音频处理开始 ) # 1. 获取文件列表 audio_files get_audio_files(AUDIO_FOLDER) if not audio_files: print(未找到任何音频文件请检查路径。) return results [] # 2. 遍历处理每个文件 (使用tqdm显示进度条) for audio_file in tqdm(audio_files, desc处理音频中): file_name os.path.basename(audio_file) print(f\n处理文件: {file_name}) # 使用API方式进行转写 (假设此方法可用) # transcribed_text transcribe_audio_via_api(audio_file, LANGUAGE) # 或者使用模拟上传方式 (需要后续解析HTML) transcribed_text transcribe_audio_simulate_upload(audio_file, LANGUAGE) # 记录结果 result_item { 文件名: file_name, 文件路径: audio_file, 识别语言: LANGUAGE, 转写文本: transcribed_text if transcribed_text else [识别失败或未获取到文本], 处理时间: time.strftime(%Y-%m-%d %H:%M:%S) } results.append(result_item) # 短暂暂停避免对服务造成过大压力 time.sleep(0.5) # 3. 保存结果为JSON文件 print(f\n 处理完成正在保存结果 ) try: with open(OUTPUT_JSON, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) print(f结果已保存至: {OUTPUT_JSON}) except Exception as e: print(f保存JSON文件失败: {e}) # 4. (可选) 保存结果为CSV表格 try: df pd.DataFrame(results) df.to_csv(OUTPUT_CSV, indexFalse, encodingutf-8-sig) # utf-8-sig支持Excel中文 print(f结果表格已保存至: {OUTPUT_CSV}) print(\n结果摘要:) print(df[[文件名, 转写文本]].head()) # 预览前几条 except Exception as e: print(f保存CSV文件失败: {e}) if __name__ __main__: main()4. 运行脚本与结果解读4.1 如何运行脚本将上面完整的代码保存为batch_sensevoice.py。确保你的SenseVoice服务正在运行。将需要转写的所有音频文件放入一个文件夹例如./audio_files。修改脚本开头的配置部分将AUDIO_FOLDER改为你的音频文件夹路径。确认SERVICE_URL正确。如果找到了专用API修改transcribe_audio_via_api函数中的api_url并在主函数中调用它。在终端中导航到脚本所在目录运行python batch_sensevoice.py你将看到进度条和每个文件的处理日志。处理完成后当前目录下会生成transcription_results.json和transcription_results.csv两个文件。4.2 结果文件解读transcription_results.json这是一个结构化的数据文件方便程序进一步读取。你可以用任何文本编辑器或代码编辑器打开它里面按列表存储了每个文件的处理结果包含文件名、路径、识别文本和时间戳。transcription_results.csv这是一个表格文件可以用Excel、WPS或文本编辑器打开。它更直观每一行代表一个音频文件每一列代表一个属性文件名、转写文本等。你可以直接在这里筛选、搜索或复制所有转写文本。4.3 处理失败怎么办如果脚本运行后大部分文件的“转写文本”列显示为“[识别失败或未获取到文本]”或“[待解析: 需要更精确的API端点]”说明当前与服务的通信方式未能正确获取结果。排查步骤检查服务状态确保SenseVoice Web界面在浏览器中能正常工作。检查网络请求打开浏览器的开发者工具F12切换到“网络”(Network)标签页。在Web界面上传一个文件并识别观察浏览器发送了哪个请求通常是upload或predict以及请求的准确URL和参数格式是Form Data还是JSON。这将为你提供修改脚本中UPLOAD_ENDPOINT和请求格式的关键信息。修改脚本根据抓取到的网络请求信息调整transcribe_audio_simulate_upload函数中的files、data字典结构以及UPLOAD_ENDPOINT的地址。寻求API最根本的解决方案是确认该服务是否提供正式的API调用方式。这可能需要查阅项目源码或咨询镜像提供者。5. 总结与进阶建议通过本教程你已经掌握了将SenseVoice Small单文件转写服务升级为批量处理流水线的核心方法。虽然直接模拟Web请求可能遇到一些解析上的挑战但这为你指明了自动化处理的方向。一旦你通过浏览器开发者工具找到了正确的请求方式或者服务提供了明确的API这套脚本框架就能立刻高效运转起来。核心价值回顾效率倍增告别手动重复操作一键处理成百上千的音频文件。结果规整自动生成结构化的JSON和CSV文件便于后续的存档、搜索和分析。流程集成此脚本可以作为一个模块轻松集成到更复杂的自动化工作流中。进阶建议错误重试机制在网络不稳定或服务短暂异常时可以为失败的单个文件添加重试逻辑。并发处理如果服务器性能强劲可以引入concurrent.futures模块进行有限度的并发请求进一步提升速度需注意不要压垮服务。结果后处理在保存结果前可以添加简单的文本后处理比如去除首尾空白、将多个空格合并为一个等。生成报告使用pandas对识别结果进行简单分析比如统计总字数、估算录音总时长等并输出摘要报告。批量处理的核心思想是“连接”与“自动化”。本教程为你搭建了这座桥梁让你能充分释放SenseVoice Small高性能语音识别模型的潜力将其真正应用于需要处理海量音频数据的实际生产场景中。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
SenseVoice Small听写效率提升方案:批量音频处理与结果导出教程
SenseVoice Small听写效率提升方案批量音频处理与结果导出教程1. 引言从单文件到批量处理的效率革命如果你用过语音转文字工具大概率经历过这样的场景手头有十几个会议录音、几十段采访音频需要一个一个上传、等待、复制结果。整个过程枯燥、重复还容易出错。单文件处理在少量任务时还能应付一旦面对成批的音频文件效率瓶颈就暴露无遗。这正是我们今天要解决的问题。基于阿里通义千问SenseVoiceSmall模型构建的极速语音转文字服务本身已经具备了多语言智能识别和GPU极速推理的优势。但它的Web界面主要针对单文件交互设计。对于需要处理大量音频的用户——比如媒体编辑整理采访、学生整理课堂录音、企业处理客服录音——手动操作依然是效率的“拦路虎”。本教程将带你超越基础的单文件转写实现批量音频的自动化处理与结构化结果导出。你将学会如何通过简单的脚本一次性处理整个文件夹的音频并将所有转写结果自动整理成清晰的文本文件或表格。这不是对原有服务的改造而是在其强大识别引擎之上构建的一套高效“流水线”。学完本教程你将能轻松应对数十甚至上百个音频文件的转写任务将重复劳动交给程序把时间留给更有价值的内容整理与分析。2. 环境准备与核心思路在开始编写批量处理脚本之前我们需要确保基础环境就绪并理解整个自动化流程的骨架。2.1 基础服务状态确认批量处理脚本依赖于SenseVoice服务本身正常运行。请确保你已经通过CSDN星图镜像或其他方式成功部署了该服务并且可以通过浏览器访问其Web界面通常是一个本地地址如http://localhost:8501。在浏览器中手动上传一个音频文件测试确保识别功能正常工作。这是后续所有自动化的基石。2.2 批量处理的核心逻辑我们的目标是不用打开浏览器通过一个脚本完成“上传-识别-保存结果”的全过程。SenseVoice服务提供了一个基于HTTP的API接口即使它主要是个Web应用我们的脚本将通过模拟浏览器请求的方式与这个接口“对话”。整个流程可以拆解为以下几步扫描与准备脚本自动扫描指定文件夹找出所有支持的音频文件如.wav, .mp3等。序列化处理针对每个文件构造一个包含音频数据和语言设置的网络请求发送给SenseVoice服务。接收与解析接收服务返回的识别结果通常是JSON格式。结构化保存将每个文件的识别结果连同文件名、时长等信息保存到文本文件或CSV表格中。我们将使用Python来实现这个流程因为它有丰富的库来处理文件、网络请求和数据分析。2.3 所需Python库打开你的终端或命令提示符使用pip安装以下必要的库pip install requests tqdm pandasrequests用于向SenseVoice服务发送HTTP请求上传文件数据。tqdm用于在命令行中显示美观的进度条在处理大量文件时能直观看到进度。pandas用于将最终结果整理并导出为结构清晰的CSV表格文件可选但推荐。如果你的SenseVoice服务部署在本地环境就已经准备好了。如果服务部署在远程服务器你只需要知道它的可访问地址URL即可。3. 构建批量处理脚本现在我们开始编写核心的Python脚本。我们将创建一个名为batch_sensevoice.py的文件。3.1 脚本基础框架与配置首先导入必要的库并设置一些基础配置。import os import glob import json import time from pathlib import Path import requests from tqdm import tqdm import pandas as pd # 配置区域 # SenseVoice 服务的访问地址 (根据你的实际部署情况修改) SERVICE_URL http://localhost:8501 # 如果服务在本地 # SERVICE_URL http://your-server-ip:8501 # 如果服务在远程服务器 # 指向服务中处理文件上传和识别的后端端点 # 通常Streamlit应用的文件上传处理逻辑在内部我们需要找到正确的端点。 # 这里我们假设通过模拟前端表单提交到根路径。如果不行可能需要查看浏览器网络请求确定端点。 UPLOAD_ENDPOINT f{SERVICE_URL}/ # 初始尝试根路径 # 要处理的音频文件夹路径 AUDIO_FOLDER ./audio_files # 替换为你的音频文件夹路径 # 支持的文件格式 SUPPORTED_EXTENSIONS (.wav, .mp3, .m4a, .flac, .WAV, .MP3, .M4A, .FLAC) # 识别语言可选auto, zh, en, ja, ko, yue LANGUAGE auto # 结果输出文件名 OUTPUT_JSON transcription_results.json OUTPUT_CSV transcription_results.csv # 配置结束 关键点解释SERVICE_URL这是最重要的配置必须指向你正在运行的SenseVoice服务。本地部署通常是http://localhost:8501。UPLOAD_ENDPOINT由于Streamlit应用的处理逻辑是内部的直接调用API端点可能比较困难。我们首先尝试通过模拟向应用主地址提交数据。如果这种方法不行教程后续会提供备选方案。AUDIO_FOLDER把你需要批量处理的音频文件都放到一个文件夹里然后在这里指定这个文件夹的路径。3.2 文件扫描与准备函数接下来编写一个函数来获取所有需要处理的音频文件列表。def get_audio_files(folder_path): 扫描文件夹获取所有支持的音频文件路径列表。 audio_files [] for ext in SUPPORTED_EXTENSIONS: # 使用 glob 递归查找所有匹配扩展名的文件 pattern os.path.join(folder_path, **, f*{ext}) files glob.glob(pattern, recursiveTrue) audio_files.extend(files) # 去重并排序按文件名 audio_files sorted(list(set(audio_files))) print(f在文件夹 {folder_path} 中找到 {len(audio_files)} 个音频文件。) return audio_files3.3 核心转写函数模拟表单提交这是脚本的核心负责与SenseVoice服务通信。我们首先尝试最通用的方法模拟浏览器上传文件时发送的multipart/form-data请求。def transcribe_audio_simulate_upload(file_path, languageauto): 通过模拟表单上传的方式将单个音频文件发送给SenseVoice服务进行转写。 返回转写文本如果失败则返回None。 try: with open(file_path, rb) as audio_file: # 构建表单数据字段名需要根据实际Web界面确定。 # 通常文件字段名为 file 或 uploaded_file语言字段可能为 language。 files { file: (os.path.basename(file_path), audio_file, audio/mpeg) # 类型可通用 } data { language: language } # 发送POST请求 response requests.post(UPLOAD_ENDPOINT, filesfiles, datadata, timeout60) if response.status_code 200: # 尝试从响应中提取文本。这取决于服务返回的HTML结构。 # 我们需要解析HTML找到显示结果的元素。 # 这是一个简化的示例实际可能需要更复杂的解析。 # 首先尝试查找是否包含特定标识结果的文本或JSON。 if transcription in response.text.lower() or result in response.text.lower(): # 这里需要根据实际返回的页面结构进行解析。 # 作为示例我们假设服务在成功后会跳转或刷新页面包含结果。 # 更可靠的方法是如果服务提供了纯API接口应使用那个接口。 # 此处我们先打印一部分响应用于调试。 print(f 请求成功但需要解析HTML。响应长度{len(response.text)}) # 临时方案返回一个标记表明需要更精确的端点或解析方法。 return [待解析: 需要更精确的API端点] else: print(f 请求成功但未在响应中找到明确的结果区域。) return None else: print(f 请求失败状态码{response.status_code}) print(f 响应内容{response.text[:500]}) # 打印前500字符用于调试 return None except Exception as e: print(f 处理文件 {file_path} 时发生异常{e}) return None重要说明上述方法是一个尝试。因为Streamlit应用默认不提供纯粹的REST API直接模拟表单提交可能无法直接从返回的HTML中提取出干净的文本结果。更稳定的方法需要服务本身提供API端点。3.4 备选方案使用服务内置API如果可用一个更优雅的解决方案是检查SenseVoice服务是否在启动时暴露了专门的API端口例如7860端口常见于Gradio或FastAPI后端或者是否有可调用的内部函数。你可以查看服务启动时的日志或者尝试访问http://localhost:7860或http://localhost:8000等常见API端口。如果发现了这样的API端点核心转写函数可以变得更简洁、更可靠def transcribe_audio_via_api(file_path, languageauto, api_urlhttp://localhost:7860/transcribe): 通过专用API端点进行转写如果服务提供。 假设API接收JSON或表单返回JSON。 try: with open(file_path, rb) as audio_file: files {file: audio_file} data {language: language} # 如果API需要 # 或者以JSON形式发送: json{language: language} response requests.post(api_url, filesfiles, datadata, timeout120) if response.status_code 200: result response.json() # 假设返回的JSON格式为 {text: 识别出的文字, ...} transcribed_text result.get(text, ) return transcribed_text else: print(f API请求失败状态码{response.status_code}) return None except Exception as e: print(f 调用API处理 {file_path} 时发生异常{e}) return None如何判断使用哪种方法首先运行上面的transcribe_audio_simulate_upload函数看它打印的响应内容。如果响应是包含“识别结果XXX”的HTML你可以尝试用BeautifulSoup库解析HTML来提取文本。更推荐的方法是联系该SenseVoice镜像的提供者或查阅其文档确认是否有专用的API调用方式。这是最稳定、最推荐的做法。为了教程的完整性我们假设你已经找到了可用的API端点http://localhost:7860/transcribe并将在主流程中使用transcribe_audio_via_api函数。3.5 主处理流程与结果保存现在我们将所有部分组合起来并添加进度显示和结果保存功能。def main(): 主处理函数 print( SenseVoice Small 批量音频处理开始 ) # 1. 获取文件列表 audio_files get_audio_files(AUDIO_FOLDER) if not audio_files: print(未找到任何音频文件请检查路径。) return results [] # 2. 遍历处理每个文件 (使用tqdm显示进度条) for audio_file in tqdm(audio_files, desc处理音频中): file_name os.path.basename(audio_file) print(f\n处理文件: {file_name}) # 使用API方式进行转写 (假设此方法可用) # transcribed_text transcribe_audio_via_api(audio_file, LANGUAGE) # 或者使用模拟上传方式 (需要后续解析HTML) transcribed_text transcribe_audio_simulate_upload(audio_file, LANGUAGE) # 记录结果 result_item { 文件名: file_name, 文件路径: audio_file, 识别语言: LANGUAGE, 转写文本: transcribed_text if transcribed_text else [识别失败或未获取到文本], 处理时间: time.strftime(%Y-%m-%d %H:%M:%S) } results.append(result_item) # 短暂暂停避免对服务造成过大压力 time.sleep(0.5) # 3. 保存结果为JSON文件 print(f\n 处理完成正在保存结果 ) try: with open(OUTPUT_JSON, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) print(f结果已保存至: {OUTPUT_JSON}) except Exception as e: print(f保存JSON文件失败: {e}) # 4. (可选) 保存结果为CSV表格 try: df pd.DataFrame(results) df.to_csv(OUTPUT_CSV, indexFalse, encodingutf-8-sig) # utf-8-sig支持Excel中文 print(f结果表格已保存至: {OUTPUT_CSV}) print(\n结果摘要:) print(df[[文件名, 转写文本]].head()) # 预览前几条 except Exception as e: print(f保存CSV文件失败: {e}) if __name__ __main__: main()4. 运行脚本与结果解读4.1 如何运行脚本将上面完整的代码保存为batch_sensevoice.py。确保你的SenseVoice服务正在运行。将需要转写的所有音频文件放入一个文件夹例如./audio_files。修改脚本开头的配置部分将AUDIO_FOLDER改为你的音频文件夹路径。确认SERVICE_URL正确。如果找到了专用API修改transcribe_audio_via_api函数中的api_url并在主函数中调用它。在终端中导航到脚本所在目录运行python batch_sensevoice.py你将看到进度条和每个文件的处理日志。处理完成后当前目录下会生成transcription_results.json和transcription_results.csv两个文件。4.2 结果文件解读transcription_results.json这是一个结构化的数据文件方便程序进一步读取。你可以用任何文本编辑器或代码编辑器打开它里面按列表存储了每个文件的处理结果包含文件名、路径、识别文本和时间戳。transcription_results.csv这是一个表格文件可以用Excel、WPS或文本编辑器打开。它更直观每一行代表一个音频文件每一列代表一个属性文件名、转写文本等。你可以直接在这里筛选、搜索或复制所有转写文本。4.3 处理失败怎么办如果脚本运行后大部分文件的“转写文本”列显示为“[识别失败或未获取到文本]”或“[待解析: 需要更精确的API端点]”说明当前与服务的通信方式未能正确获取结果。排查步骤检查服务状态确保SenseVoice Web界面在浏览器中能正常工作。检查网络请求打开浏览器的开发者工具F12切换到“网络”(Network)标签页。在Web界面上传一个文件并识别观察浏览器发送了哪个请求通常是upload或predict以及请求的准确URL和参数格式是Form Data还是JSON。这将为你提供修改脚本中UPLOAD_ENDPOINT和请求格式的关键信息。修改脚本根据抓取到的网络请求信息调整transcribe_audio_simulate_upload函数中的files、data字典结构以及UPLOAD_ENDPOINT的地址。寻求API最根本的解决方案是确认该服务是否提供正式的API调用方式。这可能需要查阅项目源码或咨询镜像提供者。5. 总结与进阶建议通过本教程你已经掌握了将SenseVoice Small单文件转写服务升级为批量处理流水线的核心方法。虽然直接模拟Web请求可能遇到一些解析上的挑战但这为你指明了自动化处理的方向。一旦你通过浏览器开发者工具找到了正确的请求方式或者服务提供了明确的API这套脚本框架就能立刻高效运转起来。核心价值回顾效率倍增告别手动重复操作一键处理成百上千的音频文件。结果规整自动生成结构化的JSON和CSV文件便于后续的存档、搜索和分析。流程集成此脚本可以作为一个模块轻松集成到更复杂的自动化工作流中。进阶建议错误重试机制在网络不稳定或服务短暂异常时可以为失败的单个文件添加重试逻辑。并发处理如果服务器性能强劲可以引入concurrent.futures模块进行有限度的并发请求进一步提升速度需注意不要压垮服务。结果后处理在保存结果前可以添加简单的文本后处理比如去除首尾空白、将多个空格合并为一个等。生成报告使用pandas对识别结果进行简单分析比如统计总字数、估算录音总时长等并输出摘要报告。批量处理的核心思想是“连接”与“自动化”。本教程为你搭建了这座桥梁让你能充分释放SenseVoice Small高性能语音识别模型的潜力将其真正应用于需要处理海量音频数据的实际生产场景中。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。