自動ラップ調音MADツール
2026-05-21
ラップ調音MADツールを自動で作ってみる試み。
ざっくりとした設計をしつつ、それについて組んでみるも、まだまだ詰め切れない部分があり現在挫折中。 とりあえず音TOUCHには暫定的な部分で挑む事になった。 映像の仕組みは乗せてないけど、文字起こしとタイムスタンプからelectronで文字を表示させた感じ。
Step 1: 音声解析
入力
input/adachi.wav
処理の流れ
adachi.wav
│
▼
faster-whisper (model=small, language=ja)
wav を文字起こし
↓
辞書で修正 (dictionary.txt)
whisper の誤認識を修正。例: 「知りゴミ」→「尻込み」
↓
MFA(Montreal Forced Aligner)
wav と修正済み文字起こしからタイムスタンプを作成
この時点では、単語ごとのタイムスタンプしか分からず、
モーラ単位では分かれていない
※ spacy + Sudachi が入っていないとMFAは日本語を認識できない
→ MFAの日本語トークン化を担当
↓
fugashi (辞書: unidic-lite)
単語をモーラに分解
モーラごとのタイムスタンプを取得する手段がないため、
暫定的に時間を文字数で単純分割 (ここは結構致命的)
↓
この時点で、モーラのなんとなくの開始時間は掴めているが、
モーラのオンセット(モーラ内で音が知覚的に「始まる」と感じられる瞬間、
アタックポイント的な部分)は検出できていない
↓
ratio 方式 onset 検出
onset = start + dur × 子音種別比率
で onset を計算
ratio 方式の子音種別比率
| 種別 | 例 | 比率 | 特徴 |
|---|---|---|---|
| 鼻音 | ナ/マ | 0.23 | 子音の時点で声帯振動が始まる、立ち上がりが早い |
| 半母音 | ワ/ヤ | 0.26 | ほぼ母音に近い |
| 母音 | ア/イ | 0.34 | 立ち上がりに若干時間がかかる |
| 有声破裂音 | ガ/ダ | 0.33 | 破裂の前に声帯振動がある |
| 摩擦音 | サ/ハ | 0.34 | 摩擦が続いた後で母音に |
| 流音 | ラ | 0.36 | はじき音、やや遅め |
| 無声破裂音 | カ/タ/パ | 0.50 | 閉鎖→破裂までが長い、モーラの中央付近 |
使っているライブラリ
faster-whisper, MFA, spacy+Sudachi, fugashi+unidic-lite, librosa
Step 2: グリッド配置生成
グリッド構造
| モード | 小節の構成 | スロット数 | 1スロット |
|---|---|---|---|
| 16t(3連16分) | 6拍 × 4スロット | 24 | 109.9ms |
| 16(通常16分) | 4拍 × 4スロット | 16 | 164.8ms |
gap 判定ルール
gap = 隣り合うモーラのアタックポイント間の時間差
gap が 短い(0.50s未満) → そのまま右隣に置く
gap が 中くらい(0.50〜0.65s)→ 少し間を空けて、拍のキリがいい位置に置く
gap が 長い(0.65s以上) → 次の小節の先頭に置く
最初のモーラ → bar1, slot3 に置く(beat2 の3連目 = ラップの出だし)
使っているライブラリ
なし(Python標準ライブラリのみ。CSVを読み込んで計算するだけ)
Step 3: 連続区間ワープ WAVレンダリング
考え方
Ableton Live の warp のようなイメージ。 グリッドに合わせてアタックポイントを固定し、次のグリッドまで音を伸縮させる。
アルゴリズム
各モーラ i について:
1. ソース区間: onset[i] → onset[i+1]
(元音声のアタック間の連続区間)
※ 最終モーラは onset[i] → mora_end[i]
2. ターゲット区間: grid_time[i] → grid_time[i+1]
※ 最終モーラは 1スロット(16t: 110ms, 16: 165ms)
3. ストレッチ比率 = target / source
→ 0.5〜2.0 に制限(範囲外はキャップ)
4. ノイズ処理:
- 先頭: ゼロクロス位置への微調整(1ms以内)
- タイムストレッチ(pyrubberband → librosa → 線形補間の順にフォールバック)
- 先頭フェードイン(3ms サインカーブ)
- 末尾フェードアウト(15ms コサインカーブ)
5. grid_time[i] の位置に配置(+= でミックス)
使っているライブラリ
pyrubberband, librosa, numpy, soundfile
使用ライブラリ一覧
音声処理
| ライブラリ | URL | 使われている場所 | 説明 |
|---|---|---|---|
| faster-whisper | GitHub | Step 1 | OpenAI Whisper の高速再実装、音声→文字起こし |
| Montreal Forced Aligner | GitHub | Step 1 | 音声波形とテキストの強制アライメントで高精度タイムスタンプを生成 |
| pyrubberband | GitHub | Step 3 | Rubber Band Library のラッパー、ピッチを保ったまま音声を伸縮 |
日本語解析
| ライブラリ | URL | 使われている場所 | 説明 |
|---|---|---|---|
| fugashi | GitHub | Step 1 | MeCab の Python ラッパー、単語からカタカナ読みを取得 |
| unidic-lite | GitHub | Step 1 | fugashi 用の軽量日本語辞書 |
| spaCy | GitHub | Step 1 | MFA が内部で使う自然言語処理ライブラリ |
| SudachiPy | GitHub | Step 1 | spaCy 用の日本語形態素解析エンジン |
| sudachidict-core | GitHub | Step 1 | Sudachi のコア辞書 |