从 csv 文件播放的 Psychopy 声音混合在一起(以帧为单位测量时间)

Psychopy Sounds played from a csv file blend together (time measured in frames)

在我准备的实验中,声音是从 csv 文件播放的,时间以帧为单位测量。考虑到每个声音持续 300 毫秒,这等于 18 帧。

from psychopy import data
from psychopy import core, visual, gui, data, event
from psychopy.tools.filetools import fromFile, toFile
import numpy, random, csv, time
from psychopy import logging, prefs
prefs.general['audioLib'] = ['pyo']  # Set the Audio Library [pyo (highest performer, check it), sounddevice (looks promessing, check it) or pygame (not good with timing)]
prefs.general['audioDriver']=['coreaudio']
from psychopy import sound


win = visual.Window([400,300], monitor="testMonitor", units="cm", fullscr=False)
stimuli = []
datafile = open("audioStim.csv", "rb")
reader = csv.reader(datafile, delimiter=";")
for row in reader:
    stimuli.append(row[0])
    #print (stimuli)
datafile.close()

clock = core.Clock()
for stimulus in stimuli:
    #print (stimuli)
    for frameN in range(18):
        #print clock.getTime()
        sound_stimulus = sound.Sound(stimulus)
        sound_stimulus.play()
        win.callOnFlip(clock.reset)
        win.flip()



## Closing Section
win.close()
core.quit()

当运行实验时,声音似乎相互融合。它们听起来并不离散。 结果有点问题,这是 Psychopy 的问题(声音这么短的时候音质不好?)还是代码的问题?

感谢您的宝贵时间! 非常欢迎任何其他改进代码的建议。

您的代码开始在每一帧播放声音,即每秒播放 60 次。这样做:

for stimulus in stimuli:
    #print (stimuli)
    for frameN in range(18):
        #print clock.getTime()
        win.flip()
        if frameN == 0:
            sound_stimulus = sound.Sound(stimulus)
            sound_stimulus.play()
            clock.reset()  # Time zero is stimulus onset

我在这里做了两件事。首先,我只在翻转开始时才开始 sound_stimulus.play()clock.reset() - 而不是在后续更新时。其次,我在 win.flip 之后开始播放声音,以便定时翻转。如果你在翻转前播放,声音可以在 16.7 毫秒间隔内的任何地方开始(但可能只适用于第一次试用)。

顺便说一句,因为你并没有真正使用变量 sound_stimulus,你可以进一步简化代码:

        if frameN == 0:
            sound.Sound(stimulus).play()