
Kaleido Vocoder
声を帯域ごとの音量変化に分解し、シンセ音へ掛け合わせる
チャンネル・ボコーダー型ボイスチェンジャー。ファイルのアップロード変換と、
マイクのリアルタイム変換に対応します。
1. システム概要
Kaleido Vocoder は、入力した声から「どの周波数帯域がどれくらい鳴っているか」
という時間変化(包絡)だけを取り出し、ノコギリ波などのシンセ音(キャリア)へ
掛け合わせることで、ロボット声・レトロシンセ声を作るシステムです。
動作モードは2つあります。
アップロード変換モード
音声ファイルをサーバへ送り、Python(SciPy)で
高品質に一括変換して WAV を返す。録画・配布向け。
リアルタイム変換モード
マイク入力をブラウザ内(Web Audio API)で
即時変換。サーバへ音声を送らず低遅延。実演・会議向け。
2. 構成とファイル
Flask(Python)が画面とアップロード変換を担当し、リアルタイム変換は
ブラウザの JavaScript が単独で処理します。
kaleido_vocorder/ ├── app.py Flask本体 / アップロード変換のDSP(SciPy) ├── requirements.txt 依存パッケージ ├── run.sh 起動スクリプト ├── README.md ├── templates/ │ └── index.html 画面(UI) ├── static/ │ ├── css/style.css スタイル │ └── js/ │ ├── recorder.js アップロード用ブラウザ録音→WAV化 │ └── realtime_vocoder.js リアルタイム変換の全DSP ├── uploads/ アップロード/録音の一時保存 └── outputs/ 変換結果のWAV
3. アップロード変換モード
WAV / FLAC / OGG / AIFF を受け取り、サーバ側(app.py)で変換します。
オフライン処理のため、未来のサンプルも使える高品質な手法を採用しています。
処理の流れ
- 音声をモノラル化・正規化し、低域のゴロつきをハイパスで除去
- 90Hz〜約7kHz を対数間隔で 8〜32 バンドに分割
- 各バンドを Butterworth バンドパス +
sosfiltfilt(ゼロ位相)で抽出 - ヒルベルト変換で正確な包絡を取得 → 平滑化 → 平方根圧縮 →
パーセンタイル正規化(バンドごとの音量バランスを揃える) - キャリア波(Saw / Square / Sine Mix)を同じ帯域に分割し、包絡を掛けて加算
- 少量の原音をミックス →
tanhサチュレーション → 正規化 - 16bit PCM の WAV として保存・再生(最大90秒)
対応形式: WAV / FLAC / OGG / AIFF。MP3 は ffmpeg で WAV に変換してから使用します。
4. リアルタイム変換モード
ブラウザのマイク入力を Web Audio API のノードグラフで即時処理します。
サーバへ音声を送らないため低遅延で、Flask は画面配信のみを担当します。
信号の流れ
マイク ─▶ ハイパス55Hz ─┬─▶ [25バンド] バンドパス→整流→平滑化→感度 ─┐
│ (各バンドの包絡)│
│ キャリア(シンセ)──▶ バンドパス ──▶ ゲイン◀┘
│ │
└─▶ 子音補助(3.8kHz以上・自己ゲート)─────┤
▼
合算 ─▶ コンプレッサ ─▶ ソフトクリップ ─▶ マスターゲート
─▶ 高音ダンプ ─▶ 出力音量 ─▶ 出力デバイス
各バンドでは、声の包絡(音量の時間変化)がキャリア帯域のゲインを変調します。
これにより、声の音色の動きだけがシンセ音に乗り移ります。
5. リアルタイムの主な機能
マスターノイズゲート
入力全体の音量(RMS)を監視し、無音時は変換音をミュート、発話時に開きます。
しきい値はマイクのノイズフロアに自動追従。帯域ごとには手を加えないため、
開いている間の発話の明瞭度・音色バランスは損なわれません。
子音明瞭度の補助
「サ・シュ・タ・カ」などの子音はハーモニックなキャリアでは再現できません。
そこで声の 3.8kHz 以上の高域だけを取り出し、それ自身の包絡でゲートして
混ぜています。母音やピッチ成分を含まないので「生声」には聞こえず、無音時は閉じます。
フィルタ精度
各バンドのバンドパスと包絡の平滑化を2段カスケード化し、
帯域の分離を高めて混信・濁りを低減しています。
キャリア音程モード
| モード | 動作 |
|---|---|
| 固定 | 「基準音程」スライダーの音程でキャリアが鳴る。一定のロボ声。 |
| ピッチ追従 | 声の基本周波数を検出し、キャリアを追従させる。歌のメロディが ロボ声で出る。追従開始時の声を基準に、そこからの相対変化で動く。 |
| MIDI入力 | MIDIキーボードでキャリアの音程を演奏する(Web MIDI API)。 |
R2-D2 モード
キャリア波形で「R2-D2 / ピヨピヨ」を選ぶと、細いホイッスル音を
ランダムな音程シーケンサで「ピッ」「ピュイーン」と動かすドロイド風モードになります。
声の内容(言葉)は再現せず、話すリズムにだけ反応します。
高音ハウリング抑制
キャリアの基本周波数が高いほど出力を漸減し、帰還(ハウリング)ループの利得を
下げます。350Hz 以下は等倍、それ以上で段階的に減衰します。
出力デバイス選択
AudioContext.setSinkId() により、変換音の出力先デバイスを選べます。
仮想オーディオケーブルを選べば、Web会議アプリへ変換音を渡せます(第8章)。
6. パラメータ一覧(リアルタイム)
| 項目 | 範囲 / 既定 | 説明 |
|---|---|---|
| 基準音程 | 55–440 Hz / 110 | 固定モードのキャリア音程。 ピッチ追従では基準ピッチ、MIDIでは移調量。 |
| キャリア音程モード | 固定 / ピッチ追従 / MIDI | キャリアの音程を何で決めるか。 |
| バンド数 | 8–28 / 25 | 多いほど言葉が明瞭、少ないほど機械的。 |
| キャリア波形 | Saw / Square / Sine Mix / R2-D2 | シンセ音の種類。 |
| 原音ミックス | 0–0.20 / 0 | 原音を混ぜる量。混ぜすぎると普通の声に戻る。 |
| 出力音量 | 0–1 / 0.80 | 最終出力レベル。 |
| ボコーダー感度 | 4–80 / 14 | 包絡の増幅量。小さいと静か、大きいと歪む。 |
| 入力モニター | 0–0.6 / 0 | 生マイク音を出す量(動作確認用)。 |
| 出力先デバイス | 既定 / 任意 | 変換音を送る出力デバイス。 |
7. 使い方
起動
cd kaleido_vocorder python -m venv .venv # Windows: .venv\Scripts\activate / macOS・Linux: source .venv/bin/activate pip install -r requirements.txt python app.py # ブラウザで http://127.0.0.1:5000 を開く
アップロード変換
- 音声ファイルを選択(またはマイク録音ボタンでその場録音)
- 音色パラメータを設定して「変換する」
- 結果を再生・ダウンロード
リアルタイム変換
- 「リアルタイム開始」→ マイク許可を承認
- 入力レベルメーターが動くか確認(
GATE開/閉表示で開閉が分かる) - 波形・バンド数を変えたら「設定を反映」。音量・感度等はリアルタイム反映
ハウリング防止のためヘッドホン推奨です。
8. Web会議で使う
Zoom / Teams 等へ変換音を渡すには、仮想オーディオケーブル
(Windows: VB-CABLE、macOS: BlackHole 等)を橋渡しに使います。
マイク ─▶ ブラウザ(本アプリで変換)─▶ 仮想ケーブル ─▶ Zoom のマイク
- 仮想オーディオケーブルをインストール
- 本アプリの「出力先デバイス」で CABLE Input(再生側)を選択
- Zoom / Teams のマイクで CABLE Output(録音側)を選択
- 会議アプリ側のノイズ抑制・エコーキャンセルはオフ推奨
名前が紛らわしいですが、アプリが選ぶのは「CABLE Input」
(ケーブルへ音を入れる=OS上は再生デバイス)です。「CABLE Output」は Zoom 側で選びます。
9. 制限事項と注意
- 音質 — リアルタイムは低遅延と引き換えに、アップロード版
(オフラインのヒルベルト包絡・ゼロ位相フィルタ・帯域正規化)より簡略化されています。 - 背景タブ — ピッチ追従・マスターゲート・R2-D2 の制御は
ブラウザの描画タイミングで動くため、タブを背面にすると間引かれて止まります。
会議用途では本アプリのタブを前面に保つか、固定モードの利用を推奨します。 - ハウリング — スピーカー併用時はマイクが出力を拾います。
ヘッドホン使用が根本対策です。 - 対応ブラウザ — Chrome / Edge 系を推奨。MIDI入力・出力デバイス選択は
これらでのみ動作します。 - 音程 — ピッチ追従は単音のみ。和音は検出できません。
10. おすすめ設定
| 狙い | 設定 |
|---|---|
| 古いボコーダー風 | 基準音程 100–120 / バンド数 12–16 / Saw / 原音 0.00–0.03 |
| 強いロボ声 | 基準音程 90–110 / バンド数 10–14 / Square / 原音 0.00 |
| 聞き取りやすさ優先 | 基準音程 120–150 / バンド数 20–25 / Saw / 原音 0.04–0.08 |
| 歌う | キャリア音程モード = ピッチ追従 / Saw / バンド数 20–25 |
| ドロイド声 | キャリア波形 = R2-D2(他パラメータの影響は小) |
No responses yet