音声強調
DeepFilterNet3を使用して音声録音から背景ノイズを除去します。モデルは効率的な推論のためにCoreML経由でNeural Engine上で実行され、すべての信号処理(STFT、ERBフィルターバンク、ディープフィルタリング)はAccelerate/vDSP経由でCPU上で実行されます。
アーキテクチャ
DeepFilterNet3は、スペクトルエンベロープ強調ときめ細かいスペクトル詳細回復を分離するデュアルデコーダーアーキテクチャを使用します。
| ステージ | 詳細 |
|---|---|
| STFT | vDSP経由の短時間フーリエ変換 |
| エンコーダー | 4つのSepConv2dレイヤー + SqueezedGRU |
| ERBデコーダー | ERBスケール周波数バンドに適用されるシグモイドマスク |
| DFデコーダー | 5タップ複素フィルタリング係数 |
| iSTFT | 時間領域信号を再構築する逆STFT |
ERBデコーダーは、Equivalent Rectangular Bandwidth (ERB)スケールでゲインマスクを推定し、広範なスペクトル整形を処理します。DFデコーダーはきめ細かい詳細のための5タップ複素フィルタリング係数を予測し、周波数領域で学習されたフィルターを直接適用します。
処理パイプライン
- STFT — vDSPを使用してノイズのある音声を時間周波数表現に分解
- ERB特徴量 — STFTビンをERBスケール周波数バンドにマッピング
- ニューラルネットワーク — エンコーダーがNeural Engine上で特徴量を処理。ERBとDFのデコーダーが強調パラメーターを予測
- ERBマスキング — シグモイドゲインマスクを適用してスペクトルエンベロープ内のノイズを抑制
- ディープフィルタリング — 5タップ複素係数を適用してきめ細かいスペクトル詳細を回復
- iSTFT — 強調されたスペクトルからクリーンな音声を再構築
モデルバリアント
| バリアント | サイズ | 精度 |
|---|---|---|
| INT8 (デフォルト) | 約2.2 MB | 8ビット量子化 |
| FP32 | 約4.3 MB | 完全精度 |
モデルは約2.1Mのパラメーターを持ちます。INT8バリアントはデフォルトで使用され、半分のサイズで同等の品質を提供します。
CLIの使用法
# 音声をノイズ除去(出力は _denoised.wav)
.build/release/audio denoise noisy.wav
# 出力ファイルを指定
.build/release/audio denoise noisy.wav -o clean.wav
# FP32モデルバリアントを使用
.build/release/audio denoise noisy.wav --model fp32
オプション
| オプション | 説明 |
|---|---|
--output, -o | 出力ファイルパス(デフォルトは<input>_denoised.wav) |
--model | モデルバリアント:int8(デフォルト)またはfp32 |
重要
DeepFilterNet3は、MLX経由のGPUではなく、CoreML経由でNeural Engine上で実行されます。つまり、他のGPUベースのモデル(ASR、TTS)が実行されている間でも効率的に動作します。metallibコンパイルは不要です。
モデルダウンロード
| モデル | サイズ | HuggingFace |
|---|---|---|
| DeepFilterNet3 (CoreML FP16) | 約4.2 MB | aufklarer/DeepFilterNet3-CoreML |
他のモデルとの組み合わせ
音声強調は、他のモデルの前処理ステップとして特に有用です:
- 文字起こしの前 — ASRを実行する前に音声をノイズ除去することで、ノイズの多い録音での単語誤り率を改善
- 話者embeddingの前 — クリーンな音声はより信頼性の高い話者embeddingを生成
- ダイアライゼーションの前 — ノイズ除去はセグメンテーション精度を向上させる可能性がある
# ノイズ除去してから文字起こし
.build/release/audio denoise noisy.wav -o clean.wav
.build/release/audio transcribe clean.wav
Swift API
import SpeechEnhancement
let model = try await DeepFilterNet3.loadFromHub()
let cleanAudio = try await model.denoise(audioFile: "noisy.wav")
try cleanAudio.write(to: "clean.wav")
Android と Linux (ONNX Runtime経由)でも利用可能です。