206 lines
6.1 KiB
Python
206 lines
6.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
测试情感驱动的字幕生成功能
|
|
Test Sentiment-Driven Subtitle Generation
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import json
|
|
import tempfile
|
|
|
|
def create_test_config():
|
|
"""创建测试配置"""
|
|
config = {
|
|
'videoPath': 'test_video.mp4', # 需要替换为实际视频路径
|
|
'scriptText': """今天真是太开心了!
|
|
这个产品质量很糟糕。
|
|
明天我们去公园玩。
|
|
这个电影太精彩了!
|
|
天气不好,我很失望。
|
|
普通的一天,没什么特别的。""",
|
|
'subtitleStyle': 'default', # 这会被情感分析覆盖
|
|
'coverStyle': 'default',
|
|
'outputDir': './test_output',
|
|
'useFunasr': False, # 使用文本模式
|
|
'coverOnly': False
|
|
}
|
|
|
|
return config
|
|
|
|
def test_sentiment_analysis():
|
|
"""测试情感分析功能"""
|
|
print("=" * 60)
|
|
print("测试情感分析功能")
|
|
print("=" * 60)
|
|
|
|
try:
|
|
from subtitle_cover_generator_simple import SubtitleCoverGenerator
|
|
|
|
config = create_test_config()
|
|
generator = SubtitleCoverGenerator(config)
|
|
|
|
# 测试句子
|
|
test_sentences = [
|
|
"今天真是太开心了!", # 应该是positive
|
|
"这个产品质量很糟糕。", # 应该是negative
|
|
"明天我们去公园玩。", # 应该是neutral
|
|
"这个电影太精彩了!", # 应该是positive (强)
|
|
"天气不好,我很失望。", # 应该是negative
|
|
]
|
|
|
|
print("\n逐句情感分析测试:")
|
|
print("-" * 60)
|
|
|
|
for sentence in test_sentences:
|
|
result = generator.analyze_sentence_sentiment(sentence)
|
|
sentiment = result['sentiment']
|
|
score = result['score']
|
|
style = generator.get_style_by_sentiment(sentiment, score)
|
|
|
|
print(f"\n句子: {sentence}")
|
|
print(f" 情感: {sentiment} (分数: {score:.4f})")
|
|
print(f" 推荐样式: {style}")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("✓ 情感分析功能测试通过!")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"\n✗ 情感分析测试失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def test_subtitle_generation():
|
|
"""测试字幕生成功能"""
|
|
print("\n" + "=" * 60)
|
|
print("测试字幕生成功能")
|
|
print("=" * 60)
|
|
|
|
try:
|
|
from subtitle_cover_generator_simple import SubtitleCoverGenerator
|
|
|
|
config = create_test_config()
|
|
generator = SubtitleCoverGenerator(config)
|
|
|
|
# 生成字幕
|
|
subtitles = generator.generate_subtitles()
|
|
|
|
print(f"\n生成了 {len(subtitles)} 条字幕:")
|
|
print("-" * 60)
|
|
|
|
for sub in subtitles:
|
|
print(f"\n[{sub['index']}] {sub['start_time']:.1f}s - {sub['end_time']:.1f}s")
|
|
print(f" 文本: {sub['text']}")
|
|
print(f" 情感: {sub.get('sentiment', 'N/A')} (分数: {sub.get('sentiment_score', 0):.4f})")
|
|
print(f" 样式: {sub.get('style', 'N/A')}")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("✓ 字幕生成功能测试通过!")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"\n✗ 字幕生成测试失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def test_ass_file_generation():
|
|
"""测试ASS字幕文件生成"""
|
|
print("\n" + "=" * 60)
|
|
print("测试ASS字幕文件生成")
|
|
print("=" * 60)
|
|
|
|
try:
|
|
from subtitle_cover_generator_simple import SubtitleCoverGenerator
|
|
|
|
config = create_test_config()
|
|
os.makedirs(config['outputDir'], exist_ok=True)
|
|
|
|
generator = SubtitleCoverGenerator(config)
|
|
|
|
# 生成字幕
|
|
subtitles = generator.generate_subtitles()
|
|
|
|
# 保存ASS文件
|
|
ass_path = generator.save_ass(subtitles)
|
|
|
|
# 读取并显示ASS文件内容
|
|
with open(ass_path, 'r', encoding='utf-8-sig') as f:
|
|
content = f.read()
|
|
|
|
print(f"\nASS文件已生成: {ass_path}")
|
|
print("\n文件内容预览 (前30行):")
|
|
print("-" * 60)
|
|
lines = content.split('\n')[:30]
|
|
for i, line in enumerate(lines, 1):
|
|
print(f"{i:3d}: {line}")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("✓ ASS字幕文件生成测试通过!")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"\n✗ ASS文件生成测试失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def print_summary():
|
|
"""打印功能说明"""
|
|
print("\n" + "=" * 60)
|
|
print("情感驱动字幕功能说明")
|
|
print("=" * 60)
|
|
print("""
|
|
工作原理:
|
|
1. 对每句话进行情感分析(使用Transformer模型或关键词匹配)
|
|
2. 根据情感类型和强度自动选择字幕样式:
|
|
|
|
情感类型 情感强度 字幕样式 视觉效果
|
|
--------------------------------------------------------
|
|
positive > 0.8 neon 霓虹样式-明亮彩色描边
|
|
positive <= 0.8 highlight 高亮样式-黄色背景
|
|
negative > 0.8 minimal 极简样式-低调细线
|
|
negative <= 0.8 card 卡片样式-半透明背景
|
|
neutral 任意 default 默认样式-白字黑边
|
|
|
|
3. 使用ASS字幕格式支持每个字幕不同的样式
|
|
4. FFmpeg将ASS字幕烧录到视频
|
|
|
|
使用方法:
|
|
- 自动模式: 系统自动根据情感选择样式
|
|
- 手动模式: 设置 force_style=True 强制使用指定样式
|
|
""")
|
|
|
|
def main():
|
|
"""主测试函数"""
|
|
print_summary()
|
|
|
|
tests = [
|
|
("情感分析", test_sentiment_analysis),
|
|
("字幕生成", test_subtitle_generation),
|
|
("ASS文件生成", test_ass_file_generation),
|
|
]
|
|
|
|
passed = 0
|
|
total = len(tests)
|
|
|
|
for test_name, test_func in tests:
|
|
if test_func():
|
|
passed += 1
|
|
|
|
print("\n" + "=" * 60)
|
|
print(f"测试结果: {passed}/{total} 通过")
|
|
print("=" * 60)
|
|
|
|
if passed == total:
|
|
print("🎉 所有测试通过! 情感驱动字幕功能已就绪!")
|
|
return 0
|
|
else:
|
|
print("⚠️ 部分测试未通过,请检查配置")
|
|
return 1
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main()) |