reazon-research/reazonspeech(tiny)のデータセットをflac及びwavファイルで個別に保存する

環境

  • L4 GPU
  • ubuntu22.04

準備

実行

pythonflacに変換

from datasets import load_dataset
import os

# データセットをロード
ds = load_dataset("reazon-research/reazonspeech", "tiny")

# 出力ディレクトリを作成
output_dir = "output_flac"
os.makedirs(output_dir, exist_ok=True)

# データセットの各サンプルを処理
for sample in ds["train"]:
    # 音声データのローカルパスを取得
    audio_path = sample["audio"]["path"]

    # 出力ファイルのパスを作成
    output_path = os.path.join(output_dir, os.path.basename(audio_path))

    # 音声データをコピー
    with open(audio_path, "rb") as src_file, open(output_path, "wb") as dst_file:
        dst_file.write(src_file.read())

print("変換が完了しました。")

pythonでwavに変換

from datasets import load_dataset
import os
import librosa
import soundfile as sf

# データセットをロード
ds = load_dataset("reazon-research/reazonspeech", "tiny")

# 出力ディレクトリを作成
output_dir = "output_wav"
os.makedirs(output_dir, exist_ok=True)

# データセットの各サンプルを処理
for sample in ds["train"]:
    # 音声データのローカルパスを取得
    audio_path = sample["audio"]["path"]
    
    # 音声データを読み込み
    audio, sr = librosa.load(audio_path, sr=None)
    
    # 出力ファイルのパスを作成
    output_path = os.path.join(output_dir, os.path.splitext(os.path.basename(audio_path))[0] + ".wav")
    
    # 音声データを保存
    sf.write(output_path, audio, sr, subtype='PCM_24')

print("変換が完了しました。")

変換したwavファイルの情報を確認

以下で変換したwavファイルをいくつか取得して情報を確認します

import os
import soundfile as sf

output_dir = "output_wav"

# 変換後のwavファイルを3つ選択
wav_files = [file for file in os.listdir(output_dir) if file.endswith(".wav")][:3]

for wav_file in wav_files:
    file_path = os.path.join(output_dir, wav_file)
    
    # wavファイルの情報を取得
    audio_info = sf.info(file_path)
    
    print(f"ファイル名: {wav_file}")
    print(f"サンプリングレート: {audio_info.samplerate} Hz")
    print(f"チャンネル数: {audio_info.channels}")
    print(f"ビット深度: {audio_info.subtype}")
    print(f"長さ: {audio_info.duration:.2f} 秒")
    print("------------------------")

以下のように表示されます

ファイル名: 6c52ba0a0ba57.wav
サンプリングレート: 16000 Hz
チャンネル数: 1
ビット深度: PCM_24
長さ: 5.63 秒
------------------------
ファイル名: ff76142fa5e77.wav
サンプリングレート: 16000 Hz
チャンネル数: 1
ビット深度: PCM_24
長さ: 1.62 秒
------------------------
ファイル名: f879dcb872a87.wav
サンプリングレート: 16000 Hz
チャンネル数: 1
ビット深度: PCM_24
長さ: 23.92 秒
------------------------

ffmpegflacからwavに変換

まずはGPUの並列処理をするために、以下のライブラリを入れます

sudo apt-get install parallel

以下が並列で処理をするためのコードです. -j $(nproc) にてCPUのシステムコア数の最大値を指定しているため、必要に応じて変更してください

#!/bin/bash

# 引数から音声ファイルがあるパスを取得
input_dir="$1"

# 変換後のwavファイルを保存するフォルダを作成
mkdir -p convert_wav

# 並列処理の関数を定義
convert_file() {
  file="$1"
  output_file="convert_wav/$(basename "${file%.flac}.wav")"
  echo "Converting file: $file"
  ffmpeg -i "$file" -acodec pcm_s16le -ar 44100 -ac 2 "$output_file"
  if [ $? -eq 0 ]; then
    echo "Conversion successful: $output_file"
  else
    echo "Conversion failed: $file"
  fi
}

# GNU Parallelを使用して並列処理を実行
export -f convert_file
find "$input_dir" -maxdepth 1 -name "*.flac" | parallel -j $(nproc) convert_file {}

echo "Conversion complete."