はじめに
Huggingfaceにいる機械学習のマルチモーダルデータセット(画像、動画、オーディオ)は大体サイズが大きいし、数も多い。全部ダウンロードするとしんどいし、時間かかります。そこで、自分のノートのため、Huggingfaceからデータセットをダウンロードするや処理をまとめます。
今回の記事で、例としてオーディオデータセットを保存します。オーディオデータを保存するためにはsoundfile
ライブラリーが必要となります。まず必要ライブラリーをインストールします。
pip install datasets soundfile
datasets
はHuggingfaceのデータセットをアクセスできるようになるため必要なライブラリーです。
データセットのロード
今回の記事では以下の「原神インパクト」キャラ音声データセットをサンプルとして使います。
https://huggingface.co/datasets/simon3000/genshin-voice
from datasets import load_dataset
dataset = load_dataset('simon3000/genshin-voice', split='train', streaming=True)
これでデータセットのロードを完了しました。
このデータセットは約228GBの大きさで、すべてをダウンロードするとしんどいです。
そこで、部分的だけをダウウンロードするかにします。
フィルター
まずはフィルターを使用します。
フィルターのフォーマットが以下とないります。
# filter(lambda x: x[キー]の条件)
dataset.filter(lambda x: x["language"] == "English")
dataset.filter(lambda x: x["speaker"] == "Klee")
「キー」の条件アイテムはデータセットのページのData Studioで確認できます。
今回の例でオーディオの言語を英語と日本語をせっていし、テキストやトランスクリプトありオーディオだけをフィルターします。
from datasets import load_dataset
dataset = load_dataset('simon3000/genshin-voice', split='train', streaming=True)
voiceDS = dataset.filter(lambda voice: voice["language"] in ["English(US)", "Japanese"]
and voice['speaker_type'] == 'TALK_ROLE_NPC'
and voice['transcription'] != '')
サブサンプル
またすべてのデータをありのままでいくつかのサンプルを取ることも可能です。以下のスクリプトで1000 Rowのデータを回収します。
from datasets import load_dataset
dataset = load_dataset('simon3000/genshin-voice', split='train', streaming=True)
voiceDS = dataset.take(1000) # dataset.take(データの数)
まとめてデータ保存
上のスクリプトをまとめて、回収データをローカルで保存します。
######################################## (1) データセットロード
from datasets import load_dataset
dataset = load_dataset('simon3000/genshin-voice', split='train', streaming=True)
# データセットをフィルターする
voiceDS = dataset.filter(lambda voice: voice["language"] in ["English(US)", "Japanese"]
and voice['speaker_type'] == 'TALK_ROLE_NPC'
and voice['transcription'] != '')
# フィルターされたデータセットをサンプルする
voiceDS = voiceDS.take(1000)
######################################## (2) ローカルフォルダー準備
import os
ds_folder = 'dataset/simon3000_genshin-voice'
audio_folder = 'audiods'
os.makedirs(f"{ds_folder}/{audio_folder}", exist_ok=True)
######################################## (3) オーディオデータ保存
import soundfile as sf
for i, voice in enumerate(voiceDS):
sf.write(audio_path, voice['audio']['array'], voice['audio']['sampling_rate'])