Spaces:
Build error
Build error
| import gradio as gr | |
| import torch | |
| import os | |
| import gzip | |
| import shutil | |
| from predictor import load_models, predict_text | |
| def extract_compressed_models(): | |
| """圧縮されたモデルファイルを展開""" | |
| try: | |
| print("=== 圧縮モデルファイルの展開 ===") | |
| # 圧縮ファイルを展開 | |
| compressed_files = [ | |
| ("bert_age_model.bin.gz", "bert_age_model.bin"), | |
| ("bert_gender_model.bin.gz", "bert_gender_model.bin") | |
| ] | |
| for compressed_file, extracted_file in compressed_files: | |
| if os.path.exists(compressed_file) and not os.path.exists(extracted_file): | |
| print(f"📦 {compressed_file} を展開中...") | |
| with gzip.open(compressed_file, 'rb') as f_in: | |
| with open(extracted_file, 'wb') as f_out: | |
| shutil.copyfileobj(f_in, f_out) | |
| print(f"✅ {extracted_file} の展開が完了しました") | |
| elif os.path.exists(extracted_file): | |
| print(f"✅ {extracted_file} は既に存在します") | |
| else: | |
| print(f"❌ {compressed_file} が見つかりません") | |
| return True | |
| except Exception as e: | |
| print(f"❌ 展開エラー: {e}") | |
| return False | |
| def predict_age_gender(text): | |
| """年代・性別予測関数""" | |
| if not text.strip(): | |
| return "テキストを入力してください。", "", "" | |
| try: | |
| result = predict_text(text) | |
| # 年代予測結果を整形 | |
| age_results = [] | |
| for age, percentage in result['age_percentages'].items(): | |
| age_results.append(f"{age}: {percentage}%") | |
| age_text = "\n".join(age_results) | |
| # 性別予測結果を整形 | |
| gender_results = [] | |
| for gender, percentage in result['gender_percentages'].items(): | |
| gender_results.append(f"{gender}: {percentage}%") | |
| gender_text = "\n".join(gender_results) | |
| # 最も高い確率の年代を特定 | |
| max_age = max(result['age_percentages'].items(), key=lambda x: x[1]) | |
| max_gender = max(result['gender_percentages'].items(), key=lambda x: x[1]) | |
| summary = f"推定結果: {max_age[0]} ({max_age[1]}%), {max_gender[0]} ({max_gender[1]}%)" | |
| return summary, age_text, gender_text | |
| except Exception as e: | |
| return f"エラーが発生しました: {str(e)}", "", "" | |
| # モデルの展開と読み込み | |
| print("=== アプリケーション初期化 ===") | |
| # 圧縮ファイルを展開 | |
| if extract_compressed_models(): | |
| # モデルの読み込み | |
| print("=== モデル読み込み開始 ===") | |
| try: | |
| load_models() | |
| print("✅ モデルの読み込みが完了しました") | |
| except Exception as e: | |
| print(f"❌ モデルの読み込みに失敗しました: {e}") | |
| print("⚠️ モデルファイルが存在しない可能性があります") | |
| else: | |
| print("❌ モデルの展開に失敗しました") | |
| # Gradioインターフェース | |
| interface = gr.Interface( | |
| fn=predict_age_gender, | |
| inputs=gr.Textbox( | |
| label="日本語テキストを入力してください", | |
| placeholder="例: 今日はとても良い天気ですね。友達と一緒に散歩をしました。", | |
| lines=3 | |
| ), | |
| outputs=[ | |
| gr.Textbox(label="推定結果サマリー"), | |
| gr.Textbox(label="年代予測詳細"), | |
| gr.Textbox(label="性別予測詳細") | |
| ], | |
| title="🧠 年代・性別推定システム", | |
| description="日本語テキストから年代と性別を推定するAIシステムです。", | |
| examples=[ | |
| "今日はとても良い天気ですね。", | |
| "友達と一緒に散歩をしました。", | |
| "新しいスマートフォンを買いました。", | |
| "仕事が忙しくて疲れました。" | |
| ], | |
| theme=gr.themes.Soft() | |
| ) | |
| # アプリケーション起動 | |
| if __name__ == "__main__": | |
| interface.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=False # Hugging Face SpacesではFalse | |
| ) | |