初めに
日本語の音声の話者表現ベクトルを抽出できるライブラリおよびモデルが公開されたので、使ってみます。この記事では、ReadMe + サンプリング変換コードのみになっています
開発環境
- Google Colob T4(Free)
準備
モデルのダウンロード
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)
実行結果として以下のように音声のベクトルが表示されます。