视频语音处理工具项目说明文档
我是地质高手
1. 项目概述
本项目是一个视频语音处理工具,主要用于在线教育平台的录播视频处理。工具支持视频语音识别、文本提取、录音替换和语音合成到视频等功能。同时,提供了Whisper模型的微调功能,允许用户根据自己的需求优化语音识别效果。
2. 系统架构
本项目采用前后端分离的架构设计:
DL_app/├── backend/ # Python后端├── frontend/ # HTML前端├── pretrain/ # Whisper微调模块├── temp/ # 临时文件└── output/ # 输出文件
2.1 前端
提供直观的Web界面,支持视频上传、转录结果查看、录音替换等功能 使用HTML5、CSS3和JavaScript实现 支持拖拽上传视频文件 实时显示处理进度和结果
2.2 后端
使用Python Flask框架构建 实现视频处理、语音识别、录音、替换等核心功能 提供RESTful API接口
2.3 预训练模块
实现Whisper模型的微调功能 包含数据准备、模型训练、评估等组件 与前后端模块分离,不影响现有功能
3. 后端实现方法
3.1 核心功能模块
3.1.1 视频语音识别
# 使用Whisper模型实现语音识别defvideo_to_text(video_path):# 提取视频中的音频 video = VideoFileClip(video_path) audio_path = os.path.join(TEMP_DIR, "temp_audio.wav") video.audio.write_audiofile(audio_path)# 使用Whisper进行语音识别 result = model.transcribe(audio_path, verbose=True, language="zh")# 整理识别结果 segments = []for i, segment inenumerate(result["segments"]): segments.append({"id": i,"start": segment["start"],"end": segment["end"],"text": segment["text"].strip() })# 生成JSON结果 output_data = {"filename": os.path.basename(video_path),"duration": video.duration,"segments": segments }# 保存结果 json_path = os.path.join(OUTPUT_DIR, f"{os.path.splitext(os.path.basename(video_path))[0]}_transcript.json")withopen(json_path, "w", encoding="utf-8") as f: json.dump(output_data, f, ensure_ascii=False, indent=2)return output_data, json_path
3.1.2 录音功能
defrecord_audio(output_path, duration=5): FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 44100 CHUNK = 1024 audio = pyaudio.PyAudio()# 开始录音 stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) frames = []for i inrange(0, int(RATE / CHUNK * duration)): data = stream.read(CHUNK) frames.append(data)# 停止录音 stream.stop_stream() stream.close() audio.terminate()# 保存录音 waveFile = wave.open(output_path, 'wb') waveFile.setnchannels(CHANNELS) waveFile.setsampwidth(audio.get_sample_size(FORMAT)) waveFile.setframerate(RATE) waveFile.writeframes(b''.join(frames)) waveFile.close()
3.1.3 语音替换到视频
defreplace_speech_in_video(video_path, segment_id, new_audio_path, transcript_data):# 加载视频 video = VideoFileClip(video_path) original_audio = video.audio# 获取要替换的片段信息 segment = next((s for s in transcript_data["segments"] if s["id"] == segment_id), None)ifnot segment:raise ValueError(f"Segment with id {segment_id} not found") start_time = segment["start"] end_time = segment["end"]# 加载新音频 new_audio = AudioFileClip(new_audio_path)# 确保新音频长度与原片段匹配 new_audio = new_audio.set_duration(end_time - start_time)# 分割原音频 audio_parts = []# 1. 原音频开始到替换片段开始if start_time > 0: audio_parts.append(original_audio.subclip(0, start_time))# 2. 新音频 audio_parts.append(new_audio)# 3. 替换片段结束到原音频结束if end_time < original_audio.duration: audio_parts.append(original_audio.subclip(end_time))# 合并音频 new_audio_composite = CompositeAudioClip(audio_parts)# 替换视频音频 final_video = video.set_audio(new_audio_composite)# 保存结果 output_video_path = os.path.join(OUTPUT_DIR, f"{os.path.splitext(os.path.basename(video_path))[0]}_modified.mp4") final_video.write_videofile(output_video_path, codec="libx264", audio_codec="aac")return output_video_path
3.2 API接口设计
| 接口路径 |
方法 |
功能描述 |
| / |
GET |
返回前端页面 |
| /api/transcribe |
POST |
视频语音识别 |
| /api/record |
POST |
录音功能 |
| /api/replace_speech |
POST |
语音替换到视频 |
| /api/get_output_files |
GET |
获取输出文件列表 |
| /output/<filename> |
GET |
下载输出文件 |
3.3 技术栈
框架
: Flask
视频处理
: MoviePy
语音识别
: OpenAI Whisper
录音
: PyAudio
音频处理
: PyDub
数据格式
: JSON
4. Whisper微调的深度学习过程
4.1 模型架构
Whisper是OpenAI开发的自动语音识别(ASR)模型,采用编码器-解码器架构:
编码器 : 使用多层Transformer结构,将音频信号转换为高级特征表示
解码器 : 使用Transformer解码器,将特征表示转换为文本序列
4.2 微调流程
4.2.1 数据准备
defprepare_dataset(batch, processor):# 加载并重新采样音频为16kHz audio = batch["audio"]# 处理音频 batch["input_features"] = processor.feature_extractor(audio["array"], sampling_rate=audio["sampling_rate"]).input_features[0]# 处理文本 batch["labels"] = processor.tokenizer(batch["text"]).input_idsreturn batch
4.2.2 模型训练
deffinetune_whisper(data_dir, output_dir):# 加载模型和处理器 processor = WhisperProcessor.from_pretrained("openai/whisper-base", language="zh", task="transcribe") model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base")# 设置训练参数 training_args = Seq2SeqTrainingArguments( output_dir=output_dir, per_device_train_batch_size=8, gradient_accumulation_steps=4, learning_rate=1e-5, warmup_steps=500, max_steps=4000, gradient_checkpointing=True, fp16=torch.cuda.is_available(), evaluation_strategy="steps", per_device_eval_batch_size=8, predict_with_generate=True, generation_max_length=225, save_steps=1000, eval_steps=1000, logging_steps=25, load_best_model_at_end=True, metric_for_best_model="wer", greater_is_better=False )# 创建训练器 trainer = Seq2SeqTrainer( args=training_args, model=model, train_dataset=train_dataset, eval_dataset=eval_dataset, data_collator=processor.feature_extractor.pad, compute_metrics=lambda pred: compute_metrics(pred, processor), tokenizer=processor.tokenizer, feature_extractor=processor.feature_extractor, )# 开始训练 trainer.train()
4.2.3 模型评估
使用词错误率(WER)作为评估指标:
defcompute_metrics(pred, processor): wer_metric = evaluate.load("wer") pred_ids = pred.predictions label_ids = pred.label_ids# 将label_ids中的-100替换为tokenizer的pad_token_id label_ids[label_ids == -100] = processor.tokenizer.pad_token_id# 解码预测结果和标签 pred_str = processor.tokenizer.batch_decode(pred_ids, skip_special_tokens=True) label_str = processor.tokenizer.batch_decode(label_ids, skip_special_tokens=True)# 计算WER wer = wer_metric.compute(predictions=pred_str, references=label_str)return {"wer": wer}
4.3 微调步骤
数据收集 : 准备包含音频和对应文本的训练数据
数据预处理 : 将音频重采样为16kHz 提取音频特征 对文本进行分词和编码
模型配置 : 加载预训练Whisper模型 设置训练参数 配置生成策略
模型训练 : 使用Seq2SeqTrainer进行训练 梯度累积减少内存使用 学习率调度和预热
模型评估 : 计算词错误率(WER) 保存最佳模型
模型部署 : 加载微调后的模型 用于语音识别任务
4.4 数据格式要求
训练数据需要包含音频文件(.wav)和对应的文本文件(.txt),每个音频文件对应一个文本文件,文件名相同:
training_data/├── segment_0001.wav├── segment_0001.txt├── segment_0002.wav├── segment_0002.txt└── ...
5. 使用方法
5.1 安装依赖
# 安装后端依赖cd backendpip install -r requirements.txt# 安装预训练模块依赖cd ../pretrainpip install transformers datasets evaluate jiwer torch
5.2 运行应用
# 启动后端服务cd backendpython video_speech_tool.py --port 5001# 在浏览器中访问 http://127.0.0.1:5001
5.3 Whisper微调
5.3.1 数据准备
# 从视频中提取音频python data_preparation.py --extract_audio --video_path path/to/video.mp4 --output_audio path/to/audio.wav# 准备训练数据python data_preparation.py --input_dir path/to/input --output_dir path/to/training_data
5.3.2 模型训练
# 微调Whisper模型python finetune_whisper.py --data_dir path/to/training_data --output_dir path/to/finetuned_model
5.3.3 使用微调后的模型
在backend/video_speech_tool.py中修改模型加载部分:
# 加载预训练模型# model = whisper.load_model("base")# 加载微调后的模型model = whisper.load_model("path/to/finetuned_model/best_model")
6. 系统流程
6.1 视频语音识别流程
用户上传MP4视频文件 系统提取视频中的音频 使用Whisper模型进行语音识别 生成包含时间戳的文本片段 保存转录结果为JSON格式 在前端显示转录结果
6.2 录音替换流程
用户选择需要替换的文本片段 系统启动录音功能 用户进行新的录音 系统将新录音替换到视频中对应的时间段 生成新的视频文件 保存结果并在前端显示
7. 未来改进
支持更多格式 : 扩展支持更多视频和音频格式
批量处理 : 支持批量处理多个视频文件
多语言支持 : 扩展支持更多语言的语音识别
实时处理 : 实现实时语音识别和替换功能
模型优化 : 进一步优化模型性能和速度
用户管理 : 添加用户认证和权限管理功能
8. 总结
本项目实现了一个完整的视频语音处理工具,包含视频语音识别、文本提取、录音替换等功能。同时,提供了Whisper模型的微调模块,允许用户根据自己的需求优化语音识别效果。项目采用模块化设计,各组件之间相对独立,便于维护和扩展。
后端使用Python Flask框架构建,实现了核心的视频处理和语音识别功能。预训练模块实现了Whisper模型的完整微调流程,包括数据准备、模型训练、评估等组件。整个系统提供了直观的Web界面,便于用户使用。
微信扫一扫关注该公众号
继续滑动看下一个