THCHS30数据集介绍

发布时间:2023-05-23

一、数据集概述

THCHS30是中文语音数据集,共有30个小时的录音,包含了120个男女说话人的语音。数据集的语音覆盖范围很广泛,包括新闻、电话、报告等不同语境下的录音,涵盖了普通话、方言和英文等多种语言。数据集的标注信息详细,包括了语音文本、文本拼音、字音、语速等信息。

二、数据集下载

THCHS30数据集可以从官方网站进行下载:http://www.openslr.org/18/。下载的数据包解压后包含了三个文件夹,分别是data文件夹、test文件夹和doc文件夹。其中data文件夹是实际包含语音和标注的文件夹,可以用来进行语音识别等任务的训练和测试。test文件夹和doc文件夹则分别是测试脚本和标注说明。

三、数据集预处理

THCHS30数据集包含的语音数据格式为WAV格式,需要进行预处理才能用于语音识别等任务的训练和测试。常见的预处理方式包括MFCC特征提取和语音分割。

1. MFCC特征提取

import librosa
def extract_mfcc(file_path, n_mfcc=13):
    # 读取语音文件并取MFCC特征
    y, sr = librosa.load(file_path, sr=16000)
    mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=n_mfcc)
    return mfcc

2. 语音分割

import librosa
def split_audio(file_path, min_silence_len=1000, hop_length=256):
    # 读取语音文件并进行语音分割
    y, sr = librosa.load(file_path, sr=16000)
    intervals = librosa.effects.split(y, top_db=20, hop_length=hop_length, \
    min_silence_len=min_silence_len)
    audio_segments = []
    for interval in intervals:
        segment = y[interval[0]:interval[1]]
        audio_segments.append(segment)
    return audio_segments

四、数据集应用

THCHS30数据集可以用于训练和测试语音识别、语音合成、语音分割等任务。以下是一些使用THCHS30数据集进行语音识别的代码示例。

1. 安装必要的依赖

!pip install torch==1.9.0 torchvision==0.10.0 torchaudio==0.9.0
!pip install kaldi_io fastai==2.3.1

2. 数据集的准备和预处理

import kaldi_io
from tqdm.notebook import tqdm
# 将语音数据生成为Kaldi格式
with open("data/train/wav.scp", "w") as f:
    for file_path in tqdm(train_audio_paths):
        f.write(file_path.split("/")[-1][:-4] + " " + file_path + "\n")
# 生成特征,并将特征保存到磁盘
for utt_id, feat in kaldi_io.read_mat_scp("scp:data/train/feats.scp"):
    np.save(f"features/train/{utt_id}.npy", feat)
# 生成标签
with open("data/train/text", "w") as f:
    for line in tqdm(train_transcripts):
        utt_id, _, transcript = line.split(" ", 2)
        transcript = transcript.strip().replace(" ", "")
        f.write(f"{utt_id} {transcript}\n")
# 将标签转化为字符索引
char2idx = {}
with open("data/train/text", "r") as f:
    for line in f:
        utt_id, transcript = line.strip().split(" ", 1)
        for char in transcript:
            if char not in char2idx:
                char2idx[char] = len(char2idx) + 1
# 将字符索引保存到磁盘
with open("data/char2idx.json", "w") as f:
    json.dump(char2idx, f)

3. 模型的训练和测试

import json
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from model import MyModel
from dataset import AudioDataset
# 加载字符索引
with open("data/char2idx.json", "r") as f:
    char2idx = json.load(f)
# 加载数据集
train_dataset = AudioDataset("data/train", char2idx)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
# 初始化模型和优化器
model = MyModel(num_classes=len(char2idx) + 1)
optimizer = optim.Adam(model.parameters(), lr=1e-3)
# 定义损失函数
criterion = nn.CTCLoss(blank=len(char2idx))
# 训练模型
for epoch in range(10):
    for batch in train_loader:
        audio, audio_lengths, text, text_lengths = batch
        optimizer.zero_grad()
        log_probs = model(audio)
        input_lengths = audio_lengths // 4
        loss = criterion(log_probs.transpose(0, 1).log_softmax(2), text, input_lengths, text_lengths)
        loss.backward()
        optimizer.step()
# 测试模型
test_dataset = AudioDataset("data/test", char2idx)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=True)
total_cer = 0
total_wer = 0
total = 0
with torch.no_grad():
    for batch in test_loader:
        audio, _, text, text_lengths = batch
        log_probs = model(audio)
        output = log_probs.transpose(0, 1).argmax(2)
        total_cer += (text == output).sum().item()
        total_wer += (text != output).sum().item()
        total += text_lengths.sum().item()
cer = total_cer / total
wer = total_wer / total

五、总结

THCHS30数据集是一个非常有价值的中文语音数据集,可以用于训练和评估语音识别、语音合成、语音分割等任务。预处理语音数据和处理数据集的代码示例中展示了一些常见的处理方式,包括MFCC特征提取和语音分割。这些代码示例可以帮助进一步了解语音数据的处理过程,方便进行后续的任务开发。