商城首页欢迎来到中国正版软件门户

您的位置:首页 >正确使用 librosa.get_duration 避免参数错误

正确使用 librosa.get_duration 避免参数错误

  发布于2026-04-15 阅读(0)

扫一扫,手机访问

如何正确调用 librosa.get_duration() 避免参数错误

librosa.get_duration() 是无参函数,不能直接传入音频数组;必须显式指定 y(一维音频信号)和 sr(采样率)关键字参数,否则会报错“takes 0 positional arguments but 1 was given”。

librosa.get_duration() 是无参函数,不能直接传入音频数组;必须显式指定 `y`(一维音频信号)和 `sr`(采样率)关键字参数,否则会报错“takes 0 positional arguments but 1 was given”。

在使用 librosa.get_duration() 计算音频时长时,一个常见误区是将其误当作接受音频张量的普通函数调用。实际上,librosa.get_duration() 是一个不接收任何位置参数(positional arguments)的函数,其设计要求所有输入必须通过关键字参数明确传入:核心参数为 y(一维音频时间序列)和 sr(采样率)。若直接写成 lb.get_duration(swap_ad[1]),Python 会尝试将 swap_ad[1] 作为第一个位置参数传递,而该函数签名中并未定义位置参数,因此触发 TypeError。

正确做法是:确保传入的是单声道、一维的 NumPy 数组,并显式指定 y= 和 sr=。例如,在你的代码中,swap_ad[1] 是多通道(如立体声)的二维数组(shape: [n_samples, n_channels]),需进一步切片获取单声道信号(如 swap_ad[1][:, 0] 表示第一通道的所有采样点),同时传入已知采样率 sr:

import numpy as np
import librosa as lb
import soundfile as sp

def decoding_stems(file_name):
    audio, sr = sp.read_stems(file_name, sample_rate=22050)
    swap_ad = np.swapaxes(audio, 1, 2)  # shape: [n_samples, n_channels, n_stems]

    # ✅ 正确:提取第1个stem的第1个声道,显式传入 y 和 sr
    duration = lb.get_duration(y=swap_ad[1][:, 0], sr=sr)

    # 计算可被6整除的总帧数(每段0.6秒 → 6帧/段)
    duration_length = int((duration // 0.6) * 6)

    return stft_frame(file_name, duration_length, 6)

⚠️ 注意事项:

  • swap_ad[1] 若本身已是单声道(shape: [n_samples]),则直接用 y=swap_ad[1] 即可,但仍必须加 y= 前缀
  • 不要省略 sr 参数——即使与 read_stems 中的 sample_rate 一致,get_duration() 也不会自动推断;
  • 若音频含多个声道且需整体时长,应先混音(如 np.mean(swap_ad[1], axis=1))再传入,而非直接传入二维数组;
  • 该错误常在训练集运行成功、测试集报错时出现,往往因测试音频格式/通道数与训练不一致导致 swap_ad[1] 维度异常,建议在调用前添加形状校验(如 assert swap_ad[1].ndim <= 2)。

总结:牢记 librosa.get_duration() 的函数签名是 get_duration(*, y=None, sr=22050, ...) —— 星号 * 表示其后所有参数均为仅限关键字参数(keyword-only)。任何位置传参都会引发 TypeError。始终使用 y=... 和 sr=... 显式调用,即可彻底规避此问题。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注