You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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)

问题根源

  1. 循环外处理逻辑:重采样、归一化及特征提取代码都在for循环外部,只会处理最后一个加载的音频文件,导致仅生成一组MFCC特征,无法对应所有匹配的音频。
  2. 变量未定义:提取MFCC时使用了未定义的变量t,应替换为处理后的normalized_audio_signal。
  3. 未存储数据对:未将每个音频的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:03:13