首页 > 解决方案 > 从 csv 文件播放的 Psychopy 声音混合在一起(以帧为单位测量时间)

问题描述

在我准备的实验中,声音是从 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 的问题(声音这么短时质量不好?)还是代码的问题?

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

标签: csvaudioframespsychopy

解决方案


您的代码开始在每一帧上播放声音,即每秒 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()and clock.reset()- 而不是在后续更新时。其次,我在 AFTER 之后启动了声音win.flip,以便它定时到翻转。如果您在翻转之前播放,声音可以在 16.7 毫秒间隔内的任何位置开始(但可能仅适用于第一次尝试)。

顺便说一句,由于您并没有真正使用 variable sound_stimulus,因此您可以进一步简化代码:

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

推荐阅读