使用PyWavelets音频去噪遇TypeError错误,请求问题排查
问题修复方案
错误根源
触发TypeError: arrays to stack must be passed as a "sequence" type such as list or tuple的核心原因是**pywt.threshold函数的关键字参数使用错误**:你传入了value=threshold_value,但该函数的阈值参数正确名称是threshold,错误的参数名导致函数内部参数解析逻辑混乱,进而抛出数组堆叠相关的错误。
另外,代码中还存在一个音频数据转换的潜在问题:audio_clip.to_soundarray返回的是范围[-1, 1]的浮点数组,直接强制转换为np.int16会导致数据截断(int16范围是[-32768, 32767]),生成的音频会失真甚至静音。
修正后的完整代码
import numpy as np import soundfile from moviepy.editor import VideoFileClip import pywt def extract_audio(input_video_path, output_audio_path): video_clip = VideoFileClip(input_video_path) audio_clip = video_clip.audio # 先将浮点音频数据缩放至int16范围,再转换类型 audio_data = np.array(audio_clip.to_soundarray(fps=44100) * 32767, dtype=np.int16) if len(audio_data.shape) > 1 and audio_data.shape[1] > 1: # 立体声转单声道 audio_data = np.mean(audio_data, axis=1, dtype=np.int16) soundfile.write(output_audio_path, audio_data, audio_clip.fps) def denoise_audio(input_audio_path, output_audio_path, threshold=0.2): audio_data, rate = soundfile.read(input_audio_path) # 小波去噪:修正threshold参数名 threshold_value = threshold * np.max(np.abs(audio_data)) denoised_data = pywt.threshold(audio_data, threshold=threshold_value, mode='soft') soundfile.write(output_audio_path, denoised_data, rate) # 示例调用 input_video_path = "Orson Welles Audio.mp4" output_audio_path_extracted = "Extracted_Orson_Welles_Audio.wav" output_audio_path_denoised = "Denoised_Orson_Welles_Audio.wav" extract_audio(input_video_path, output_audio_path_extracted) denoise_audio(output_audio_path_extracted, output_audio_path_denoised, threshold=0.2)
关键修改点
- 修复小波去噪参数:将
pywt.threshold中的value=threshold_value改为threshold=threshold_value,匹配函数的参数定义。 - 修复音频数据缩放:提取音频时,先将
to_soundarray返回的浮点数据乘以32767,再转换为np.int16,确保数据在int16的有效范围内,避免失真。
内容的提问来源于stack exchange,提问作者Yonis Hassan
相关产品推荐
相关产品推荐

