本記事は、
前回構築した GPU 対応 PyTorch 環境を前提に、Denoiser の GPU 動作検証と動画音声のノイズ除去テストを行った記録 です。
動画を撮るのもスマホのカメラの機能を利用する程度で、撮った動画もインスタグラムのストーリーズへそのまま上げるくらいしかしていなかった素人な私ですが、
「最近はAIでノイズ除去とか簡単にできなるんじゃないですかね?」
と相談をいただきました。
世の中簡単なものって無いですよ…とも言えず、乾いた笑いで答えておいたのですが、最近興味のある分野でもあるので試してみることにしました。
Facebook(Meta / FAIR)がGitHubに公開しているDenoiserですが、少し時間の経った技術のようです。(2020年頃?)
生成AIに相談したら候補に挙がったので、とくに深く考えずに選択してみましたが、前回書いたような環境ですので、結果良かったようです。
Hybrid DemucsやAudiocraftについても、今回の環境でGPUを使用して動作するかの確認もいずれしてみようと思いますが、まずは”AIを使ってノイズ除去”が出来るか、その際にGPUを使用できるか、Denoiser(AI)を使って確認することにします。
1.今回のサンプル動画の課題
・ブレスノイズが激しい
・音声の左右のバランスが悪い
今回入手したサンプル動画の音声はこの2点を何とかしたい、というものでした。
テスト的に実施するものなので、このうち「音声の左右のバランスが悪い」は単純にステレオをモノラルにして解決することに。
あくまで呼吸音を含めたノイズ低減と話者の声の明瞭度アップ、安定化を目標にすることしました。
2.やりたいことの流れと担当部分
動画ファイルから音声取り出し(ffmpeg)
↓
ステレオからモノラルに変換(ffmpeg)
↓
ノイズ低減(Denoiser)
↓
声の明瞭度や音量ダイナミクスの安定化(Denoiser)
↓
ノイズ除去後の音声を動画へ再結合(ffmpeg)
↓
AAC へのエンコード(音声を動画用フォーマットへ)(ffmpeg)
Denoiser部分がAIとGPU利用部分、ffmpeg部分は実行時の設定値で調整で使うのはCPUです。
3.環境構築
Pytorch、CUDAをインストールしてGPUを認識するところまでは前回の記事を参照ください。
・ffmpegインストール
$ sudo apt update
$ sudo apt install -y ffmpeg
必要な音声フィルタが入っているか確認します。
#ノイズ関連
$ ffmpeg -filters | grep -E ‘afftdn|anlmdn’
#イコライザ・帯域系
$ ffmpeg -filters | grep -E ‘equalizer|anequalizer|highpass|lowpass’
#ラウドネス正規化
ffmpeg -filters | grep loudnorm
ここで
afftdn
anlmdn
equalizer
highpass
lowpass
loudnorm
あたりが表示されていれば大丈夫なようです。
・Denoiserインストール
condaの仮想環境に入っていない場合は入ります。
$ conda activate denoiserenv
$ cd ~
$ mkdir -p denoiser_test
$ cd denoiser_test
$ git clone https://github.com/facebookresearch/denoiser.git
$ cd denoiser
#依存関係インストール
$ pip install -r requirements.txt
$ pip install -e .
Denoiser が GPU を使ってくれるかテスト
$ python
>>>import torch
from denoiser import pretrained
print("torch.cuda.is_available():", torch.cuda.is_available())
model = pretrained.dns64()
print("loaded model device:", next(model.parameters()).device)
if torch.cuda.is_available():
model = model.to("cuda")
print("after .to('cuda'):", next(model.parameters()).device)
else:
print("CUDA not available, staying on CPU.")
ここで
torch.cuda.is_available(): True
after .to(‘cuda’): cuda:0
と出れば、モデルを GPU に載せる準備が完了です。
フォルダ構成を以下のようにしました。
~/denoiser_test
|-denoised_wavs/
|-noisy_wavs/
|-work/
4.実際に動かしてみる
~/denoiser_test/noisy_wavs へmp4ファイルを格納してください。
私はWinSCPを使用しました。WinSCPでの接続方法もGPUSORBANさんの
WinSCPでWinodws PCからファイル転送する方法
で詳しく説明されています。
・mp4 から音声だけ抜き出し(wav)
今回使用したmp4ファイルのファイル名:lecture.mp4
$ cd ~/denoiser_test/noisy_wavs
$ ffmpeg -i lecture.mp4 \
-vn -acodec pcm_s16le -ar 48000 -ac 2 \
work/lecture_raw.wav
-vn … ビデオ無効
pcm_s16le … 無圧縮(処理しやすい)
-ar 48000 / -ac 2 … 48kHz / ステレオに統一
・ステレオをモノラルに変換
$ cd work
$ ffmpeg -i lecture_raw.wav \
-af "pan=mono|c0=0.5c0+0.5c1" \
lecture_raw_mono.wav
・ノイズ低減処理
$ cd ~/denoiser_test/denoiser
$ python -m denoiser.enhance \
--dns48 \
--device cuda \
--streaming \
--batch_size 1 \
--num_workers 1 \
--noisy_dir ../noisy_wavs/work \
--out_dir ../denoised_wavs
バックスラッシュの次には半角スペースが必要です。スペースなければ動作しなければいいのに、CPUを使って走り出すという…
別のターミナルを起動して以下のコマンドを実行するとGPUが動作しているか確認できます。
$ watch -n 1 nvidia-smi
保存はout_dir(今回だと~/denoiser_test/denoised_wavs)にされます。
(元のファイル名)_enhanced.wavファイルがそれです。
同じところに(元のファイル名)_noisy.wavファイルも生成されますが、これは仕様だそうです。
理由は生成AIに聞いてみてくださいね。
・音声を映像に戻す
戻すというか、動画ファイルをストリーミングして新しい音声と合成する、というイメージですね。
$ ffmpeg -i ~/denoiser_test/noisy_wavs/lecture.mp4 \
-i ~/denoiser_test/denoised_wavs/lecture_raw_mono_enhanced.wav \
-map 0:v -map 1:a \
-c:v copy \
-c:a aac -b:a 192k \
~/denoiser_test/lecture_denoised.mp4
今回のテストはここまでです。
出来上がったファイルの音声は少しは聞きやすくなった気がします。
ノイズが大きかったところを補正している部分で別のノイズが発生しているのはノイズ補正のせいかもしれませんね。もう一度このフローを流したらどうなるのかな?
さて次はHybrid Demucsが動作する環境構築ができるかを試すか、教師データを大量に用意して別のシステムを作るか…どうしましょうね笑
コメントを残す