tamochaman/audio-processing-one-demo
音声信号処理デモ - 声質変換と話速変換
大学院講義「データ処理ツール演習 II」の課題として作成した、Gradio 製の音声加工デモアプリです。 音声を入力すると、2種類の音声加工(声質変換・話速変換)を試すことができ、変換前後の波形・ スペクトログラム・F0(基本周波数)曲線を比較表示します。
実装した加工
加工1: 声質変換(WORLD ボコーダ)
内容
音声をソースフィルタ理論に基づき、以下の3つのパラメータに分解して操作し、再合成します。
- F0(基本周波数)分析・スケーリング —
pw.harvestで F0 を抽出し、0.5〜2.0倍の 係数を乗算してピッチを変える。無声区間(F0=0)はそのまま維持する。 - スペクトル包絡分析・フォルマントシフト —
pw.cheaptrickでスペクトル包絡 (声道の共鳴特性)を抽出し、周波数軸方向に0.8〜1.25倍でワーピングすることで フォルマント(共鳴周波数)をシフトする。ピッチを変えずに声質・声色だけを変化させられる。 - 非周期成分分析 —
pw.d4cで非周期性(息成分など)を抽出し、そのまま再合成に利用する。 - 囁き声モード — F0 を全て0にすることで、声帯振動のない囁き声を模擬する。
最後に pw.synthesize で F0・スペクトル包絡・非周期成分から波形を再合成します。
使用ライブラリ: pyworld(WORLD ボコーダの Python バインディング。パッケージ名は pyworld-prebuilt)
加工2: 話速変換(Phase Vocoder)
内容
短時間フーリエ変換(STFT)の位相情報を操作しながらフレーム間隔を時間軸方向に伸縮させる Phase Vocoder アルゴリズム(librosa.effects.time_stretch)により、音の高さを保ったまま 再生速度だけを変える変換です。rate > 1 で速く、rate < 1 で遅くなります。
対比として、単純に scipy.signal.resample で信号の長さだけを変える「単純リサンプリング」も 選択できます。この方法は長さは変わりますが、サンプリングレートの解釈が変わることで 音高まで一緒に変わってしまいます(Phase Vocoder との違いを示す補助機能)。
使用ライブラリ: librosa(librosa.effects.time_stretch)、比較用に scipy.signal.resample
入力の前処理
- ステレオ音声はモノラルに平均化
- int16 等の整数 PCM は [-1, 1] の float に正規化
- 内部処理は 16kHz にリサンプリング(無料 CPU 環境での WORLD 分析負荷を軽減するため)
- 入力は 15 秒に制限(超える場合は先頭15秒のみ使用し、警告を表示)
- 無音・空入力はエラーとして明示的に通知
リポジトリ構成
.
├── README.md # 本ファイル(Spaces 用 YAML ヘッダを含む)
├── app.py # Gradio アプリ本体(UI)
├── audio_effects.py # 音声加工のコアロジック
├── visualization.py # 変換前後の比較可視化ロジック
├── test_effects.py # コアロジックの動作確認スクリプト
└── requirements.txtローカル実行方法
# 仮想環境の作成(例)
python -m venv .venv
source .venv/Scripts/activate # Windows (Git Bash)
# .venv\Scripts\Activate.ps1 # Windows (PowerShell)
# 依存関係のインストール
pip install -r requirements.txt
# コアロジックの動作確認(合成信号によるテスト)
python test_effects.py
# アプリの起動
python app.py起動後、ターミナルに表示される URL(通常 http://127.0.0.1:7860 )にブラウザでアクセスします。
Hugging Face Spaces へのデプロイ手順
- Hugging Face 上に Space を作成する(SDK は
Gradioを選択) - 作成した Space のリポジトリをクローンする
git clone https://huggingface.co/spaces/<ユーザー名>/<Space名>
cd <Space名>- 本リポジトリの
app.py/audio_effects.py/visualization.py/requirements.txt/README.mdをコピーする - コミットしてプッシュする
git add app.py audio_effects.py visualization.py requirements.txt README.md
git commit -m "音声信号処理デモを追加"
git push- push 後、Spaces 上で自動的にビルド・起動が行われる(
packages.txtは ffmpeg 等が Spaces のデフォルト環境にプリインストールされているため不要)
検証
test_effects.py では、200Hz のこぎり波にフォルマント風のフィルタをかけた合成信号を用いて 以下を確認しています(著作権の問題を避けるため、実音声ファイルは同梱していません)。
- 声質変換: F0 スケール 2.0 で出力の推定 F0 がおよそ2倍になること
- 声質変換: フォルマントシフト 1.2 でスペクトル包絡のピーク位置が高域側に動くこと
- 囁き声モード: 出力の推定 F0 がほぼ全区間 0 になること
- 話速変換: rate 2.0 で出力長がおよそ半分、かつ推定 F0 が変化しないこと
- 単純リサンプリング: 出力長が半分になり、かつ F0 が約2倍になること(Phase Vocoder との対比)
