Files
WYF-koubo/python/test_sentiment_subtitles.py
T
2026-06-19 18:45:55 +08:00

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())