PyCharm中Psychopy调用sound.Sound.play()报错:'NoneType'无start属性
解决Psychopy PTB后端播放WAV音频时的AttributeError问题
问题根源
直接将numpy数组转为bytes传入sound.Sound,PTB后端无法正确解析该格式,导致内部的self.track对象初始化失败为None,调用play()时触发'NoneType' object has no attribute 'start'错误。
修复方案
方案1:直接通过文件路径初始化Sound(推荐)
Psychopy的Sound类支持直接传入音频文件路径,PTB后端会自动完成加载、解码和格式适配,无需手动处理音频数据:
from psychopy import prefs prefs.hardware['audioLib'] = ['PTB'] from psychopy import sound AMP = 0.1 audio_path = r'*PATH*/IRN_61.7354Hz.wav' # 直接传入文件路径,通过volume参数设置音量 acoustic_stim = sound.Sound(audio_path, volume=AMP) acoustic_stim.play(when=1)
方案2:正确传递手动处理后的音频数据
若必须手动读取并处理音频数据,需确保数据格式符合PTB后端要求,再传入Sound:
import numpy as np from scipy.io.wavfile import read from psychopy import prefs prefs.hardware['audioLib'] = ['PTB'] from psychopy import sound AMP = 0.1 audio_path = r'*PATH*/IRN_61.7354Hz.wav' sr, data = read(audio_path) # 将音频数据归一化到[-1,1]区间,转为PTB兼容的float32类型 data_norm = (data / np.max(np.abs(data)) * AMP).astype(np.float32) # 传入处理后的数组、采样率,自动识别声道数 acoustic_stim = sound.Sound(value=data_norm, sampleRate=sr, stereo=(data.ndim == 2)) acoustic_stim.play(when=1)
额外注意事项
- 确保PTB后端依赖完整:首次使用PTB时,Psychopy会提示安装PortAudio等依赖,需按提示完成安装。
- 不要将音频数据转为
bytes类型传入Sound,PTB后端仅接受numpy数组或文件路径。 - 若需同步fMRI触发信号,可将
when参数设置为实验时钟的精确时间点,保证时序准确性。
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

