こんにちは、tenj1n です。
卒業研究では「歌唱力を客観的に可視化・改善できるアプリ」を開発しています。
今回はその中でも以下の実装を達成しました:
- iPhoneで録音 → Pythonサーバに送信
- librosaで音程の揺れを分析
- 点数化とコメント生成
- Xcodeのログ上で確認できるフィードバック表示
🔧 技術構成
構成要素 | 技術 |
---|---|
フロント | SwiftUI(iOSアプリ) |
音声処理 | AVFoundation(録音・再生) |
バックエンド | Flask(音声受信・分析) |
音声解析 | librosa(Python) |
フィードバック | Pythonによるスコア計算&メッセージ生成 |
今回の実装ポイント
1. iPhoneでの録音 → 音声ファイル送信
録音・再生・サーバー送信の流れを AudioRecorder
クラスに集約。
func stopRecording() {
audioRecorder?.stop()
print("録音停止")
sendToServer() // 録音停止と同時に送信
}
.m4a 形式で保存し、録音停止後すぐにサーバへ送信します。
2. multipart/form-data でFlaskへ送信
Swift側では boundary付きで手動でHTTPボディを構築:
let boundary = "Boundary-\(UUID().uuidString)"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
Python側は Flask の request.files で受信し、ファイルを保存:
file = request.files['file']
file.save(save_path)
3. librosa で音程の揺れを分析・点数化
def analyze_pitch(wav_path):
y, sr = librosa.load(wav_path)
f0, voiced_flag, _ = librosa.pyin(y, sr=sr)
score = int(100 - np.nanstd(f0) * 2)
return max(0, min(score, 100))
標準偏差を用いてピッチの安定性をスコア化しています。
4. 点数に応じてコメント生成
def generate_feedback(score):
if score >= 80:
return "安定したピッチで素晴らしいです!"
elif score >= 50:
return "少し揺れがあります。音をキープする練習をしてみましょう。"
else:
return "音程が大きく揺れています。一定の高さを保つトレーニングが効果的です。"
簡易的ではありますが改善の方向性が伝わるよう、具体的なアドバイスを返すことを意識しています。
現在の実行結果
アプリ上ではまだコメント表示は未対応ですが、Xcodeのログでサーバーからの応答を確認しています。
iPhoneシミュレータ画面
今回詰まったこと
今回は特に詰まることなく、録音・送信・解析までスムーズに実装できました。
機能 | 状態 |
---|---|
録音・再生 | 実装済み |
ファイル送信 | 実装済み |
サーバー受信・保存 | 実装済み |
簡易librosa分析・点数化 | 実装済み |
簡易コメント生成 | 実装済み |
アプリ上でのコメント表示 | 次回対応予定 |
次のステップ
iPhone上にスコア・コメントを表示
抑揚・リズムの要素も追加して多角的に分析
ユーザーの成長を可視化する推移グラフの導入
まとめ
ここまで読んでくださってありがとうございます!
次回は「ピッチ変動のグラフ化」や「抑揚評価の追加」について書いていきます
よければ LGTM やフォローをお願いします!