mysheep

自動ラップ調音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 のコア辞書