基于Librosa的语音转文本模型特征与样本数量不匹配问题求助
语音转文本模型数据匹配问题及修正方案
问题描述
我正在构建语音转文本模型,流程是用librosa.load()加载音频文件,经重采样、归一化后提取MFCC特征。目前遇到特征数量(1000)与对应句子数量(6000)不匹配的问题,已通过音频文件名与句子名完成关联匹配,期望获取数量匹配的有效数据。
原始代码
import os import librosa import numpy as np
指定音频文件目录
audio_dir = '/content/cv-corpus-12.0-delta-2022-12-07/en/clips'
假设df1是包含路径的DataFrame
audio_column = df1['path']
遍历目录下所有文件
for filename in os.listdir(audio_dir): if filename.endswith('.wav') or filename.endswith('.mp3'): # 检查文件名(不含目录)是否存在于audio_column中 if filename in audio_column.values: # 构建音频文件完整路径 audio_file_path = os.path.join(audio_dir, filename) # 用librosa加载音频文件 audio_data, sample_rate = librosa.load(audio_file_path, sr=None, mono=True, dtype=np.float32) # 打印重采样后音频的信息 print(f'已将{filename}重采样至{sample_rate} Hz:') else: continue # 以下代码在循环外,仅处理最后一个加载的音频 resampled_audio=librosa.resample(audio_data,orig_sr=sample_rate,target_sr=16000) normalized_audio_signal = librosa.util.normalize(resampled_audio) stft=librosa.core.stft(normalized_audio_signal,n_fft=2048,hop_length=512) s=np.abs(stft) a=librosa.amplitude_to_db(s) librosa.display.specshow(a) # 此处变量t未定义,存在错误 mfccs=librosa.feature.mfcc(y=t,sr=16000,n_mfcc=13)
问题根源
- 循环外处理逻辑:重采样、归一化及特征提取代码都在
for循环外部,只会处理最后一个加载的音频文件,导致仅生成一组MFCC特征,无法对应所有匹配的音频。 - 变量未定义:提取MFCC时使用了未定义的变量
t,应替换为处理后的normalized_audio_signal。 - 未存储数据对:未将每个音频的MFCC特征与对应句子关联存储,无法建立一一对应的数据集。
修正后的代码
import os import librosa import numpy as np import pandas as pd # 指定音频文件目录 audio_dir = '/content/cv-corpus-12.0-delta-2022-12-07/en/clips' # 假设df1包含音频路径和对应句子(需确保有存储句子的列,比如'transcript') audio_column = df1['path'] transcript_column = df1['transcript'] # 初始化列表存储特征和对应文本 mfcc_features = [] corresponding_transcripts = [] for filename in os.listdir(audio_dir): if filename.endswith('.wav') or filename.endswith('.mp3'): # 检查文件名是否在DataFrame的路径列中 if filename in audio_column.values: # 获取该音频对应的句子 transcript = df1[df1['path'] == filename]['transcript'].iloc[0] # 构建完整路径 audio_file_path = os.path.join(audio_dir, filename) # 加载音频(直接指定目标采样率16000,省去后续重采样步骤) audio_data, sample_rate = librosa.load(audio_file_path, sr=16000, mono=True, dtype=np.float32) # 归一化音频 normalized_audio = librosa.util.normalize(audio_data) # 提取MFCC特征 mfccs = librosa.feature.mfcc(y=normalized_audio, sr=16000, n_mfcc=13) # 可选择对MFCC做降维(比如取均值),确保每个音频对应一个固定维度的特征向量 # mfccs_mean = np.mean(mfccs, axis=1) # 将特征和句子存入列表 mfcc_features.append(mfccs) corresponding_transcripts.append(transcript) print(f'已处理音频:{filename},对应句子:{transcript[:20]}...') else: continue # 将数据转换为数组或DataFrame,方便后续模型训练 mfcc_array = np.array(mfcc_features) transcripts_array = np.array(corresponding_transcripts) # 或者保存为DataFrame dataset_df = pd.DataFrame({'mfcc': mfcc_features, 'transcript': corresponding_transcripts})
关键优化点
- 将所有音频处理逻辑移入循环内部,确保每个匹配的音频都生成对应的MFCC特征。
- 直接在
librosa.load()中指定sr=16000,省去额外的重采样步骤,提升效率。 - 从DataFrame中取出对应句子,将特征与文本一一关联存储,保证数据数量匹配。
- 可选对MFCC特征做降维处理(比如取时间轴上的均值),得到固定维度的特征向量,适配多数模型输入要求。
内容的提问来源于stack exchange,提问作者mouna altahhan
相关产品推荐
相关产品推荐

