一、數據集概述
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特徵提取和語音分割。這些代碼示例可以幫助進一步了解語音數據的處理過程,方便進行後續的任務開發。
原創文章,作者:UDPNE,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/334034.html