【CLAP】音声検索や高度な音声分類!音声ならこのAIのみで十分すぎる最強ツールを使ってみた
WEELメディア事業部LLMリサーチャーの中田です。
LAION社が、音声と言語のマルチモーダルモデル「CLAP(Contrastive Language-Audio Pretraining)」を公開しました。
このAIモデルを使うことで、音声と言語を紐づけた特徴量抽出ができ、高度な音声分類や音声検索、Text-to-Auioに活用できるんです!
以下の動画は、AudioLDMというText-to-Audioのモデルですが、背後にはCLAPが大活躍しています。
本ツールの研究論文の被引用件数は90を超えており、音声AI分野でも注目されていることが分かります。音声と言語を活用したマルチモーダル生成や、汎用人工知能の開発にも活用できそうです。
この記事ではCLAPの使い方や、有効性の検証まで行います。本記事を熟読することで、CLAPの凄さを実感し、音声-言語を活用した自社システムを作りたくなるでしょう。
ぜひ、最後までご覧ください。
CLAPの概要
CLAP(Contrastive Language-Audio Pretraining)は、「音声と言語の対照学習モデル」という意味で、音声-テキストのマルチモーダルモデルです。
具体的には、「同じペアの音声とテキストデータ同士の類似度」は大きくなるように、また「異なるペア同士の類似度」は小さくなるように学習されます。ここで言う類似度とは、コサイン類似度のことで、例えば「xとyのコサイン類似度が大きい」とは「xとyは似ている」という意味です。
下の図はCLAPの学習の様子を表していて、「Text Encoder」は入力テキストを、「Audio Encoder」は入力テキストとペアの音声を、エンコーディング(ベクトル化)しています。そして、この2つのベクトルの距離を小さくするように、学習されるのです。
参考記事:CLAP
ここでは、ペアデータの類似度を対角成分で表しており、この値を大きくするようにします。ちなみに、ここで言っているペアデータとは、ある音声と、その音声を説明するようなテキストが結びついてできたデータを指します。
また、CLAPはあらかじめ大量のデータで学習されているため、ゼロショットでも高い性能を発揮するのです。他にも、エンコーダによって生成されたベクトルを「特徴量」として、深層学習に用いることも可能です。例えば、世の中の多くのText-to-Audioモデルでは、「CLAPによって生成されたテキストプロンプトのベクトル」をモデルに入力し、それをもとに音声を生成しています。
参考記事:Why text-to-speech voices sound better on BeyondWords
もちろん、音声検索や音声分類、音声キャプション生成など、様々なタスクに応用可能です!
CLAPの料金体系
CLAPはオープンソースであるため、誰でも無料で利用できます。
なお、日本語の発音が完璧な音声生成AIについて知りたい方はこちらの記事をご覧ください。
→【Style-Bert-VITS2 JP-Extra】日本語の発音・イントネーションが完璧な次世代AIを使ってみた
CLAPの使い方
今回は、Google ColabのA100を使用します。まずは、公式ページのQuickStartを参考にして、ライブラリのインストールから、音声・テキストのベクトル生成まで行ってみます。まずは、以下のコードでライブラリのインストールと、音声データセットのダウンロードをしましょう(データセットのダウンロードに60分ほどかかるので、もっと時短で済ませたい方は小規模のデータセットがおすすめです)。
!git clone https://github.com/LAION-AI/CLAP.git
%cd CLAP
# you can also install pytorch by following the official instruction (https://pytorch.org/get-started/locally/)
!pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0+cu113 -f https://download.pytorch.org/whl/torch_stable.html
!pip install -r requirements.txt
!pip install laion-clap
!pip install ffmpeg
!pip install audioset_download
from audioset_download import Downloader
d = Downloader(root_path='eval_wav', labels=None, n_jobs=16, download_type='eval', copy_and_replicate=False)
d.download(format = 'wav')
データセットのダウンロード時、あまりにも時間がかかりすぎて煩わしいという方は、途中で中断しても、それまでにダウンロードされたwavファイルがあれば大丈夫です。
次に、以下のコードを実行して、ベクトルを生成しましょう。
import numpy as np
import librosa
import torch
import laion_clap
import os
from tqdm import tqdm
import glob
# quantization
def int16_to_float32(x):
return (x / 32767.0).astype(np.float32)
def float32_to_int16(x):
x = np.clip(x, a_min=-1., a_max=1.)
return (x * 32767.).astype(np.int16)
model = laion_clap.CLAP_Module(enable_fusion=False)
model.load_ckpt() # download the default pretrained checkpoint.
input_dir = 'eval_wav/**/*.wav'
file_list = [p for p in glob.glob(input_dir, recursive=True) if os.path.isfile(p)]
print('file num:', len(file_list))
#file_list = file_list[:100]
def get_class_name(file):
dir_name = os.path.dirname(file)
return dir_name.split('/')[1]
info_list = []
for file in tqdm(file_list):
try:
audio_embed = model.get_audio_embedding_from_filelist(x=[file], use_tensor=False)
info = {}
info['file'] = file
info['class'] = get_class_name(file)
info['embed'] = audio_embed[0]
info_list.append(info)
except Exception as e:
print('error:', e)
continue
print(info_list[0])
これを実行することで、データセット内のすべてのwavファイルをベクトル化できました。試しに1つの音声ファイルの512次元のベクトルを可視化すると、以下の通りになりました。
array([[-0.02690937, -0.0254576 , -0.03334861, -0.02271937, -0.05495442,
0.03011596, 0.04891155, -0.02580804, -0.07228905, -0.00552084,
0.02088167, 0.01834293, 0.07797496, 0.05386151, -0.03433142,
-0.04461002, 0.00248357, -0.02096625, 0.00483299, 0.07717259,
-0.0296366 , -0.07169848, 0.05336999, 0.0377335 , 0.04042144,
0.01836721, 0.00107864, -0.08464229, 0.00291554, -0.03587499,
0.0040366 , 0.02488898, 0.03362503, 0.05372486, 0.01154568,
-0.00546951, 0.01695101, -0.00744805, 0.05383027, 0.02396151,
-0.01556236, 0.04560085, -0.01358293, -0.02111399, 0.02457963,
-0.03935552, -0.00994536, -0.02116217, -0.00375735, 0.02468534,
-0.11845763, -0.05465817, 0.0368963 , 0.00592432, 0.01987211,
0.06955939, 0.07455882, 0.04629311, 0.03044736, -0.07635923,
0.01484944, -0.00600275, -0.01512291, -0.0174069 , -0.05727676,
-0.02966116, -0.07054906, -0.02206342, 0.06396698, -0.05298559,
-0.06128413, -0.087128 , 0.0309641 , 0.00218901, -0.0434565 ,
-0.01184389, 0.0629103 , 0.02643493, 0.04505552, 0.00056187,
-0.03205083, -0.00833583, -0.04033175, 0.11088229, -0.03219676,
0.03538346, 0.01698871, -0.01498393, 0.10001348, -0.00581709,
0.00836159, -0.05660321, -0.01051573, -0.07316907, -0.02255226,
0.03912528, -0.02556669, 0.02745901, -0.00907327, -0.01251112,
0.01873871, -0.02823749, 0.01163395, 0.0289976 , -0.01250854,
0.04965018, 0.04379783, 0.06122447, -0.00026011, -0.01554793,
0.05243098, -0.00305767, 0.04096488, -0.00379348, 0.01005784,
-0.07329189, 0.09535437, -0.07018366, 0.00497548, 0.03085198,
0.03530783, -0.07671671, -0.00482127, 0.0177798 , -0.01224368,
-0.00413798, -0.04220393, 0.00896823, -0.01653252, -0.02411713,
-0.08087188, -0.04159795, 0.12362079, 0.01289999, 0.03129906,
-0.00256752, -0.01193973, -0.07134945, -0.04142058, -0.02482564,
-0.02598774, -0.01427219, 0.02599753, 0.05210069, 0.00339409,
0.03274265, -0.05523739, -0.03436529, 0.02436866, 0.01344188,
-0.01334036, -0.01312958, -0.03635873, -0.04350926, 0.04356816,
-0.009285 , 0.0179703 , 0.00362656, -0.02415626, 0.05949919,
-0.00103885, -0.08660394, 0.00112699, 0.06804956, -0.02522464,
0.01185023, 0.00733149, 0.04130715, 0.02787068, 0.11917102,
-0.00062319, 0.00549454, 0.02268589, -0.03118345, 0.00973505,
-0.00161601, -0.04083705, -0.00739769, 0.01664013, 0.11952833,
0.00160859, 0.0402399 , 0.04103166, 0.03472335, 0.0188032 ,
-0.05065319, 0.03996408, 0.01260452, 0.02351224, 0.03146151,
-0.04714268, 0.04141981, 0.02497382, -0.09649938, 0.03223726,
0.02947295, 0.11447641, -0.02148136, 0.04748705, 0.00603276,
-0.00884505, -0.02152828, -0.07658493, 0.00042774, 0.01412167,
-0.06355267, 0.02893092, -0.01296061, -0.06434483, -0.02396481,
-0.05709858, 0.02087778, 0.06261717, 0.04178476, -0.03340082,
0.01149197, 0.0262382 , 0.02343308, 0.08356036, -0.00294934,
-0.05088559, 0.0092888 , -0.00532282, -0.07444983, -0.01829137,
0.02754464, -0.04178052, 0.01373232, 0.00151662, 0.00779655,
0.00181311, -0.00816573, -0.03591749, -0.03307361, 0.02358149,
0.00181039, -0.09197213, 0.04213189, -0.04374443, 0.03893996,
0.02900437, 0.02629547, -0.00336137, 0.04342661, -0.07775766,
0.08036982, -0.00747739, 0.01823172, 0.02923555, -0.02176599,
-0.00716344, -0.10371009, -0.1191683 , -0.07672058, 0.00853347,
0.04871938, -0.08561736, -0.03707674, 0.03295264, -0.02957251,
0.01123679, -0.00091893, -0.02901798, 0.04990606, 0.00156877,
-0.01427312, -0.037654 , 0.05199286, -0.00437582, 0.01799895,
-0.00799537, 0.0131089 , 0.00756142, 0.02532501, 0.03362242,
0.00678631, 0.02491605, 0.07658163, 0.00638687, -0.06066298,
0.07234547, 0.08997972, -0.02316004, 0.02172669, -0.03680833,
0.00102533, 0.05485782, -0.03330914, -0.07573411, -0.08498687,
0.0608294 , -0.05148841, -0.01422474, 0.01069846, -0.01278465,
-0.02426042, 0.03178999, -0.03157746, 0.01746207, 0.01567949,
-0.05238955, -0.01673905, -0.03313354, -0.05883506, 0.04293156,
-0.04853841, 0.0597268 , -0.06123088, 0.02676167, 0.02315998,
0.01285625, -0.09642583, 0.0234881 , 0.01904205, -0.01931582,
0.00999837, -0.00203792, -0.01486272, -0.03583484, 0.00344603,
-0.02773437, 0.03015692, 0.06593335, -0.06422472, 0.05641081,
-0.05180323, -0.01009735, -0.01684159, 0.03812924, -0.05717695,
0.04083701, -0.02402079, -0.00365057, 0.00244044, 0.01638052,
-0.07401773, 0.06140405, -0.01307231, 0.01097214, -0.00054839,
-0.05947934, -0.05217502, -0.01774098, -0.05164433, 0.01296362,
0.00422674, -0.04002127, -0.07292895, 0.04657979, 0.0010775 ,
0.09743372, 0.00551172, 0.08368582, -0.08591661, 0.00774448,
0.06619047, 0.05042036, -0.01615051, 0.03421995, 0.067981 ,
0.02571084, -0.04681469, 0.00627288, 0.00731208, 0.08346707,
0.03135876, 0.00548711, 0.0601864 , 0.0371225 , -0.08511318,
-0.07741144, -0.06894424, -0.03409707, -0.07901438, -0.06414895,
0.00906993, 0.1067476 , 0.01046703, -0.05462103, -0.07898721,
0.05439275, -0.04044697, -0.03140803, 0.02843602, 0.07374015,
-0.00605457, -0.03717722, -0.0340788 , 0.02219493, 0.01198897,
-0.00259864, -0.02360608, 0.00143026, -0.02808605, -0.01982502,
0.00318874, -0.07039579, 0.03710784, 0.06257946, 0.00923772,
-0.09086918, 0.00702566, -0.01542809, 0.05597828, -0.01282371,
-0.02309763, -0.00023833, -0.0142632 , 0.05029417, 0.00969377,
-0.07829493, 0.04291806, -0.029104 , 0.00150769, -0.06123719,
-0.02752284, -0.00200163, 0.04774646, -0.00868358, -0.08163682,
0.00569398, -0.06165135, -0.05503938, 0.00031365, 0.03108938,
0.02329397, -0.04680798, -0.04709435, 0.07150402, 0.05330902,
-0.07975991, 0.00826469, 0.03564274, -0.07238834, -0.08935799,
0.03113316, 0.01652695, 0.01989736, 0.07200789, -0.10051388,
-0.00181006, 0.04733452, 0.00358233, -0.01065903, -0.02393932,
0.02622117, 0.0015251 , -0.02142772, -0.00839105, -0.02509469,
-0.10224558, 0.08289132, -0.0248124 , 0.00689099, 0.01714914,
-0.01183785, 0.0096141 , -0.03336713, 0.0214426 , -0.07163191,
-0.01063916, -0.11748567, 0.03206872, -0.04938321, -0.06100748,
-0.01945087, 0.02045889, 0.02896412, 0.04346529, 0.03729777,
0.08025248, 0.0090009 , 0.07097729, 0.04197907, 0.05885614,
-0.02342385, -0.03296687, -0.00184449, -0.04377986, -0.08353303,
0.0201308 , -0.01871716, 0.04003585, -0.0289496 , 0.00341244,
-0.02826962, -0.02700727, -0.00346463, 0.01452166, -0.0290365 ,
-0.08715361, 0.02409394, 0.0259943 , 0.02731399, 0.00235567,
0.04611878, -0.05217984, 0.01704659, -0.07049912, 0.06127187,
0.0213252 , -0.00100819, 0.04322597, 0.01682452, 0.03367519,
0.00549092, -0.01016203, 0.0767554 , 0.02921539, 0.04361729,
-0.00280375, 0.02068129]], dtype=float32)
ご覧の通り、ベクトルなので数字の羅列です。
このようにして生成されたベクトルを用いて、ベクトルデータベースのような使い方をすれば、容易に音声検索が可能にるはずです!
CLAPを動かすのに必要なPCのスペック
■Pythonのバージョン
Python 3.8以上
■必要なパッケージ
soundfile
librosa
torchlibrosa
ftfy
braceexpand
webdataset
wget
wandb
llvmlite
scipy
scikit-learn
pandas
h5py
tqdm
regex
transformers<=4.30.2
ffmpeg
audioset_download
なお、Metaの音声生成AIについて知りた方はこちらの記事をご覧ください。
→【MAGNeT】Meta開発のテキストから音楽や音声を生成できるAIの使い方~実践まで
CLAPを実際に使ってみた
ここでは、先ほどのダウンロードした音声のデータセットを用いて、テキストクエリからの音声検索を行ってみます。具体的な手順は、以下の通りです。
- テキストプロンプトをテキストエンコーダによってベクトル化
- データセット内の全音声データの埋め込みと、テキスト埋め込みとのコサイン類似度を計算
- 最もコサイン類似度が大きい音声のベクトルを、データセットから抽出
まずは、先ほどと同じ手順で、テキストをベクトル化しましょう。試しに、「I love the contrastive learning」と「I love the pretrain model」と「hip hop song with loud hihat」という3つの文章をベクトル化します。
# Get text embedings from texts(プロンプト):
text_data = ["I love the contrastive learning", "I love the pretrain model", "hip hop song with loud hihat"]
text_embed = model.get_text_embedding(text_data)
# 検索対象のプロンプトの埋め込みベクトル
find_embed = text_embed[2]
3文目の文章は、以下のように512次元のベクトルとなっています。
array([-0.03247828, 0.00387096, 0.00997536, 0.02406599, 0.03338131,
-0.00702946, 0.06309851, -0.01388942, -0.01049594, 0.01557119,
0.00904121, 0.01376745, 0.05177626, 0.01750478, 0.02501288,
-0.01297508, 0.02487933, 0.02114903, 0.04639862, 0.01107289,
0.01922797, 0.04780195, -0.0146999 , 0.01064479, -0.08424986,
0.03156864, 0.0405502 , 0.06150978, -0.01613019, -0.03145156,
0.09204136, 0.04866125, -0.02522036, 0.0090704 , 0.01611627,
-0.01771424, -0.02804099, -0.00516528, -0.04113743, 0.04514594,
0.0730546 , -0.0974791 , 0.1096499 , 0.03561287, 0.0049707 ,
0.06588975, 0.08537419, 0.0199537 , 0.03344034, -0.05288853,
0.03069031, -0.01149498, -0.05308113, -0.040362 , 0.04237213,
-0.03720094, 0.07224913, 0.05519143, 0.03023924, 0.05449224,
-0.02542087, 0.01349168, -0.03591129, -0.02817931, 0.03466268,
0.02882316, 0.05449392, 0.08776415, 0.05215294, 0.00590316,
-0.0536658 , 0.02000944, 0.00452638, 0.02643368, -0.04590939,
-0.04413645, 0.03733566, 0.03362838, 0.03682372, 0.00567479,
-0.11928723, 0.05654615, 0.01832282, 0.00213854, -0.01200875,
0.05501734, -0.00613848, -0.02181688, -0.03277125, -0.06191709,
-0.02716473, -0.08136626, 0.01490368, 0.03596023, -0.02735526,
-0.07204644, 0.04351663, 0.03668059, -0.02370815, -0.09341428,
0.00049728, -0.02495649, 0.04538778, -0.02427695, -0.07448585,
-0.0398683 , 0.10387155, 0.02699264, 0.04124945, -0.04699243,
0.02321849, 0.04742448, 0.00950958, -0.00927612, -0.06735143,
0.01142812, -0.0395419 , -0.01704125, -0.05806867, 0.06048835,
-0.02768282, -0.03522818, -0.01212015, -0.0497936 , -0.08197895,
0.05582751, -0.04523865, 0.03351891, 0.05539582, -0.04122022,
0.0196015 , 0.00725309, 0.0143855 , -0.00467332, 0.00022477,
-0.02058177, -0.02756017, -0.06098919, 0.0255511 , -0.0726179 ,
-0.06173489, -0.01397077, -0.03177948, -0.02974494, -0.03666469,
0.03136301, -0.03771933, 0.06703923, 0.08100192, 0.01983786,
-0.0687191 , 0.01473628, 0.04344494, -0.05698075, 0.07396867,
0.04048178, -0.00757779, -0.03136816, -0.02979005, 0.02258922,
-0.0084331 , -0.05727351, -0.0044359 , 0.01716643, 0.021525 ,
-0.01606021, 0.01920257, 0.0343725 , 0.00454675, 0.02183752,
0.01125146, 0.08863261, 0.0411283 , -0.0078534 , 0.06248623,
-0.06329687, -0.04049812, -0.04269069, -0.03457991, -0.00768234,
0.01856239, -0.02666787, -0.05634267, -0.01689532, 0.04514961,
0.02814791, 0.01704142, -0.03270539, -0.0752095 , 0.00625853,
-0.0236166 , -0.09278222, 0.05529513, -0.01157417, -0.02138987,
-0.0066769 , -0.02494623, 0.01299328, 0.00457523, 0.0878924 ,
0.01094748, -0.02030935, 0.10768668, -0.00271268, -0.03999647,
0.02940861, 0.07480939, 0.04335781, 0.02762304, 0.03937834,
-0.01466026, -0.08401605, -0.05943766, -0.08656946, -0.05326124,
-0.05637875, 0.02380081, -0.07121742, 0.01207151, 0.00520399,
0.02321771, -0.03924071, -0.06258736, 0.04854414, 0.01357334,
0.0220412 , 0.00724504, 0.01486647, -0.10841243, 0.09649185,
-0.04485741, -0.06806324, 0.06762707, 0.06075012, 0.04241084,
-0.13752553, 0.03000374, 0.0372151 , 0.02894902, 0.07127874,
0.07880232, 0.02305894, -0.00085677, -0.02769792, -0.05072298,
-0.02980023, 0.0188049 , -0.02901648, 0.11825057, -0.00806881,
-0.00204275, 0.05127048, 0.00701767, -0.07473858, 0.04465638,
-0.01780216, 0.01027373, -0.00379276, -0.04192784, -0.06114205,
-0.05244078, -0.08807387, 0.060543 , 0.10124593, 0.02830684,
-0.00848529, -0.04700745, 0.0100083 , 0.07322844, 0.05038096,
0.0197545 , -0.01627004, 0.01219591, 0.06810596, 0.01660292,
0.02833807, -0.02976323, -0.04143866, 0.0655015 , 0.00576445,
-0.05930881, 0.03685419, 0.03345912, 0.01038546, 0.02395267,
-0.03584979, -0.00466764, 0.02253981, -0.07725201, 0.00768436,
0.00799952, 0.01170528, -0.01573552, -0.01289142, -0.01654982,
-0.05119864, 0.06856171, -0.08499212, 0.08816856, 0.06821875,
0.06095839, -0.02827436, 0.08367121, 0.03225195, -0.01043851,
-0.03560085, -0.04396455, 0.07731023, -0.0264133 , 0.02875536,
-0.06438208, -0.01315214, -0.08782637, 0.01768788, -0.11129536,
0.00962583, 0.02359591, -0.0570444 , -0.03558027, -0.02374223,
-0.03349504, -0.0037653 , 0.05712282, -0.01381629, -0.06655508,
0.02292478, -0.04355509, -0.03356415, -0.01930371, 0.04252883,
0.03974482, 0.00105765, 0.0637707 , -0.05156159, -0.00612671,
0.00201197, 0.01505955, 0.01052914, -0.05498685, 0.01127174,
0.02764488, 0.0494479 , -0.0766598 , 0.02747758, 0.06198906,
0.04322739, -0.03848241, 0.01219076, -0.05733888, 0.02610461,
-0.00139591, 0.01593881, -0.01669882, -0.07303401, -0.02176764,
-0.04029015, -0.00466157, 0.00024657, 0.04507833, 0.03429338,
0.05015283, 0.03233503, 0.00067145, -0.01228924, -0.03572985,
-0.08089683, -0.02247369, -0.05041528, 0.01119322, -0.0210063 ,
-0.04889021, 0.04671151, -0.02475826, -0.02377467, -0.04124855,
0.04197233, -0.00710015, 0.04970874, -0.05303151, -0.0205015 ,
-0.02114977, 0.01280743, -0.01167099, 0.05498892, -0.04589038,
0.01645103, 0.01548873, -0.02162039, -0.0155754 , 0.04223166,
0.03509839, 0.02932003, 0.03368638, -0.08960757, -0.02096084,
-0.05149195, 0.01005561, 0.03814794, -0.03097113, 0.07789263,
-0.02568725, 0.01910604, 0.05149626, -0.01404026, -0.03145725,
0.03918738, -0.05860111, 0.09209275, 0.03380323, -0.00313681,
0.00503907, -0.02955331, 0.09832128, -0.04698353, 0.04936327,
0.03737205, -0.07104089, -0.0138521 , 0.01372438, 0.00069032,
-0.00769027, 0.01632872, -0.03375566, 0.09520482, -0.11155804,
0.02166205, 0.07232656, 0.00306577, 0.00520863, -0.05058945,
0.05157542, 0.0685934 , 0.00811581, -0.03703897, -0.01631649,
0.05101712, -0.04660203, -0.00153598, -0.04170299, -0.00646303,
-0.07306705, 0.02117761, 0.01187666, 0.00615135, 0.01188202,
0.02648808, 0.0076945 , 0.00340599, 0.04248079, -0.03244958,
0.01447197, 0.02757245, -0.00355044, -0.00311077, 0.01846155,
0.01950882, -0.00159681, 0.00292073, -0.02890529, -0.06890403,
-0.02211067, 0.00266057, 0.02057121, 0.01775975, -0.04197046,
0.03026625, 0.02605524, 0.02006981, -0.06214252, 0.07323685,
-0.00607046, 0.01935423, -0.03005892, -0.06327767, -0.04953887,
-0.0217129 , 0.04705051, 0.10099419, -0.03538 , -0.05367782,
-0.06621623, -0.02819304, -0.00131941, -0.03679343, 0.03884643,
-0.04117489, -0.01829757, 0.0437089 , 0.06109003, -0.01437456,
0.03297041, -0.0030801 , 0.01303355, 0.00605607, -0.05443294,
0.00624109, -0.00583936, 0.06014268, 0.00191835, 0.00206698,
-0.0128743 , 0.00869067, 0.00682814, -0.02845375, -0.04480804,
-0.03739997, 0.02890195, -0.01748979, 0.02913987, 0.07916062,
0.0179224 , 0.04010832], dtype=float32)
ここでは、3文目の「hip hop song with loud hihat(ハイハットのうるさいヒップホップソング)」というクエリを入力に使います。
そして、上記のテキストのベクトルと、データセット内の全音声データのベクトルとのコサイン類似度を計算し、最も値の大きい音声データを抽出します。
dot_product_list = []
# dot productを取ってコサイン類似度を求める
for embed in embed_list:
dot_product_list.append(np.dot(find_embed, embed))
sorted_index_list = list(np.argsort(dot_product_list))
sorted_index_list.reverse()
for i in sorted_index_list[:50]:
print("class: ", info_list[i]['class'], " | file_name:", info_list[i]["file"], ' | similarity:', dot_product_list[i])
上記を実行すると、入力されたテキストプロンプトに似ている順で「音声データのファイル名」と「その音声データが属するクラス(どんな種類の音声なのか?)」と「コサイン類似度」が出力されます。
class: Cymbal | file_name: eval_wav/Cymbal/cLi55MV04a8_100.0-110.0.wav | similarity: 0.4707375
class: Cymbal | file_name: eval_wav/Cymbal/JesyktMT-Dk_10.0-20.0.wav | similarity: 0.4700037
class: Cymbal | file_name: eval_wav/Cymbal/2CidaVnd60g_0.0-10.0.wav | similarity: 0.45729667
class: Cymbal | file_name: eval_wav/Cymbal/G1-XHWLgtlA_0.0-10.0.wav | similarity: 0.44765055
class: Music | file_name: eval_wav/Music/GwTXkfuc5v8_30.0-40.0.wav | similarity: 0.44226676
class: Music | file_name: eval_wav/Music/-i9gpG3vPwA_30.0-40.0.wav | similarity: 0.43339208
class: Cymbal | file_name: eval_wav/Cymbal/bjvnTxWP7vo_90.0-100.0.wav | similarity: 0.42404255
class: Drum | file_name: eval_wav/Drum/2qGjgfpQtFI_0.0-10.0.wav | similarity: 0.41107476
class: Music | file_name: eval_wav/Music/VAddToJbv2k_170.0-180.0.wav | similarity: 0.40754446
class: Cymbal | file_name: eval_wav/Cymbal/NWSPfogY_Ms_570.0-580.0.wav | similarity: 0.40704077
class: Music | file_name: eval_wav/Music/9TkW1M_ZRr0_30.0-40.0.wav | similarity: 0.4026597
class: Cymbal | file_name: eval_wav/Cymbal/5yLw_p9YcQE_40.0-50.0.wav | similarity: 0.40222424
class: Funk | file_name: eval_wav/Funk/bcybO-SMY5E_30.0-40.0.wav | similarity: 0.40091896
class: Cymbal | file_name: eval_wav/Cymbal/BNIzPVD3J7g_260.0-270.0.wav | similarity: 0.3927575
class: Cymbal | file_name: eval_wav/Cymbal/3_A0AP3Xh9s_290.0-300.0.wav | similarity: 0.3915227
class: Cymbal | file_name: eval_wav/Cymbal/6JxWhhZmGCs_110.0-120.0.wav | similarity: 0.39024615
class: Cowbell | file_name: eval_wav/Cowbell/X56iQAG3saE_0.0-10.0.wav | similarity: 0.3895075
class: Funk | file_name: eval_wav/Funk/RXk0lQJ7ttc_30.0-40.0.wav | similarity: 0.38902318
class: Roar | file_name: eval_wav/Roar/CJ3z2wAyVRM_10.0-20.0.wav | similarity: 0.38835275
class: Music | file_name: eval_wav/Music/BxQSEvHdyjQ_30.0-40.0.wav | similarity: 0.38346612
class: Drum and bass | file_name: eval_wav/Drum and bass/Q0KwG3ynscI_10.0-20.0.wav | similarity: 0.38335565
class: Scratching (performance technique) | file_name: eval_wav/Scratching (performance technique)/bTLgeqCaYMY_0.0-10.0.wav | similarity: 0.3793034
class: Mains hum | file_name: eval_wav/Mains hum/Iow392Lib1Q_0.0-10.0.wav | similarity: 0.37922007
class: Drum and bass | file_name: eval_wav/Drum and bass/BZyf8LPltYs_30.0-40.0.wav | similarity: 0.37729955
class: Afrobeat | file_name: eval_wav/Afrobeat/cbq6Q2htPRM_30.0-40.0.wav | similarity: 0.37691012
class: Scratching (performance technique) | file_name: eval_wav/Scratching (performance technique)/RcbMW2-Goog_230.0-240.0.wav | similarity: 0.3763042
class: Rattle | file_name: eval_wav/Rattle/D_u9WaQg4rU_110.0-120.0.wav | similarity: 0.37491885
class: Music | file_name: eval_wav/Music/C33WdI64FiY_30.0-40.0.wav | similarity: 0.3739707
class: Heavy metal | file_name: eval_wav/Heavy metal/51vf4399MIs_30.0-40.0.wav | similarity: 0.37341404
class: Sampler | file_name: eval_wav/Sampler/ZdqPnWEANuI_310.0-320.0.wav | similarity: 0.37300795
class: Music | file_name: eval_wav/Music/-dL_J5KkKZQ_30.0-40.0.wav | similarity: 0.37288567
class: Drum | file_name: eval_wav/Drum/6DwlcJyDyxc_290.0-300.0.wav | similarity: 0.3722208
class: Music | file_name: eval_wav/Music/AU1l1i0H0j0_30.0-40.0.wav | similarity: 0.36868152
class: Drum | file_name: eval_wav/Drum/-bJPDtT31p0_100.0-110.0.wav | similarity: 0.36542833
class: Music | file_name: eval_wav/Music/bOOJRGRy0zc_30.0-40.0.wav | similarity: 0.3649273
class: Scratching (performance technique) | file_name: eval_wav/Scratching (performance technique)/SPeGy815lFQ_40.0-50.0.wav | similarity: 0.3642158
class: Music | file_name: eval_wav/Music/Zt8x7tvP9Qs_30.0-40.0.wav | similarity: 0.3634383
class: Afrobeat | file_name: eval_wav/Afrobeat/Bf1rXGdwZzA_30.0-40.0.wav | similarity: 0.36343342
class: Drum and bass | file_name: eval_wav/Drum and bass/ALcCb2HJmG8_70.0-80.0.wav | similarity: 0.36069334
class: Cymbal | file_name: eval_wav/Cymbal/SmpsJhL4yUY_130.0-140.0.wav | similarity: 0.36040193
class: Cymbal | file_name: eval_wav/Cymbal/1wqJ9KDfcME_60.0-70.0.wav | similarity: 0.36039978
class: Cymbal | file_name: eval_wav/Cymbal/JHAQKzJ43Qo_110.0-120.0.wav | similarity: 0.35935402
class: Electronic music | file_name: eval_wav/Electronic music/A0XXmVts1y0_30.0-40.0.wav | similarity: 0.3556914
class: Drum | file_name: eval_wav/Drum/BoZq15USPso_30.0-40.0.wav | similarity: 0.35409242
class: Music | file_name: eval_wav/Music/_43OOP6UEw0_30.0-40.0.wav | similarity: 0.35399994
class: Cymbal | file_name: eval_wav/Cymbal/D1NDNFZGY7k_40.0-50.0.wav | similarity: 0.35380137
class: Singing | file_name: eval_wav/Singing/2GepmcbNlJY_0.0-10.0.wav | similarity: 0.35325056
class: Music | file_name: eval_wav/Music/ONiH0X2n0_k_0.0-10.0.wav | similarity: 0.35316384
class: Cowbell | file_name: eval_wav/Cowbell/SgfHJ5fkMiY_40.0-50.0.wav | similarity: 0.3528763
class: Cymbal | file_name: eval_wav/Cymbal/UsdoUjuczY4_30.0-40.0.wav | similarity: 0.35131064
ちなみに、最も似ていると判断された音声データは、以下の通りです。
確かに「音楽であること」と「ハイハットが鳴っている」ところは、プロンプトの部分が反映されていると思います!
CLAPの推しポイントである音声分野での汎用性は本当なのか?
CLAPの推しポイントは、なんといっても、音声分野における「言語を用いた情報処理の汎用性の高さ」にあるでしょう。
その根拠として、様々な音声・音楽タスクに関する研究で用いられていることが挙げられます。以下の画像は、Google ScholarにおけるCLAPの研究の検索結果ですが、「被引用数」が181を超えており、音声分野にしては多い方です。
特に、Text-to-AudioやText-to-Musicなどの生成モデルの構築にも、CLAPは重宝されています。例えば、冒頭でも述べましたが、Text-to-Audioの内部ではCLAPが用いられています。また、AudioLDMをText-to-Musicに応用したMusicLDMというモデルにも、CLAPが用いられているのです。
参考記事:MusicLDM: Enhancing Novelty in Text-to-Music Generation Using Beat-Synchronous Mixup Strategies
上図の「CLAP Audio Encoder」と「CLAP Text Encoder」が、音声・テキストをそれぞれベクトル化するモジュールです。これを上図の右下の「U-Net Latent Diffusion Model」に投入することで、いわゆる「Text-to」の部分の条件付けが実現します。ちなみに、このU-Netは、Stable Diffusionなどにも用いられている「拡散モデル」を、深層学習で再現したものという認識で大丈夫です。
他にも、先ほどのセクションでも実践した「テキストによる音声の検索」にも、CLAPは活躍するでしょう。その反対に、「音声によるテキストの検索」も可能になるため、これを活用すれば、「より高度な音声検索」も実現するはず。
さらに、言語情報と音声情報を統合的に処理できるため、将来の「汎用人工知能」の開発にも、かなり有用になるでしょう。例えば、AIに対して「目の前の紙に書いてある文章を、声に出して音読させる」といったことも、音声-言語の統合的な情報処理が必要になるため、そのようなタスクを汎用AIに解かせるためにも、CLAPのような技術は欠かせません。
自社でチャットボットを開発する際にも、CLAPが役に立つかもしれませんね!
まとめ
CLAP(Contrastive Language-Audio Pretraining)は、「音声と言語の対照学習モデル」という意味で、音声-テキストのマルチモーダルモデルです。世の中の多くのText-to-Audioモデルでは、「CLAPによって生成されたテキストプロンプトのベクトル」をモデルに入力し、それをもとに音声を生成しています。
また、CLAPの推しポイントは、なんといっても、音声分野における「言語を用いた情報処理の汎用性の高さ」にあるでしょう。そのため、音声検索や音声分類、音声キャプション生成など、様々なタスクに応用可能です!他にも、将来の汎用人工知能の開発にも、大いにこの技術が活用されるかもしれません。
数年後には、ターミネーターのように、声を発する汎用人工知能が登場するかもしれないですね。
生成系AIの業務活用なら!
・生成系AIを活用したPoC開発
・生成系AIのコンサルティング
・システム間API連携
最後に
いかがだったでしょうか?
弊社では
・マーケティングやエンジニアリングなどの専門知識を学習させたAI社員の開発
・要件定義・業務フロー作成を80%自動化できる自律型AIエージェントの開発
・生成AIとRPAを組み合わせた業務自動化ツールの開発
・社内人事業務を99%自動化できるAIツールの開発
・ハルシネーション対策AIツールの開発
・自社専用のAIチャットボットの開発
などの開発実績がございます。
まずは、「無料相談」にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。
➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。
「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。
セミナー内容や料金については、ご相談ください。
また、サービス紹介資料もご用意しておりますので、併せてご確認ください。