Spaces:
Running
Running
from flask import Flask, request, jsonify, render_template, send_from_directory | |
import base64 | |
from pydub import AudioSegment # 変換用にpydubをインポート | |
import os | |
import shutil | |
from process import AudioProcessor | |
process=AudioProcessor() | |
app = Flask(__name__) | |
users = ["ccc"] | |
# トップページ(テンプレート: index.html) | |
def index(): | |
return render_template('index.html', users = users) | |
# フィードバック画面(テンプレート: feedback.html) | |
def feedback(): | |
return render_template('feedback.html') | |
# 会話詳細画面(テンプレート: talkDetail.html) | |
def talk_detail(): | |
return render_template('talkDetail.html') | |
# 音声登録画面(テンプレート: userRegister.html) | |
def userregister(): | |
return render_template('userRegister.html') | |
# 音声アップロード&解析エンドポイント | |
def upload_audio(): | |
try: | |
data = request.get_json() | |
if not data or 'audio_data' not in data or 'name' not in data: | |
return jsonify({"error": "音声データまたは名前がありません"}), 400 | |
# Base64デコードして音声バイナリを取得 | |
audio_binary = base64.b64decode(data['audio_data']) | |
name = data['name'] # 名前を取得 | |
audio_dir = "/tmp/data" | |
os.makedirs(audio_dir, exist_ok=True) | |
# 固定ファイル名(必要に応じて generate_filename() で一意のファイル名に変更可能) | |
audio_path = os.path.join(audio_dir, f"{name}.wav") | |
with open(audio_path, 'wb') as f: | |
f.write(audio_binary) | |
# 参照音声ファイルのパスを指定(sample.wav を正しい場所に配置すること) | |
reference_audio = os.path.abspath("/tmp/data/base_audio/", f"{name}.wav") | |
if not os.path.exists(reference_audio): | |
return jsonify({"error": "参照音声ファイルが見つかりません", "details": reference_audio}), 500 | |
# 音声解析:参照音声とアップロードされた音声との類似度をセグメント毎に計算 | |
# threshold の値は調整可能です(例: 0.1) | |
if(users.length > 2): | |
print("複数人の場合の処理") | |
else: | |
matched_time, unmatched_time = process.process_audio(reference_audio, audio_path, threshold=0.05) | |
total_time = matched_time + unmatched_time | |
rate = (matched_time / total_time) * 100 if total_time > 0 else 0 | |
return jsonify({"rate": rate}), 200 | |
except Exception as e: | |
print("Error in /upload_audio:", str(e)) | |
return jsonify({"error": "サーバーエラー", "details": str(e)}), 500 | |
def upload_base_audio(): | |
try: | |
data = request.get_json() | |
if not data or 'audio_data' not in data or 'name' not in data: | |
return jsonify({"error": "音声データまたは名前がありません"}), 400 | |
name = data['name'] # 名前を取得 | |
users.append(name) | |
audio_path=process.save_audio_from_base64( | |
base64_audio=data['audio_data'], # 音声データ | |
output_dir= "/tmp/data", #保存先 | |
output_filename=f"{name}.wav" # 固定ファイル名(必要に応じて generate_filename() で一意のファイル名に変更可能) | |
) | |
return jsonify({"state": "Registration Success!", "path": audio_path}), 200 | |
except Exception as e: | |
print("Error in /upload_base_audio:", str(e)) | |
return jsonify({"error": "サーバーエラー", "details": str(e)}), 500 | |
if __name__ == '__main__': | |
port = int(os.environ.get("PORT", 7860)) | |
app.run(debug=True, host="0.0.0.0", port=port) |