魔兽世界先祖战熊获取方式详细说明
2026-08-14
2026-08-17 0
一、引言
在数字化办公与媒体内容生产领域,从会议录音、访谈视频、培训课程等多媒体文件中高效、准确地提取文字记录,并区分不同说话人,已成为一项基础且迫切的需求。传统的在线语音识别服务虽便捷,却面临数据隐私泄露、网络延迟波动、服务不可控等风险;而纯软件端到端方案往往受限于单机算力,难以在保证实时性的同时完成高精度说话人分离与长音频转写。为兼顾安全性、可控性与高性能,越来越多行业用户将目光投向全离线私有化部署方案。本文提出一种基于K100 AI加速卡双卡全离线部署的音视频说话人角色确认转录系统,利用国产高算力硬件与先进的开源多模态模型,在完全断网环境下实现从音视频文件上传到带时间戳、带说话人标签的转写文本一站式处理。
K100 AI加速卡单卡即可提供充沛的INT8/FP16算力,双卡协同更能通过张量并行或流水线并行大幅提升长序列推理速度,特别适合处理高时长、多轮对话的复杂音频。本系统选用SoulX-Transcriber多模态大模型,该模型原生集成说话人日志和自动语音识别能力,能够以极简的prompt交互完成端到端“谁在什么时候说了什么”的精准解析。系统上层采用轻量级Flask Web框架搭建交互界面,底层依托vLLM高性能推理引擎驱动模型,ffmpeg统一预处理音视频流,实现从文件接收、音频转换、模型推理到结果清洗与展示的全离线闭环。用户仅需在浏览器中上传文件,数十秒至数十分钟后即可获得结构化的角色分离转写文本,全过程数据不出本机,极大保障了涉密场景下的信息安全,同时消除了云端服务的订阅成本与网络依赖,为政企会议纪要生成、媒体字幕制作、司法存证等场景提供了高性价比的一体化解决方案。
二、方案设计
系统整体采用前后端分离的B/S架构,前端页面提供文件上传入口与转写结果展示,后端负责业务调度与模型推理链路的串联。核心组件包括:Flask应用服务器、ffmpeg媒体处理工具、vLLM推理服务、SoulX-Transcriber多模态大模型,以及支撑双卡算力的底层驱动与运行时。
工作流程如下:用户通过浏览器将音视频文件提交至Flask后端,后端首先对文件做安全校验并保存至临时目录。随后调用ffmpeg命令行工具,忽略视频轨(-vn),将音频重采样为16kHz采样率、单声道、16bit量化的PCM WAV格式。这一标准化步骤屏蔽了输入文件编码、采样率、声道数等差异性,确保模型始终接收到符合预期的干净音频。转换完成后,Flask构造出指向该WAV文件的本地路径URL(file://协议),并与精心设计的系统指令和用户提示词拼接成多模态对话请求体。提示词明确要求模型进行说话人分离与ASR,输出格式为[开始时间 → 结束时间] Speaker X: 说话内容,时间戳精确到毫秒,并禁止拆分完整语义轮次。
请求被发送至vLLM服务,该服务在双K100加速卡上以张量并行模式加载SoulX-Transcriber模型,模型接收音频数据和文本指令后,通过跨模态注意力机制同步完成声纹聚类、时间边界检测与文字转换,生成原始转写文本。Flask获得响应后,利用正则表达式解析模型输出,过滤掉模型可能产生的无效占位行(如--:--:-- --> --:--:--),提取出结构化的分段列表,包含起止时间、说话人标签和文本内容,并连同原始文本一同以JSON格式返回前端渲染。整个处理过程中产生的临时文件均在请求结束后自动清除,避免磁盘残留。
离线部署方面,vLLM服务与Flask应用均可通过systemd或容器化方式固化在本地系统,双K100卡通过NCCL等通信库高效协同,支持超过10分钟的长音频的一次性推理,端到端延迟可控制在实时率0.1以下。该方案无需任何外部网络连接,所有组件开源可控,可根据业务需求灵活调整模型温度、最大token数等参数,在精度与速度间取得平衡。
下图展示了整体数据流:

三、实施方法及代码
3.1硬件环境
本方案的硬件平台为一台H3C服务器,配置如下:
组件 | 规格 |
CPU | 2×海光74902.7GHz64C |
内存 | 16×32GDDR5 |
GPU | 8×海光DCU64GBK100_AI |
需占用两张K100_AI显卡
3.2软件栈
本方案的软件栈基于Docker容器化技术构建,使用经过海光DCU适配的vLLM推理镜像:
镜像(SoulX-Transcriber):
harbor.sourcefind.cn:5443/dcu/admin/base/custom:vllm0.15.1-ubuntu22.04-dtk26.04-0130-py3.10-20260220
该镜像基于vLLM0.15.1推理框架、DTK26.04,Python3.10环境,双卡部署SoulX-Transcriber多模态大模型。
软件项目:
1、SoulX-Transcriber环境部署参照https://developer.sourcefind.cn/modelzoo/list/qwen3-omni_vllm/detail?post_id=3563caba-356c-11f1-be71-0242ac150003里面操作步骤,项目下载链接为:https://developer.sourcefind.cn/codes/modelzoo/qwen3-omni_vllm/-/archive/v1.0/qwen3-omni_vllm-v1.0.zip。
2、离线音视频说话人角色确认转录系统自编程序代码如下:
app.py代码如下:
import osimport reimport tempfileimport subprocessimport requestsfrom flask import Flask, request, jsonify, render_templatefrom werkzeug.utils import secure_filenameapp = Flask(__name__)app.config['MAX_CONTENT_LENGTH'] = 500 * 1024 * 1024# 500 MBVLLM_URL = "http://localhost:8082/v1/chat/completions"MODEL_NAME = "SoulX-Transcriber"def parse_transcript(text):"""解析转录文本,支持两种时间戳格式,过滤无意义的占位行。"""lines = text.strip().split('n')segments = []# 匹配 --:--:-- 后面跟着 --> 或 → 的行placeholder_pattern = re.compile(r'^--:--:--s*(?:-->|→)s*--:--:--$')pattern_hms = re.compile(r'[(d{2}:d{2}:d{2})s*->s*(d{2}:d{2}:d{2})]s*(Speakerd+):s*(.*)')pattern_ms= re.compile(r'[(d{2}:d{2}.d+)s*-->s*(d{2}:d{2}.d+)]s*(Speakerd+):s*(.*)')pattern_no_time = re.compile(r'(Speakerd+):s*(.*)')for line in lines:line = line.strip()if not line:continue# 丢弃占位行if placeholder_pattern.match(line):continuematch = pattern_hms.match(line)if match:start, end, speaker, content = match.groups()segments.append({'start': start, 'end': end, 'speaker': speaker, 'text': content})continuematch = pattern_ms.match(line)if match:start, end, speaker, content = match.groups()segments.append({'start': start, 'end': end, 'speaker': speaker, 'text': content})continuematch = pattern_no_time.match(line)if match:speaker, content = match.groups()segments.append({'start': None, 'end': None, 'speaker': speaker, 'text': content})else:segments.append({'start': None, 'end': None, 'speaker': None, 'text': line})return segments@app.route('/')def index():return render_template('index.html')@app.route('/transcribe', methods=['POST'])def transcribe():if 'video' not in request.files:return jsonify({'error': 'No video/audio file provided'}), 400video_file = request.files['video']if video_file.filename == '':return jsonify({'error': 'Empty filename'}), 400filename = secure_filename(video_file.filename)input_tmp = Nonewav_path = Nonetry:# 1. 保存上传的原始文件到临时文件(保留扩展名用于 ffmpeg 识别)suffix = os.path.splitext(filename)[1] or '.tmp'input_tmp = tempfile.NamedTemporaryFile(delete=False, suffix=suffix)video_file.save(input_tmp.name)input_tmp.close()# 关闭句柄但不删除# 2. 创建输出 WAV 临时文件(16kHz 单声道)wav_tmp = tempfile.NamedTemporaryFile(delete=False, suffix='.wav')wav_path = wav_tmp.namewav_tmp.close()# 3. 使用 ffmpeg 统一转成 16kHz 单声道 PCM WAVcmd = ['ffmpeg','-i', input_tmp.name,'-vn',# 无视视频流(如果存在)'-acodec', 'pcm_s16le','-ar', '16000','-ac', '1','-y',wav_path]subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)# 4. 构造本地文件 URL(服务器必须能通过 file:// 访问同一路径)audio_file_url = f"file://{os.path.abspath(wav_path)}"# ---------- 使用示例中的 USER_QUERY (与原版基本一致)----------USER_QUERY = ("Task: Speaker Diarization and ASR.n""Rules:n""1. Identify each speaker and their spoken content with punctuation.n""2. Format each turn as: [start_time --> end_time] Speaker X: textn""3. Timestamps should be precise to the millisecond (e.g., 00:00:01.234).n""4. Do NOT split an utterance to avoid overlap — keep each speaker turn complete.n""5. Handle overlapping speech by showing concurrent turns with their own time ranges.n""6. Output only the formatted results. No preamble, no explanation.n""templates/index.html代码如下:
离线音视频说话人角色确认转录系统 🎤 离线音视频说话人角色确认转录系统
点击选择音视频文件 或拖拽到这里
支持WAV / MP3 / MP4 / MOV / AVI 等格式📁 请上传视频文件以开始转录3.3模型下载与准备
SoulX-Transcriber(说话人确认多模态大模型):
下载链接:https://modelscope.cn/models/Soul-AILab/SoulX-Transcriber/files
3.4模型启动参数
SoulX-Transcriber启动参数:
cat SoulX-Transcriber.sh vllm serve "/home/models/SoulX-Transcriber" --port 8082 --served-model-name SoulX-Transcriber --trust-remote-code --tensor-parallel-size 2 --dtype bfloat16 --max-model-len 65536 --gpu-memory-utilization 0.95 --allowed-local-media-path /四、运行测试
1、启动SoulX-Transcriber
docker exec -it soulx-transcriber bashcd /home/models/nohup ./SoulX-Transcriber.sh &2、启动离线音视频说话人角色确认转录系统自编程序
python app.py* Serving Flask app 'app' * Debug mode: onWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:5000 * Running on http://192.168.222.65:5000Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 105-818-056192.168.222.61 - - [12/Jul/2026 17:33:06] "GET / HTTP/1.1" 200 -192.168.222.61 - - [12/Jul/2026 17:33:38] "POST /transcribe HTTP/1.1" 200 -192.168.222.61 - - [12/Jul/2026 17:36:09] "GET / HTTP/1.1" 200 -3、访问离线音视频说话人角色确认转录系统自编程序
用谷歌浏览器访问



转录完成后,点击右边有时间段的文本记录,播放器会自动跳转到指定时间位置进行播放