pythonを用いてデータセットを読み込みます。
ホームページからZipファイルをダウンロードしてきて解凍しておきます。
まずファイル名からPandasを用いてデータベースを作ります。
取り出す内容は他にもあるのでサイトの説明を見ると良いと思います。
今回は性別と感情を読み取ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
import glob import pandas as pd def load_ravdess_db(path): ravdess_db = pd.DataFrame(columns=['path', 'actor', 'gender', 'emotion']) # 音声ファイルのパス、俳優(1~24)、性別、感情を読み取ります emotion_list = ["neutral", "calm", "happy", "sad", "angry", "fearful", "disgust", "surprised"] count = 0 folder_list = glob.glob(path + "\\*") for folder_path in folder_list: file_list = glob.glob(folder_path + "\\*") for file_path in file_list: nm = file_path.split('.')[0].split('-')[1:] ravdess_db.loc[count] = [file_path, int(nm[-1]), "female" if int(nm[-1]) % 2 == 0 else "male", int(nm[2])] count += 1 for i, emotion in enumerate(emotion_list): ravdess_db.loc[ravdess_db.emotion == i+1, 'emotion'] = emotion ravdess_db.emotion = ravdess_db.gender + "\n" + ravdess_db.emotion #性別と感情を合わせたものをラベルにします return ravdess_db if __name__ == "__main__": db = load_ravdess_db("Audio_Speech_Actors_01-24") |
次に、データベースを用いて音声を読み込みます。
音声は無音区間を削除してウィナーフィルタをかけておきます。
参考(:
pythonで音声信号の前処理~VADとウィナーフィルタ~)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
import soundfile as sf def wav_read(path): wave, fs = sf.read(path) # 音データと周波数を読み込む if wave.ndim > 1: # チャンネル1だけを取り出す wave = wave[:,0] return wave, fs def load_ravdess_wave(db, input_length): waves = np.empty(shape=(db.shape[0], input_length)) for i in range(db.shape[0]): wave, fs = wav_read(db.path[i]) wave, index = librosa.effects.trim(wave, top_db=25) # 無音区間の除去 wave = scipy.signal.wiener(wave) # ウィナーフィルタ if len(wave) > input_length: #3秒に合わせてトリムか0埋め wave = wave[0:input_length] elif input_length > len(wave): max_offset = input_length - len(wave) wave = np.pad(wave, (0, max_offset), "constant") waves[i,] = wave return waves if __name__ == "__main__": audio_duration = 3 sampling_rate = 44100 input_length = sampling_rate * audio_duration # 3秒間のデータを抽出 db = load_ravdess_db("Audio_Speech_Actors_01-24") waves = load_ravdess_wave(db, input_length) |
コメント