数据集:
ami
任务:
语言:
计算机处理:
monolingual大小:
100K<n<1M批注创建人:
expert-generated源数据集:
original许可:
已废弃:这个传统数据集已经过时了。请使用 edinburghcstr/ami 代替。
AMI会议语料库由100小时的会议录音组成。录音使用一系列与公共时间轴同步的信号。其中包括近距离和远距离麦克风、个人和全景摄像机以及幻灯片投影机和电子白板的输出。在会议期间,与会者还可以使用未同步的笔来记录所写的内容。会议录音使用三个具有不同声学特性的房间进行英语录制,其中包括大多数非母语人士。
AMI数据集的单个样本包含非常大的音频文件(10至60分钟之间)。这样的长度对于大多数语音识别模型来说是不可行的。下面我们将展示如何将数据集有效地分成多个由数据集创建者定义的片段。
以下函数将把长音频文件切割为定义的片段长度:
import librosa
import math
from datasets import load_dataset
SAMPLE_RATE = 16_000
def chunk_audio(batch):
new_batch = {
"audio": [],
"words": [],
"speaker": [],
"lengths": [],
"word_start_times": [],
"segment_start_times": [],
}
audio, _ = librosa.load(batch["file"][0], sr=SAMPLE_RATE)
word_idx = 0
num_words = len(batch["words"][0])
for segment_idx in range(len(batch["segment_start_times"][0])):
words = []
word_start_times = []
start_time = batch["segment_start_times"][0][segment_idx]
end_time = batch["segment_end_times"][0][segment_idx]
# go back and forth with word_idx since segments overlap with each other
while (word_idx > 1) and (start_time < batch["word_end_times"][0][word_idx - 1]):
word_idx -= 1
while word_idx < num_words and (start_time > batch["word_start_times"][0][word_idx]):
word_idx += 1
new_batch["audio"].append(audio[int(start_time * SAMPLE_RATE): int(end_time * SAMPLE_RATE)])
while word_idx < num_words and batch["word_start_times"][0][word_idx] < end_time:
words.append(batch["words"][0][word_idx])
word_start_times.append(batch["word_start_times"][0][word_idx])
word_idx += 1
new_batch["lengths"].append(end_time - start_time)
new_batch["words"].append(words)
new_batch["speaker"].append(batch["segment_speakers"][0][segment_idx])
new_batch["word_start_times"].append(word_start_times)
new_batch["segment_start_times"].append(batch["segment_start_times"][0][segment_idx])
return new_batch
ami = load_dataset("ami", "headset-single")
ami = ami.map(chunk_audio, batched=True, batch_size=1, remove_columns=ami["train"].column_names)
切割后的音频文件仍然可能达到一分钟长。要进一步将数据分块为较短的音频块,可以使用以下脚本。
MAX_LENGTH_IN_SECONDS = 20.0
def chunk_into_max_n_seconds(batch):
new_batch = {
"audio": [],
"text": [],
}
sample_length = batch["lengths"][0]
segment_start = batch["segment_start_times"][0]
if sample_length > MAX_LENGTH_IN_SECONDS:
num_chunks_per_sample = math.ceil(sample_length / MAX_LENGTH_IN_SECONDS)
avg_chunk_length = sample_length / num_chunks_per_sample
num_words = len(batch["words"][0])
# start chunking by times
start_word_idx = end_word_idx = 0
chunk_start_time = 0
for n in range(num_chunks_per_sample):
while (end_word_idx < num_words - 1) and (batch["word_start_times"][0][end_word_idx] < segment_start + (n + 1) * avg_chunk_length):
end_word_idx += 1
chunk_end_time = int((batch["word_start_times"][0][end_word_idx] - segment_start) * SAMPLE_RATE)
new_batch["audio"].append(batch["audio"][0][chunk_start_time: chunk_end_time])
new_batch["text"].append(" ".join(batch["words"][0][start_word_idx: end_word_idx]))
chunk_start_time = chunk_end_time
start_word_idx = end_word_idx
else:
new_batch["audio"].append(batch["audio"][0])
new_batch["text"].append(" ".join(batch["words"][0]))
return new_batch
ami = ami.map(chunk_into_max_n_seconds, batched=True, batch_size=1, remove_columns=ami["train"].column_names, num_proc=64)
可以在 here 找到名称为“headset-single”的分段和分块的数据集。
automatic-speech-recognition: 可以使用该数据集来训练自动语音识别(ASR)模型。模型将以音频文件作为输入,并被要求将其转录为书面文本。最常用的评估指标是词错误率(WER)。该任务目前没有活跃的排行榜。
speaker-diarization: 可以使用该数据集来训练演讲者辨析(SD)模型。模型将以音频文件作为输入,并被要求预测在何时哪位说话者发言。
音频为英语。
一个典型的数据点包括音频文件的路径(或者在多头戴式耳机或多麦克风数据集中的多个文件),称为file,并以单词列表的形式给出其转录,称为words。还提供了关于发言者、单词起始时间、单词结束时间、片段起始时间、片段结束时间的附加信息。
并且还提供了与其转录相关的发言者和段落的一些附加信息。
{'word_ids': ["ES2004a.D.words1", "ES2004a.D.words2", ...],
'word_start_times': [0.3700000047683716, 0.949999988079071, ...],
'word_end_times': [0.949999988079071, 1.5299999713897705, ...],
'word_speakers': ['A', 'A', ...],
'segment_ids': ["ES2004a.sync.1", "ES2004a.sync.2", ...]
'segment_start_times': [10.944000244140625, 17.618999481201172, ...],
'segment_end_times': [17.618999481201172, 18.722000122070312, ...],
'segment_speakers': ['A', 'B', ...],
'words', ["hmm", "hmm", ...]
'channels': [0, 0, ..],
'file': "/.cache/huggingface/datasets/downloads/af7e748544004557b35eef8b0522d4fb2c71e004b82ba8b7343913a15def465f"
'audio': {'path': "/.cache/huggingface/datasets/downloads/af7e748544004557b35eef8b0522d4fb2c71e004b82ba8b7343913a15def465f",
'array': array([-0.00048828, -0.00018311, -0.00137329, ..., 0.00079346, 0.00091553, 0.00085449], dtype=float32),
'sampling_rate': 16000},
}
word_ids: 单词的ID列表
word_start_times: 单词发言的开始时间列表(以秒为单位)
word_end_times: 单词发言的结束时间列表(以秒为单位)
word_speakers: 单词的发言者列表(每个单词一个发言者)
segment_ids: 段落的ID列表
segment_start_times: 段落开始的时间列表
segment_end_times: 段落结束的时间列表
segment_speakers: 段落的发言者列表(每个段落一个发言者)
words: 所有讲话单词的列表
channels: 每个单词使用的所有声道的列表
file: 音频文件的路径
audio: 包含下载的音频文件路径、解码的音频数组以及采样率的字典。需要注意的是,当访问音频列时:dataset[0]["audio"],音频文件将自动解码并重新采样为dataset.features["audio"].sampling_rate。解码和重新采样大量音频文件可能需要很长时间。因此,在访问"audio"列之前,应首先查询样本索引,例如dataset[0]["audio"]应始终优于dataset["audio"][0]。
该数据集由几个配置组成,每个配置都有训练/验证/测试拆分:
headset-single: 单个头戴式麦克风的近距离音频。该配置仅包括当前发言者的头戴耳机的音频。
headset-multi(4个通道):四个独立头戴式麦克风的近距离音频。该配置包括四个独立头戴麦克风的音频。对于每个注释,有4个音频文件0、1、2、3。
microphone-single: 单个麦克风的远场音频,即麦克风阵列的1-1。
microphone-multi(8个通道):麦克风阵列的远场音频,包括第一个麦克风阵列1-1, 1-2, ..., 1-8的音频。
通常,headset-single和headset-multi的噪声要明显少于microphone-single和microphone-multi。
| Train | Valid | Test | |
|---|---|---|---|
| headset-single | 136 (80h) | 18 (9h) | 16 (9h) |
| headset-multi (4 channels) | 136 (320h) | 18 (36h) | 16 (36h) |
| microphone-single | 136 (80h) | 18 (9h) | 16 (9h) |
| microphone-multi (8 channels) | 136 (640h) | 18 (72h) | 16 (72h) |
注意,每个样本包含10至60分钟的音频数据,直接进行转录是不切实际的。应利用段落和单词的起始时间和结束时间将样本分成可管理大小的较小样本。
有关数据集创建的所有信息可以在 here 找到
[需要更多信息]
[需要更多信息]
谁是源语言制作人?[需要更多信息]
[需要更多信息]
注释者是谁?[需要更多信息]
该数据集包含在线捐赠声音的人们。您同意不试图确定数据集中的发言者的身份。
[需要更多信息]
[需要更多信息]
[需要更多信息]
[需要更多信息]
CC BY 4.0
感谢 @cahya-wirawan 和 @patrickvonplaten 添加了这个数据集。
TODO