Python脚本不起作用?:播放声音,测量反应时间

时间:2016-12-06 01:34:58

标签: python loops audio measure psychopy

我想创建一个脚本,用于测量参与者按下输入或空格键的速度,只有当他们听到声音文件中的2/30声音时。 因此,有时用户不必按任何东西,脚本仍然会移动到下一个声音文件。我该怎么做呢?我现在拥有的是:(而不是声音文件,我有文字atm。):

# Grounding of Words Experiment #

#Import libraries
import re
import glob
from psychopy import sound, visual, event, data, core, gui # imports a module for visual presentation and one for controlling events like key presses


# ID, age, gender box display
myDlg = gui.Dlg(title="Experiment") #, pos=(400,400)
myDlg.addField('ID:')
myDlg.addField('Age:')
myDlg.addField('Gender:', choices = ['Female', 'Male'])
myDlg.show()#you have to call show() for a Dlg
if myDlg.OK:
    ID = myDlg.data[0]
    Age = myDlg.data[1]
    Gender = myDlg.data[2]
else:
    core.quit()

trial=0

#Creates the outfile, that will be the file containing our data, the name of the file, as saved on the computer is the filename
out_file="Grounding_experiment_results.csv"
#Creates the header for the data
header="trial,ID,Gender,Age,Word,rt,SpaceKlik\n"
#opens the outfile in writemode
with open(out_file,"w") as f:
    f.write(header)#writes the header in the outfile


# define window
win = visual.Window(fullscr=True) # defines a window using default values (= gray screen, fullscr=False, etc)

# Instruction box display

def instruct(txt):
    instructions = visual.TextStim(win, text=txt, height = 0.05) # create an instruction text
    instructions.draw() # draw the text stimulus in a "hidden screen" so that it is ready to be presented 
    win.flip() # flip the screen to reveal the stimulus
    event.waitKeys() # wait for any key press

instruct('''
Welcome to the experiment!

You will be hearing different words.
Whenever you hear the word "Klik" and "Kast" please press the left mouse button.
Whenever you hear any other word - do nothing.
Try to be as fast and accurate as possible.
Please put on the headphones. 
The experiment will take 5 minutes. 

Press any key to start the experiment''')

# Play sound

# Function that makes up a trial

trial(word):
    global trial
    trial += 1
    if word in ["Klik", "Press", "Throw"]:
        condition = "press"
    else :
        condition = "no_press"
    event.clearEvents()
    for frame in range(90):
        text = visual.TextStim(win, text=word, height = 0.05)
        text.draw() # draw the text stimulus in a "hidden screen" so that it is ready to be presented 
        time_start=win.flip()
    try:
        key, time_key=event.getKeys(keyList=['space', 'escape'], timeStamped = True)[0] # wait for any key press
    except IndexError:
        key = "0"
        rt = "NA"
    else:
        if key=='escape': 
                core.quit()
        rt = time_key - time_start
    if key == "space" and condition=="press":
        accuracy = 1
    elif key == "0" and condition=="no_press":
        accuracy = 1
    else:
        accuracy = 0
    with open(out_file,"a") as f:
        f.write("{},{},{},{},{},{},{},{}\n".format(trial,ID,Gender,Age,word,accuracy,rt,SpaceKlik))

# s = sound.Sound('sound.wav') 
# s.play()

# Register space bar press or mouse click

# Measure reaction time

# Check to see if answer is correct to sound - certain sound files are "klik". Others "kast", "løb", "sko" and so on

# Write csv logfile with coloumns: "ID", "Gender", "Word", "Correct/incorrect", "Reaction time", "Space/click"

我最终都会参加PsychoPy。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您的缩进存在问题,因此并非所有内容都在适当级别的试用功能中运行。您可以放弃异常处理以更直接地检查是否已做出响应。然后使用else:循环到for循环来处理如果循环完成但没有按下键的情况会发生什么。这避免了必须处理在任何给定帧上发生的不响应的逻辑(如果响应将在不久之后发生,则可能没有任何意义)。

像这样的一般伪代码:

# define window
win = visual.Window(fullscr=True)

# function to draw instructions (probably overkill unless run more than once)
def instruct(instructions = 'xxx'):
    # as you have above

# function to run each trial
def trial(number = -999, sound_name = 'A'):

    sound = Sound.sound(sound_name)

    if sound_name in ["Klik.wav", "Press.wav", "Throw.wav"]:
        condition = "press"
    else:
        condition = "no_press"

    event.clearEvents()

    sound.play()

    for frame in range(90):

        time_start = win.flip()

        keys = event.getKeys(keyList=['space', 'escape'], timeStamped = True)
        if keys: # if a non-empty list returned:
            key, time_key = keys[0]
            rt = time_key - time_start

            sound.stop() # ready to start next trial immediately

            if key == 'escape': 
                core.quit()

            if condition == "press":
                return {'accuracy':1, 'rt':rt}
            else:
                return {'accuracy':0, 'rt':rt}

    else: # the loop ended without a key press
        if condition == "press":
            return {'accuracy':0, 'rt':'NA'}
        else:
            return {'accuracy':1, 'rt':'NA'}

####
# run the experiment:
####

####
# show the instructions:
####
instruct('some instructions')

####
# run the trials:
####
for trial_num in range(10):

    # run each trial and get the results.
    # I'm not sure where you're getting your sound values
    # but they could be indexed from a list using the trial number:
    result = trial(number=trial_num, sound_name=sound_names[trial_num])

    # then save the values from the returned dictionary to a file

答案 1 :(得分:0)

好的,很好 - 谢谢!现在我继续尝试开发你的脚本。我添加了试用清单,现在我不太清楚该怎么做。我的脚本看起来像这样:

# Grounding of Words Experiment #

# -*- coding: utf-8 -*-

#Import libraries
import re
import glob
from psychopy import sound, visual, event, data, core, gui # imports a module for visual presentation and one for controlling events like key presses
import ppc

# ID, age, gender box display
myDlg = gui.Dlg(title="Experiment") #, pos=(400,400)
myDlg.addField('ID:')
myDlg.addField('Age:')
myDlg.addField('Gender:', choices = ['Female', 'Male'])
myDlg.show()#you have to call show() for a Dlg
if myDlg.OK:
    ID = myDlg.data[0]
    Age = myDlg.data[1]
    Gender = myDlg.data[2]
else:
    core.quit()

# define window
win = visual.Window(fullscr=True)


# function to draw instructions (probably overkill unless run more than once)
def instruct(txt):
    instructions = visual.TextStim(win, text=txt, height = 0.05) # create an instruction text
    instructions.draw() # draw the text stimulus in a "hidden screen" so that it is ready to be presented 
    win.flip() # flip the screen to reveal the stimulus
    event.waitKeys() # wait for any key press
    # as you have above


# function to run each trial
def trial(number = -999, sound_name = 'A'):

    sound = Sound.sound()

    if sound_name in ["dog-howling.wav"]:
        condition = "press"
    else:
        condition = "no_press"

    event.clearEvents()

    sound.play(sound_name)

    for frame in range(90):

        time_start = win.flip()

        keys = event.getKeys(keyList=['space', 'escape'], timeStamped = True)
        if keys: # if a non-empty list returned:
            key, time_key = keys[0]
            rt = time_key - time_start

            sound.stop() # ready to start next trial immediately

            if key == 'escape': 
                core.quit()

            if condition == "press":
                return {'accuracy':1, 'rt':rt}
            else:
                return {'accuracy':0, 'rt':rt}

    else: # the loop ended without a key press
        if condition == "press":
            return {'accuracy':0, 'rt':'NA'}
        else:
            return {'accuracy':1, 'rt':'NA'}
####
# define triallist

trial_list = []
conditions = ["klik", "notklik"]
sounds = ["dog-howling.wav", "sound2.wav", "sound3.wav"]
for condition in conditions:
    for sound in sounds:
        # Add a dictionary for every trial
            trial_list += [{
                'ID': ID,
                'age': AGE,
                'gender': GENDER,
                'condition': condition,
                'sounds': sound,
                'rating': '',
                'rt': ''
                    }]

# Randomize order
trial_list = sample(trial_list, len(trial_list))

# Add trial numbers
for i, trial in enumerate(trial_list):
    trial['no'] = i + 1 # start at 1

# write file

####
# run the experiment:
####

####
# show the instructions:
####
instruct('''Welcome to the experiment!

You will be hearing different words.
Whenever you hear the word "Klik" and "Kast" please press the left mouse button.
Whenever you hear any other word - do nothing.
Try to be as fast and accurate as possible.
Please put on the headphones. 
The experiment will take 5 minutes. 

Press any key to start the experiment''')

####
# run the trials:
####
for trial_num in range(10):

    # run each trial and get the results.
    # I'm not sure where you're getting your sound values
    # but they could be indexed from a list using the trial number:
    result = trial(number=trial_num, sound_name=sound_names[trial_num])

    # then save the values from the returned dictionary to a file+

#Creates the outfile, that will be the file containing our data, the name of the file, as saved on the computer is the filename
#out_file="Grounding_experiment_results.csv"
#Creates the header for the data
#header="trial,ID,Gender,Age,Word,rt,SpaceKlik\n"
#opens the outfile in writemode
#with open(out_file,"w") as f:
#    f.write(header)#writes the header in the outfile