Alkaidse 2022-05-23 10:05 采纳率: 0%
浏览 2480

TypeError: melspectrogram() takes 0 positional arguments but 2 were given该怎么解决?

import argparse
import os

import numpy as np
from paddle import inference
from paddleaudio.backends import load as load_audio
from paddleaudio.datasets import ESC50
from paddleaudio.features import melspectrogram
from scipy.special import softmax

yapf: disable

parser = argparse.ArgumentParser()
parser.add_argument("--model_dir", type=str, required=True, default="./export", help="The directory to static model.")
parser.add_argument('--device', choices=['cpu', 'gpu', 'xpu'], default="gpu", help="Select which device to train model, defaults to gpu.")
parser.add_argument("--wav", type=str, required=True, help="Audio file to infer.")
parser.add_argument("--batch_size", type=int, default=1, help="Batch size per GPU/CPU for training.")
parser.add_argument('--use_tensorrt', type=eval, default=False, choices=[True, False], help='Enable to use tensorrt to speed up.')
parser.add_argument("--precision", type=str, default="fp32", choices=["fp32", "fp16"], help='The tensorrt precision.')
parser.add_argument('--cpu_threads', type=int, default=10, help='Number of threads to predict when using cpu.')
parser.add_argument('--enable_mkldnn', type=eval, default=False, choices=[True, False], help='Enable to use mkldnn to speed up when using cpu.')
parser.add_argument("--log_dir", type=str, default="./log", help="The path to save log.")
args = parser.parse_args()

yapf: enable

def extract_features(files: str, **kwargs):
waveforms = []
srs = []
max_length = float('-inf')
for file in files:
waveform, sr = load_audio(file, sr=None)
max_length = max(max_length, len(waveform))
waveforms.append(waveform)
srs.append(sr)

feats = []
for i in range(len(waveforms)):
    # padding
    if len(waveforms[i]) < max_length:
        pad_width = max_length - len(waveforms[i])
        waveforms[i] = np.pad(waveforms[i], pad_width=(0, pad_width))
    feat = melspectrogram(waveforms[i], sr, **kwargs).transpose()
    feats.append(feat)

return np.stack(feats, axis=0)

class Predictor(object):
def init(self,
model_dir,
device="gpu",
batch_size=1,
use_tensorrt=False,
precision="fp32",
cpu_threads=10,
enable_mkldnn=False):
self.batch_size = batch_size

    model_file = os.path.join(model_dir, "inference.pdmodel")
    params_file = os.path.join(model_dir, "inference.pdiparams")

    assert os.path.isfile(model_file) and os.path.isfile(
        params_file), 'Please check model and parameter files.'

    config = inference.Config(model_file, params_file)
    if device == "gpu":
        # set GPU configs accordingly
        # such as intialize the gpu memory, enable tensorrt
        config.enable_use_gpu(100, 0)
        precision_map = {
            "fp16": inference.PrecisionType.Half,
            "fp32": inference.PrecisionType.Float32,
        }
        precision_mode = precision_map[precision]

        if use_tensorrt:
            config.enable_tensorrt_engine(
                max_batch_size=batch_size,
                min_subgraph_size=30,
                precision_mode=precision_mode)
    elif device == "cpu":
        # set CPU configs accordingly,
        # such as enable_mkldnn, set_cpu_math_library_num_threads
        config.disable_gpu()
        if enable_mkldnn:
            # cache 10 different shapes for mkldnn to avoid memory leak
            config.set_mkldnn_cache_capacity(10)
            config.enable_mkldnn()
        config.set_cpu_math_library_num_threads(cpu_threads)
    elif device == "xpu":
        # set XPU configs accordingly
        config.enable_xpu(100)

    config.switch_use_feed_fetch_ops(False)
    self.predictor = inference.create_predictor(config)
    self.input_handles = [
        self.predictor.get_input_handle(name)
        for name in self.predictor.get_input_names()
    ]
    self.output_handle = self.predictor.get_output_handle(
        self.predictor.get_output_names()[0])

def predict(self, wavs):
    feats = extract_features(wavs)

    self.input_handles[0].copy_from_cpu(feats)
    self.predictor.run()
    logits = self.output_handle.copy_to_cpu()
    probs = softmax(logits, axis=1)
    indices = np.argmax(probs, axis=1)

    return indices

if name == "main":
# Define predictor to do prediction.
predictor = Predictor(args.model_dir, args.device, args.batch_size,
args.use_tensorrt, args.precision, args.cpu_threads,
args.enable_mkldnn)

wavs = [args.wav]

for i in range(len(wavs)):
    wavs[i] = os.path.abspath(os.path.expanduser(wavs[i]))
    assert os.path.isfile(
        wavs[i]), f'Please check input wave file: {wavs[i]}'

results = predictor.predict(wavs)
for idx, wav in enumerate(wavs):
    print(f'Wav: {wav} \t Label: {ESC50.label_list[results[idx]]}')

报错:
Traceback (most recent call last):
File "D:\PaddleSpeech-develop\paddlespeech\cls\exps\panns\deploy\predict.py", line 140, in
results = predictor.predict(wavs)
File "D:\PaddleSpeech-develop\paddlespeech\cls\exps\panns\deploy\predict.py", line 116, in predict
feats = extract_features(wavs)
File "D:\PaddleSpeech-develop\paddlespeech\cls\exps\panns\deploy\predict.py", line 54, in extract_features
feat = melspectrogram(waveforms[i], sr, **kwargs).transpose()
TypeError: melspectrogram() takes 0 positional arguments but 2 were given

  • 写回答

1条回答 默认 最新

  • 於黾 2022-05-23 10:15
    关注

    错误翻译一下:
    melspectrogram函数有0个位置参数,但是输入了2个
    换句话说,melspectrogram在调用的时候,必须使用参数名称来传递参数,不能直接按位置传入参数
    你需要写:函数(参数1=值1,参数2=值2)这种形式

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月23日

悬赏问题

  • ¥100 c语言,请帮蒟蒻看一个题
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)