Perthを使って音声透かしと検出を行う

初めに

音声合成の技術によってどの声が本物なのか、許可されたものかのかが分からくなってきます。そこで音声に透かしなどの技術が出てきていますが、その中のPerthを試してみます

github.com

開発環境

環境構築

まずはライブラリを動かす環境を構築します

uv venv -p 3.12
.\.venv\Scripts\activate

次に必要なライブラリをインストールします

uv pip install numpy librosa soundfile torch torchaudio matplotlib pyyaml
uv pip install resemble-perth

透かしを入れる

ReadMeに記載があるサンプルコードで動かしていきます

import perth
import librosa
import soundfile as sf

# Load audio file
wav, sr = librosa.load("input.wav", sr=None)

# Initialize watermarker
watermarker = perth.PerthImplicitWatermarker()

# Apply watermark
watermarked_audio = watermarker.apply_watermark(wav, watermark=None, sample_rate=sr)

# Save watermarked audio
sf.write("output.wav", watermarked_audio, sr)

こちらを実行することで 音声ファイルに透かしが入ります

こちらを実行すると透かしが入ったファイルが生成されます

透かしの判定

以下にて透かしが入っているかどうかを判定することができます

import perth
import librosa

# Load the watermarked audio
watermarked_audio, sr = librosa.load("VOICEACTRESS100_001.wav", sr=None)

# Initialize watermarker (same as used for embedding)
watermarker = perth.PerthImplicitWatermarker()

# Extract watermark
watermark = watermarker.get_watermark(watermarked_audio, sample_rate=sr)
print(f"Extracted watermark: {watermark}")

実行することで以下のような結果が返ってきます、透かしが入っている場合は1.0が返ってきます

loaded PerthNet (Implicit) at step 250,000
Extracted watermark: 1.0