talkingAvater_bgk / test_performance.py
oKen38461's picture
app.pyに新しい機能を追加し、サンプルファイルの読み込み処理を改善しました。また、`requirements.txt`に新たに依存関係を追加しました。
ada2c6f
raw
history blame
5.86 kB
#!/usr/bin/env python3
"""
パフォーマンステストスクリプト
動画生成の各ステップの実行時間を計測
"""
import time
import logging
from test_api_client import TalkingHeadAPIClient
import os
# ロギング設定
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
class TimingStats:
def __init__(self):
self.stats = {}
self.start_times = {}
def start(self, name):
self.start_times[name] = time.time()
def end(self, name):
if name in self.start_times:
duration = time.time() - self.start_times[name]
self.stats[name] = duration
return duration
return None
def report(self):
print("\n=== パフォーマンス計測結果 ===")
total_time = sum(self.stats.values())
for name, duration in self.stats.items():
percentage = (duration / total_time) * 100 if total_time > 0 else 0
print(f"{name}: {duration:.2f}秒 ({percentage:.1f}%)")
print(f"\n合計時間: {total_time:.2f}秒")
# 音声ファイルの長さを取得
try:
import librosa
audio_path = "example/audio.wav"
y, sr = librosa.load(audio_path, sr=None)
audio_duration = len(y) / sr
print(f"音声ファイルの長さ: {audio_duration:.2f}秒")
print(f"処理時間比率: {total_time/audio_duration:.2f}x")
except Exception as e:
print(f"音声長さの取得失敗: {e}")
def test_performance():
"""パフォーマンステストを実行"""
timer = TimingStats()
# 全体の開始時間
timer.start("全体処理")
# クライアント初期化
timer.start("API接続")
try:
client = TalkingHeadAPIClient()
timer.end("API接続")
except Exception as e:
logging.error(f"クライアント初期化失敗: {e}")
return
# サンプルファイル
audio_path = "example/audio.wav"
image_path = "example/image.png"
# ファイル情報を表示
audio_size = os.path.getsize(audio_path) / 1024 / 1024 # MB
image_size = os.path.getsize(image_path) / 1024 / 1024 # MB
print(f"\n入力ファイル情報:")
print(f"- 音声: {audio_path} ({audio_size:.2f} MB)")
print(f"- 画像: {image_path} ({image_size:.2f} MB)")
# 動画生成
timer.start("動画生成(API呼び出し)")
try:
result = client.generate_video(audio_path, image_path)
video_data, status = result
timer.end("動画生成(API呼び出し)")
if video_data:
# 保存処理
timer.start("動画保存")
if isinstance(video_data, dict) and 'video' in video_data:
saved_path = client.save_with_timestamp(video_data['video'])
timer.end("動画保存")
# 出力ファイル情報
output_size = os.path.getsize(saved_path) / 1024 / 1024 # MB
print(f"\n出力ファイル情報:")
print(f"- 動画: {saved_path} ({output_size:.2f} MB)")
timer.end("全体処理")
timer.report()
print(f"\n✅ テスト成功!")
print(f"ステータス: {status}")
else:
print(f"\n❌ テスト失敗")
print(f"ステータス: {status}")
except Exception as e:
logging.error(f"エラー発生: {e}")
import traceback
traceback.print_exc()
def test_multiple_runs(runs=3):
"""複数回実行して平均時間を計測"""
print(f"\n=== {runs}回連続実行テスト ===")
times = []
for i in range(runs):
print(f"\n--- 実行 {i+1}/{runs} ---")
start = time.time()
try:
client = TalkingHeadAPIClient()
result = client.generate_video("example/audio.wav", "example/image.png")
if result[0]:
duration = time.time() - start
times.append(duration)
print(f"実行時間: {duration:.2f}秒")
except Exception as e:
print(f"エラー: {e}")
if times:
avg_time = sum(times) / len(times)
min_time = min(times)
max_time = max(times)
print(f"\n=== 統計 ===")
print(f"平均時間: {avg_time:.2f}秒")
print(f"最小時間: {min_time:.2f}秒")
print(f"最大時間: {max_time:.2f}秒")
def analyze_bottlenecks():
"""ボトルネック分析のための詳細テスト"""
print("\n=== ボトルネック分析 ===")
# ローカルファイルの読み込み時間
start = time.time()
with open("example/audio.wav", "rb") as f:
audio_data = f.read()
with open("example/image.png", "rb") as f:
image_data = f.read()
local_read_time = time.time() - start
print(f"ローカルファイル読み込み: {local_read_time:.3f}秒")
# ネットワーク遅延の推定(Hugging Face Spaceへのping相当)
import requests
start = time.time()
try:
response = requests.get("https://o-ken5481-talkingavater-bgk.hf.space", timeout=10)
network_time = time.time() - start
print(f"ネットワーク遅延(推定): {network_time:.3f}秒")
except:
print("ネットワーク遅延の測定失敗")
if __name__ == "__main__":
print("DittoTalkingHead パフォーマンステスト")
print("=" * 50)
# 1. 詳細な時間計測
test_performance()
# 2. 複数回実行テスト
# test_multiple_runs(3)
# 3. ボトルネック分析
analyze_bottlenecks()