【CLAP】音声検索や高度な音声分類!音声ならこのAIのみで十分すぎる最強ツールを使ってみた

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つのベクトルの距離を小さくするように、学習されるのです。

参考:https://github.com/LAION-AI/CLAP

参考記事:CLAP

ここでは、ペアデータの類似度を対角成分で表しており、この値を大きくするようにします。ちなみに、ここで言っているペアデータとは、ある音声と、その音声を説明するようなテキストが結びついてできたデータを指します。

また、CLAPはあらかじめ大量のデータで学習されているため、ゼロショットでも高い性能を発揮するのです。他にも、エンコーダによって生成されたベクトルを「特徴量」として、深層学習に用いることも可能です。例えば、世の中の多くのText-to-Audioモデルでは、「CLAPによって生成されたテキストプロンプトのベクトル」をモデルに入力し、それをもとに音声を生成しています。

参考:https://github.com/LAION-AI/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を実際に使ってみた

ここでは、先ほどのダウンロードした音声のデータセットを用いて、テキストクエリからの音声検索を行ってみます。具体的な手順は、以下の通りです。

  1. テキストプロンプトをテキストエンコーダによってベクトル化
  2. データセット内の全音声データの埋め込みと、テキスト埋め込みとのコサイン類似度を計算
  3. 最もコサイン類似度が大きい音声のベクトルを、データセットから抽出

まずは、先ほどと同じ手順で、テキストをベクトル化しましょう。試しに、「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が用いられているのです。

参考:https://arxiv.org/pdf/2308.01546

参考記事: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の事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。

セミナー内容や料金については、ご相談ください。

また、弊社紹介資料もご用意しておりますので、併せてご確認ください。

投稿者

  • 中田

    データサイエンス専攻の大学院生。大学では、生成系AIの拡散モデルを用いた音楽生成について研究。 趣味は作曲、サッカー、コーヒー。

  • URLをコピーしました!
  • URLをコピーしました!
目次