0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【卒研開発記録】iPhone録音 → Pythonサーバへ送信 → 音程分析フィードバックの自動化! 第二歩目

Posted at

こんにちは、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のログでサーバーからの応答を確認しています。
スクリーンショット 2025-07-08 19.07.36.png

iPhoneシミュレータ画面

スクリーンショット 2025-07-08 19.08.38.png

今回詰まったこと

今回は特に詰まることなく、録音・送信・解析までスムーズに実装できました。

機能 状態
録音・再生 実装済み
ファイル送信 実装済み
サーバー受信・保存 実装済み
簡易librosa分析・点数化 実装済み
簡易コメント生成 実装済み
アプリ上でのコメント表示 次回対応予定

次のステップ

iPhone上にスコア・コメントを表示

抑揚・リズムの要素も追加して多角的に分析

ユーザーの成長を可視化する推移グラフの導入

まとめ

ここまで読んでくださってありがとうございます!
次回は「ピッチ変動のグラフ化」や「抑揚評価の追加」について書いていきます

よければ LGTM やフォローをお願いします!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?