iemocap_test.py 3.79 KB
Newer Older
Caroline Chen's avatar
Caroline Chen committed
1
2
3
4
5
6
import os
import random

from torchaudio.datasets import iemocap
from torchaudio_unittest.common_utils import get_whitenoise, save_wav, TempDirMixin, TorchaudioTestCase

Caroline Chen's avatar
Caroline Chen committed
7
LABELS = ["neu", "hap", "ang", "sad", "exc", "fru", "xxx"]
Caroline Chen's avatar
Caroline Chen committed
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
33
34
35
36
37
38
39
40
41
42
43
SAMPLE_RATE = 16000


def _save_wav(filepath: str, seed: int):
    wav = get_whitenoise(
        sample_rate=SAMPLE_RATE,
        duration=0.01,
        n_channels=1,
        seed=seed,
    )
    save_wav(filepath, wav, SAMPLE_RATE)
    return wav


def _save_label(label_folder: str, filename: str, wav_stem: str):
    label = random.choice(LABELS)
    line = f"[xxx]\t{wav_stem}\t{label}\t[yyy]"
    filepath = os.path.join(label_folder, filename)

    with open(filepath, "a") as f:
        f.write(line + "\n")
    return label


def _get_samples(dataset_dir: str, session: int):
    session_folder = os.path.join(dataset_dir, f"Session{session}")
    os.makedirs(session_folder, exist_ok=True)

    wav_folder = os.path.join(session_folder, "sentences", "wav")
    label_folder = os.path.join(session_folder, "dialog", "EmoEvaluation")
    os.makedirs(wav_folder, exist_ok=True)
    os.makedirs(label_folder, exist_ok=True)

    wav_stems = []
    for i in range(5):
        for g in ["F", "M"]:
Caroline Chen's avatar
Caroline Chen committed
44
45
46
47
48
49
50
51
52
53
54
55
56
            for utt in ["impro", "script"]:
                speaker = f"Ses0{session}{g}"
                subfolder = f"{speaker}_{utt}0{i}"
                subfolder_path = os.path.join(wav_folder, subfolder)
                os.makedirs(subfolder_path, exist_ok=True)

                for j in range(5):
                    wav_stem = f"{subfolder}_F00{j}"
                    wav_stems.append(wav_stem)

    all_samples = []
    impro_samples = []
    script_samples = []
Caroline Chen's avatar
Caroline Chen committed
57
58
59
60
61
62
63
64
65
66
67
    wav_stems = sorted(wav_stems)
    for wav_stem in wav_stems:
        subfolder = wav_stem[:-5]
        speaker = subfolder.split("_")[0]

        wav_file = os.path.join(wav_folder, subfolder, wav_stem + ".wav")
        wav = _save_wav(wav_file, seed=0)
        label = _save_label(label_folder, subfolder + ".txt", wav_stem)
        if label == "xxx":
            continue
        sample = (wav, SAMPLE_RATE, wav_stem, label, speaker)
Caroline Chen's avatar
Caroline Chen committed
68
69
70
71
72
73
        all_samples.append(sample)

        if "impro" in subfolder:
            impro_samples.append(sample)
        else:
            script_samples.append(sample)
Caroline Chen's avatar
Caroline Chen committed
74

Caroline Chen's avatar
Caroline Chen committed
75
    return all_samples, script_samples, impro_samples
Caroline Chen's avatar
Caroline Chen committed
76
77
78
79
80


def get_mock_dataset(dataset_dir: str):
    os.makedirs(dataset_dir, exist_ok=True)

Caroline Chen's avatar
Caroline Chen committed
81
82
83
    all_samples = []
    script_samples = []
    impro_samples = []
Caroline Chen's avatar
Caroline Chen committed
84
    for session in range(1, 4):
Caroline Chen's avatar
Caroline Chen committed
85
86
87
88
89
        samples = _get_samples(dataset_dir, session)
        all_samples += samples[0]
        script_samples += samples[1]
        impro_samples += samples[2]
    return all_samples, script_samples, impro_samples
Caroline Chen's avatar
Caroline Chen committed
90
91
92
93
94


class TestIemocap(TempDirMixin, TorchaudioTestCase):
    root_dir = None

Caroline Chen's avatar
Caroline Chen committed
95
96
97
    all_samples = []
    script_samples = []
    impro_samples = []
Caroline Chen's avatar
Caroline Chen committed
98
99
100
101
102

    @classmethod
    def setUpClass(cls):
        cls.root_dir = cls.get_base_temp_dir()
        dataset_dir = os.path.join(cls.root_dir, "IEMOCAP")
Caroline Chen's avatar
Caroline Chen committed
103
        cls.all_samples, cls.script_samples, cls.impro_samples = get_mock_dataset(dataset_dir)
Caroline Chen's avatar
Caroline Chen committed
104
105
106
107
108
109
110
111
112

    def _testIEMOCAP(self, dataset, samples):
        num_samples = 0
        for i, data in enumerate(dataset):
            self.assertEqual(data, samples[i])
            num_samples += 1

        assert num_samples == len(samples)

Caroline Chen's avatar
Caroline Chen committed
113
    def testIEMOCAPFullDataset(self):
Caroline Chen's avatar
Caroline Chen committed
114
        dataset = iemocap.IEMOCAP(self.root_dir)
Caroline Chen's avatar
Caroline Chen committed
115
116
117
118
119
120
121
122
123
        self._testIEMOCAP(dataset, self.all_samples)

    def testIEMOCAPScriptedDataset(self):
        dataset = iemocap.IEMOCAP(self.root_dir, utterance_type="scripted")
        self._testIEMOCAP(dataset, self.script_samples)

    def testIEMOCAPImprovisedDataset(self):
        dataset = iemocap.IEMOCAP(self.root_dir, utterance_type="improvised")
        self._testIEMOCAP(dataset, self.impro_samples)