Loopit – フレーズを区間ループして練習するアプリ

Loopit – 同じフレーズを何度でも。ループ単位で磨き続ける練習アプリ

Loopit は、歌や英語フレーズ、楽器フレーズなどを「区間ループ」に切り出して、 再生→自分で発声/演奏→録音→比較をワンタップで繰り返せる Android アプリです。
短いループを何度も回すことで、感覚的な練習ではなく、 「1フレーズずつ確実に上達している感覚」を得られることを目指しています。

作品の説明

歌やスピーチを練習するとき、1曲まるごと流しながら練習しても、 本当に直したい箇所はごく一部であることが多いです。 Loopit は、その「直したい一部」だけを切り出して、徹底的にループ再生するためのアプリです。

既存の音声ファイルや動画から A–B 区間を指定すると、 その部分だけを連続再生。 同時にマイク入力を録音し、波形やスペクトログラム上で 「元の音」と「自分の音」を並べて比較できます。 ループごとの達成度や回数を記録することで、 練習ログとしても機能します。

  • ① 音声/動画ファイルを読み込み
  • ② RangeSlider でループ区間を指定
  • ③ ループ再生しながらマイクを録音
  • ④ 元音と自分の音をスペクトログラム/F0で比較
  • ⑤ ループ単位で練習回数とメモを保存
  • ⑥ 練習ログを後から一覧・グラフで閲覧

システム概要

Loopit システム構成図

Media3 ExoPlayer で音源を再生しつつ、AudioRecord でマイクからの入力を取得します。 ループの開始・終了位置や、ユーザーのメモ/タグは Room に保存され、 各ループは「練習単位(LoopUnit)」として管理されます。

技術スタック

  • Android / UI: Kotlin, Jetpack Compose, Media3 (ExoPlayer), RangeSlider
  • Audio / DSP: AudioRecord, STFT, KissFFT, F0 推定
  • Data: Room, ViewModel, Coroutines, Flow

主要コンポーネント

  • PlayerController: Media3 を用いた再生制御。A–B ループの位置を管理し、 ループが終点に到達したら自動的に先頭へジャンプ。
  • LoopEditorScreen: 波形/スペクトログラムの上に RangeSlider を重ねて、 開始・終了位置を視覚的に指定できる画面。
  • MicCaptureService: マイクからの音声を AudioRecord で取得し、 STFT でスペクトログラム化した上で UI にストリーミング表示。
  • LoopRepository: ループのメタ情報(開始・終了サンプル, タグ, 練習回数, メモ)を Room で管理。
  • PracticeLogScreen: ループごとの練習回数・経過時間をグラフで表示し、 上達の軌跡を可視化。

技術解説

LOOP UI

波形の上で A–B 区間を直感的に編集

ただの「シークバー」ではなく、波形ビューの上に RangeSlider を重ねることで、 息継ぎや子音の位置を見ながらループ区間を決められるようにしています。 開始/終了ハンドルをドラッグすると、その位置にスナップするようにし、 細かい調整もやりやすくしました。

・オーディオのピークを簡易的にダウンサンプリングして波形表示
・RangeSlider の値をサンプルインデックスにマッピング
・ループ区間外はグレーアウトして視覚的に区別
SPECTROGRAM / F0

元音と自分の声をスペクトログラムで並べて比較

ループ再生中は、 ・上段:元の音源のスペクトログラム(事前計算) ・下段:自分の声のスペクトログラム(リアルタイム) を縦に並べて表示します。 さらに、各フレームで F0 を抽出し、2 本のラインとして重ねることで、 ピッチのずれを一目で把握できるようにしています。

・短時間フーリエ変換(STFT)でスペクトログラム生成
・ケプストラム/ピーク検出で F0 推定
・差分 dB を色の濃淡で表現する差分スペクトログラムも検討中
PRACTICE LOG

ループを「問題集の1問」のように管理する

Loopit では、1つのループを「1問の練習問題」として扱います。 各ループに対して「今日何回回したか」「いつクリア判定にしたか」 といった情報を記録し、 線形代数の問題集を解く感覚で、歌やフレーズを潰していける設計を目指しました。

・LoopUnit: id, startSample, endSample, tag, memo, difficulty,...
・PracticeSession: loopId, timestamp, repeatCount, selfScore,...
・LoopUnit ごとのスパークライン(小さな折れ線グラフ)で進捗を表示
EEG INTEGRATION

将来的には「集中しやすいループ」を見つける

脳波(Muse-S)や心拍のログと組み合わせることで、 「どのフレーズを練習しているときに一番集中できているか」 「どこから先は集中が落ちやすいか」 といった情報を抽出する構想もあります。 Loopit は、そのための「ループ単位のタイムスタンプ付きログ」としても機能します。

・各ループ開始/終了時刻を高精度に記録
・EEG ログとタイムラインを同期し、集中度ヒートマップを重ねる設計を検討中

実験・結果・課題

ボーカルフレーズでの検証

自分の歌声と、目標とする Vtuber の歌声を 1 フレーズずつループしながら比較し、 F0 のズレやビブラートの深さの違いを確認しました。 感覚ではなく、スペクトログラムとラインとして可視化されることで、 「どこまで寄ってきたか」を数値として把握できます。

ループなしで1曲通し再生している様子
(a) ループ前:1曲通しの練習で曖昧な反省
Loopitで区間ループしながら比較している様子
(b) ループ後:1フレーズを徹底的に詰める練習

現在の課題

現状のバージョンでは、 ・長時間の録音でメモリ使用量が増える ・F0 が不安定な箇所(息・ささやき声など)の可視化 などに課題があります。 また、UI 上での操作負荷(ハンドルの細かいドラッグ)をどう減らすかも 今後の改善ポイントです。

長時間録音時のメモリ最適化が未完 F0 不安定区間の扱いを検討中

動画リンク

Loopit を使って、歌のワンフレーズを切り出し、 区間ループしながら自分の声と比較している様子のデモ動画です。

フレーズの A–B 区間指定 → ループ再生 → 自分の声の録音と比較

まだできていない部分と今後

「Loop 単位の練習プラットフォーム」へ

将来的には、Loopit を単独のアプリではなく、 ・英語発音練習(Englishing) ・歌唱トレーニング(スペクトログラムアプリ) ・EEG/集中度計測 といった他のプロジェクトと連携させて、 「1つのループを、いろいろな角度から磨けるプラットフォーム」 に育てたいと考えています。

  • 短期: ループ編集 UI のブラッシュアップ、F0 差分の安定化。
  • 中期: Englishing と連携し、英語フレーズごとのループ練習モードを実装。
  • 長期: EEG・心拍との同期による「集中しやすい/しにくいフレーズ」の分析。

これからの改善点と開発計画

UI/UX・オーディオ処理・他アプリとの連携の3軸で進めます。

  • UI/UX: 片手操作でのループ微調整、ショートカット操作。
  • オーディオ処理: F0 推定の高速化・安定化、差分スペクトログラムのチューニング。
  • 連携: 他トレーニングアプリと共通の LoopID で同期。
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ループ編集 UI の改善
F0 差分の安定化・可視化
Englishing / EEG との連携設計

このプロジェクトを通して

感じていること

これまで、歌や英語の練習は「1曲通し」でやることが多く、 どこが改善されたのか分かりにくいものでした。 Loopit を作りながら、「練習もアルゴリズムと同じで、 単位を小さく刻んで、一つずつ最適化していくべきだ」と改めて感じました。

自分の声が、目標とする声に少しずつ近づいていくのを スペクトログラムや F0 のラインで見るのは、 数学の証明が一歩ずつ積み上がっていく感覚に近いです。 技育博のプロジェクト群の中でも、 「自分自身をアップデートするためのツール」として大事に育てていきたいです。

今の自分へのメモ

  • ・Loopit の LoopUnit を、他のアプリ(英語・EEG・歌)と共通の軸にすること。
  • ・「練習の気合い」ではなく、「練習設計のうまさ」で勝負すること。

リファレンス & リンク

リファレンス

  • AndroidX Media3 – ExoPlayer / Audio 再生
  • Android Developers – AudioRecord
  • 信号処理・音声分析の教科書(STFT / F0 推定関連)

リンク