""" 快速转录方案:如果本地Whisper太慢,尝试其他方法 """ import os import subprocess from pathlib import Path import json def extract_audio_from_video(video_path): """从视频提取音频""" audio_path = video_path.with_suffix(".wav") print(f"提取音频: {video_path.name} → {audio_path.name}") cmd = [ "ffmpeg", "-y", "-i", str(video_path), "-vn", "-acodec", "pcm_s16le", "-ar", "16000", "-ac", "1", str(audio_path), ] result = subprocess.run(cmd, capture_output=True, text=True) if result.returncode != 0: print(f"音频提取失败: {result.stderr}") return None print(f"✅ 音频提取完成: {audio_path.stat().st_size / 1024 / 1024:.2f} MB") return audio_path def check_whisper_availability(): """检查Whisper是否可用""" try: import whisper print("✅ Whisper已安装") return True except ImportError: print("❌ Whisper未安装") return False def transcribe_with_whisper(audio_path): """使用Whisper转录""" try: import whisper print("加载Whisper模型...") # 使用最小的模型加快速度 model = whisper.load_model("tiny") print("开始转录...") result = model.transcribe(str(audio_path), language="zh") return result except Exception as e: print(f"Whisper转录失败: {e}") return None def save_transcription(result, video_path): """保存转录结果""" if not result: return False # 保存文本 txt_path = video_path.with_suffix(".txt") with open(txt_path, "w", encoding="utf-8") as f: f.write(result["text"]) print(f"✅ 转录文本保存到: {txt_path.name}") print(f"文本长度: {len(result['text'])} 字符") # 保存完整结果(JSON) json_path = video_path.with_suffix(".json") with open(json_path, "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False, indent=2) print(f"✅ 完整结果保存到: {json_path.name}") # 预览 print("\n=== 转录预览(前500字符)===") preview = result["text"][:500] print(preview + "..." if len(result["text"]) > 500 else preview) return True def main(): print("=== 视频转录程序 ===") # 查找视频文件 video_dir = Path(r"D:\F\NewI\opencode\daily-workspace\temp") video_files = list(video_dir.glob("*.mp4")) if not video_files: print("❌ 未找到mp4文件") return video_path = video_files[0] print(f"处理视频: {video_path.name}") print(f"文件大小: {video_path.stat().st_size / 1024 / 1024:.2f} MB") # 检查是否已有转录文件 txt_path = video_path.with_suffix(".txt") if txt_path.exists(): print(f"✅ 已有转录文件: {txt_path.name}") with open(txt_path, "r", encoding="utf-8") as f: text = f.read() print(f"文本长度: {len(text)} 字符") print("\n=== 现有转录预览 ===") print(text[:500] + "..." if len(text) > 500 else text) return # 提取音频 audio_path = extract_audio_from_video(video_path) if not audio_path: print("❌ 无法提取音频") return # 检查Whisper if not check_whisper_availability(): print("请安装Whisper: pip install openai-whisper") return # 转录 result = transcribe_with_whisper(audio_path) if not result: print("❌ 转录失败") return # 保存结果 if save_transcription(result, video_path): print("\n✅ 转录完成!") # 清理临时音频文件 if audio_path.exists(): audio_path.unlink() print("临时音频文件已删除") else: print("❌ 保存转录结果失败") if __name__ == "__main__": main()