import argparse import sys from config import load_config from csv_loader import load_questions from interviewer import Interviewer def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="AI面接システム - 音声による自動面接・評価ツール" ) parser.add_argument( "--questions", type=str, default=None, help="質問CSVファイルのパス (デフォルト: data/questions.csv)", ) parser.add_argument( "--output", type=str, default=None, help="レポート出力ディレクトリ (デフォルト: output/)", ) parser.add_argument( "--dry-run", action="store_true", help="テキストモードで実行(マイク不要)", ) parser.add_argument( "--whisper-model", type=str, default=None, choices=["tiny", "base", "small", "medium", "large"], help="Whisperモデルサイズ (デフォルト: base)", ) return parser.parse_args() def main() -> int: args = parse_args() try: config = load_config() except ValueError as e: print(f"設定エラー: {e}") return 1 if args.questions: config.questions_path = args.questions if args.output: config.output_dir = args.output if args.whisper_model: config.whisper_model = args.whisper_model if args.dry_run: config.dry_run = True try: questions = load_questions(config.questions_path) print(f"質問ファイル読み込み完了: {len(questions)}問") except (FileNotFoundError, ValueError) as e: print(f"質問ファイルエラー: {e}") return 1 print() print("=" * 40) print(" AI 面接システム") print("=" * 40) print(f" 質問数: {len(questions)}") print(f" 合格ライン: {config.pass_threshold * 100:.0f}%") print(f" モード: {'テキスト (dry-run)' if config.dry_run else '音声'}") if not config.dry_run: print(f" Whisperモデル: {config.whisper_model}") print("=" * 40) print() interviewer = Interviewer(config, questions) try: interviewer.run() except KeyboardInterrupt: print("\n\n面接を中断しました。") return 1 return 0 if __name__ == "__main__": sys.exit(main())