from flask import Flask, render_template, request, jsonify import sys import os import gzip import shutil import warnings from huggingface_hub import hf_hub_download from predictor import load_models, predict_text # 警告を抑制 warnings.filterwarnings("ignore", category=UserWarning) warnings.filterwarnings("ignore", message="Distant resource does not have an ETag") # ETagチェックを無効にする環境変数を設定 os.environ['HF_HUB_DISABLE_TELEMETRY'] = '1' os.environ['TRANSFORMERS_OFFLINE'] = '0' app = Flask(__name__) def download_and_extract_models(): """Hugging Face Hubからモデルをダウンロードして展開""" try: print("=== モデルダウンロード開始 ===") # リポジトリ名(あなたのユーザー名に変更してください) repo_name = "vola2004/bert-japanese-age-gender" # ここを変更してください # モデルファイルをダウンロード model_files = [ "bert_age_model.bin", "bert_gender_model.bin" ] for model_file in model_files: if not os.path.exists(model_file): print(f"📥 {model_file} をダウンロード中...") try: hf_hub_download( repo_id=repo_name, filename=model_file, local_dir=".", force_download=True, resume_download=False ) print(f"✅ {model_file} のダウンロードが完了しました") except Exception as download_error: print(f"❌ {model_file} のダウンロードに失敗: {download_error}") return False else: print(f"✅ {model_file} は既に存在します") return True except Exception as e: print(f"❌ ダウンロードエラー: {e}") return False # モデルのダウンロード、展開、読み込み print("=== アプリケーション初期化 ===") # モデルをダウンロード・展開 if download_and_extract_models(): # モデルの読み込み print("=== モデル読み込み開始 ===") try: load_models() print("✅ モデルの読み込みが完了しました") except Exception as e: print(f"❌ モデルの読み込みに失敗しました: {e}") print("⚠️ モデルファイルが存在しない可能性があります") print("⚠️ 予測機能は利用できません") else: print("❌ モデルのダウンロード・展開に失敗しました") print("⚠️ 予測機能は利用できません") @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': # POSTリクエストの場合は予測処理を実行 try: text = request.form.get('text', '') print(f"=== 予測リクエスト受信 ===", flush=True) print(f"入力テキスト: '{text}'", flush=True) sys.stdout.flush() if not text.strip(): print("⚠️ 空のテキストが入力されました", flush=True) sys.stdout.flush() return render_template('index.html', input_text=text, error='テキストを入力してください。') # 予測実行 result = predict_text(text) print(f"✅ 予測完了: {result}", flush=True) sys.stdout.flush() return render_template('index.html', input_text=text, result=result) except Exception as e: print(f"❌ 予測エラー: {e}", flush=True) sys.stdout.flush() return render_template('index.html', input_text=text, error=str(e)) else: # GETリクエストの場合は通常のページ表示 return render_template('index.html') @app.route('/predict', methods=['POST']) def predict(): try: data = request.get_json() text = data.get('text', '') print(f"=== 予測リクエスト受信 ===", flush=True) print(f"入力テキスト: '{text}'", flush=True) sys.stdout.flush() if not text.strip(): print("⚠️ 空のテキストが入力されました", flush=True) sys.stdout.flush() return jsonify({ 'error': 'テキストを入力してください。' }) # 予測実行 result = predict_text(text) print(f"✅ 予測完了: {result}", flush=True) sys.stdout.flush() return jsonify({ 'age_percentages': result['age_percentages'], 'gender_percentages': result['gender_percentages'] }) except Exception as e: print(f"❌ 予測エラー: {e}", flush=True) sys.stdout.flush() return jsonify({'error': str(e)}) if __name__ == '__main__': # 環境変数でデバッグモードを制御(デフォルトはFalse) debug_mode = os.environ.get('FLASK_DEBUG', 'False').lower() == 'true' app.run(debug=debug_mode, host='0.0.0.0', port=5002)