xvector_jtubespeechを使って日本語音声のxベクトル抽出器を行う

初めに

日本語の音声の話者表現ベクトルを抽出できるライブラリおよびモデルが公開されたので、使ってみます。この記事では、ReadMe + サンプリング変換コードのみになっています

github.com

開発環境

準備

モデルのダウンロード

URLからモデルを含んだzipファイルをダウンロードします。

その中から .pth のモデルをColobにアップロードします

サンプル音声のアップロード

今回は、処理の前にサンプリングを16kHzに変換するためどのような音声でも大丈夫です。処理をする音声をColobにアップロードします

x-vectorの実行

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

!pip install xvector-jtubespeech librosa

以下で sample.wav に対するx-vectorを実行します

import numpy as np
import librosa
import torch
from scipy.io import wavfile
from torchaudio.compliance import kaldi
from xvector_jtubespeech import XVector

def extract_xvector(
  model, # xvector model
  wav   # 16kHz mono
):
  # extract mfcc
  wav = torch.from_numpy(wav.astype(np.float32)).unsqueeze(0)
  mfcc = kaldi.mfcc(wav, num_ceps=24, num_mel_bins=24) # [1, T, 24]
  mfcc = mfcc.unsqueeze(0)

  # extract xvector
  xvector = model.vectorize(mfcc) # (1, 512)
  xvector = xvector.to("cpu").detach().numpy().copy()[0]  

  return xvector

def load_and_convert_wav(filepath, target_sr=16000):
  # Load the wav file
  wav, sr = librosa.load(filepath, sr=None)

  # Check if sample rate is not 16kHz or if it's not mono
  if sr != target_sr or wav.ndim > 1:
    # Convert to 16kHz mono
    wav = librosa.resample(wav, orig_sr=sr, target_sr=target_sr)
    if wav.ndim > 1:
      wav = librosa.to_mono(wav)
    
  return wav, target_sr

wav, _ = load_and_convert_wav("sample.wav", target_sr=16000)
model = XVector("xvector.pth")
xvector = extract_xvector(model, wav) # (512, )
print(xvector)

実行結果として以下のように音声のベクトルが表示されます。