Spaces:
Runtime error
Runtime error
#!/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() |