1. 声卡的抉择
在学习如何播放声音之前,我们需要先了解一下播放声音的硬件——声卡。
声卡是用来将声音文件播放出来的硬件,根据工作方式的不同,分为 集成声卡 和 ASIO声卡 两种。
本节太长不看:有条件的话尽量用 ASIO 声卡保证声音刺激呈现的时间精度,成本千元左右。实在不行用集成声卡也凑合。请跳到2. 播放声音继续阅读。
1.1 集成声卡
简单来说,集成声卡在我们每个人的 Windows 电脑里面都有,是和计算机的主板集成在一起的,故名集成声卡。
macOS 苹果电脑内部集成的声卡虽然是集成声卡,但是性能足以 ASIO 声卡,贵是有道理的……
根据集成声卡的型号不同,其性能表现也会有所差异,这种差异主要体现在声音的播放延迟上。
对于计算机而言,声音文件的播放流程是这样的:
1. 读取声音文件;
2. 将声音文件发给声卡播放;
3. 声卡播放出声音。
对于我们写的实验程序而言,我们所记录的声音开始播放的时间是第 2 步,将声音文件交给声卡播放的时候。而声音真的播放出来的时间则是第 3 步。第 2 步和第 3 步之间的误差就是我们所说的声音播放延迟。
这种延迟在所有电脑中普遍存在,细心的同学可能早就感受过自己电脑的音画不同步。具体的延迟数值根据电脑情况不同,在 10 ~ 500 ms 之间浮动。
众所周知,实验求稳。抖动的延迟对于数据的影响不可预知,所以集成声卡并不是实验的最佳选择。
1.2 ASIO 声卡
ASIO 是 Audio Stream Input Output 的缩写。是由 Steinberg 公司开发的专业声卡驱动模式的一种简称。
简单来说,ASIO 的目的是降低音频延迟;同时 ASIO 作为系统中独立的音频通道可以避开 DirectSound(或其他通道)的干扰,从而使得 ASIO 应用程序(如我们的实验刺激程序)可以不受系统中正在运行的其他程序干扰,达到降低声音播放和录制延迟的目的。同样一块声卡,假设使用 MME 驱动时的延迟时间为 750 毫秒,那么当换成 ASIO 驱动后延迟量就有可能会降低到 10 毫秒以下。
关于 ASIO 声卡的内容,Charlie 已经在**播放声音或录音?整块声卡!**中进行了介绍,此处不再赘述。
对于 macOS 的用户,恭喜你,电脑里面已经内置了 ASIO 声卡,无需额外购买。
2. 播放声音
2.1 准备声音文件
在 EB 中仅支持 *.wav 格式的音频,因此我们首先要将所有声音文件转换为 wav 格式。
在命名上,请一如既往的遵循 ASCII 命名,即仅使用英文字母、数字和下划线的组合对音频文件进行命名。
在数据格式上,EB 仅支持 16 bit PCM 编码,在转换音频文件格式的时候,请注意此选项。
关于 16 bit PCM 编码,大多数格式转换工具在输出 wav 格式时都默认遵循此编码格式。如果没有选择此编码格式,在下面导入 Library Manager 的过程中会报错,因此无需过于纠结编码格式。
接着,我们来将 *.wav 文件导入到 Library Manager 中。
此处 Charlie 仅添加了一个文件,如果你有多个文件要添加,可以一起选中,一起添加进来。
2.2 设置声卡驱动
在菜单栏打开 Preference
,选中 Audio
,设置 Audio Driver
。
对于 macOS 苹果电脑用户,只有 OSX 一个选项,入下图所示。
对于 Windows 用户:
- 如果您使用的是集成声卡,请将
Audio Driver
选项设置为DirectX
- 如果您使用的是 ASIO 声卡,请将
Audio Driver
选项设置为ASIO
对于使用 ASIO 声卡的 Windows 用户,您需要先安装声卡驱动,并运行 Config ASIO 来进行声卡配置。您可以在»>播放声音或录音?整块声卡!«<找到相关的内容.
2.3 设置播放声音 - 以 Visual World 范式为例
在给出一个播放声音的示例之前,我们先来看一个 Visual World 范式设计的典型案例(同 EB 的 Visual World 示例)。
- 屏幕上出现 4 幅图片,持续时间 500 ms;
- 保持屏幕显示内容不变,播放声音刺激;
- 被试操作鼠标点击正确答案。
在 EB 中,有两个播放声音的方法,一个是使用 Play Sound Action,另一个则是使用 Display Screen Action 的 Synchronize Audio
属性。
对于使用 DirectX 集成声卡来播放音频的用户,仅可以使用 Play Sound Action 来播放声音,而使用 ASIO 声卡来播放声音的用户,您可以使用下面任意一种播放方式。
2.3.1 Play Sound Action
本节内容基于 Experiment Builder 的 Visual World 示例。本章只讲述播放声音的部分。
您可以在 Action 控件库中找到 Play Sound Action 和 Play Sound Control Action。我们可以分别使用这两个控件播放音频或者控制播放的暂停和结束。
我们来看下如何在 EB 中实现 Visual World 范式。
Display Screen Action 和 Timer Trigger 两个控件在之前的教程里我们都讲过,此处略过不说,我们来看关键的 Play Sound Action。
选中 Play Sound Action,查看其属性栏。
在使用 DirectX 的情况下,Play Sound Action 仅有三个主要属性 Sound File
、Volume
和 Balance
。
- Sound File - 即需要播放的声音文件名。如上图所示,您可以将每个试次需要播放的声音文件名写入 Datasource,并将此属性引用到对应的 Datasorce 条目上,即可实现引用播放。
- Volume - 音量相对百分比,默认为 1 。最小为 0 ,最大为 1。
- Balance - 声道平衡,默认为 0 。负数偏左,正数偏右。如 0.5 代表左声道音量为 50% 且右声道音量为 100%。声音整体偏向右侧。此属性在 macOS 系统中无法使用。
至此我们就构成了 Visual World 范式的最基本呈现。
如果您是在 ASIO 驱动下使用 Play Sound Action 播放声音,还会有
Play Start Sample
和Play Start Sample
两个可以属性,您可以在本文末尾的控件属性详表中找到相应的介绍。
有些情况下,声音刺激还没有完成播放,被试就已经完成反应,试次需要提前结束。此时我们可以使用 Play Sound Control Action 对 Play Sound Action 进行控制。
向需要停止声音播放的位置插入一个 Play Sound Control Action ,随后设置其属性。
- Target Play Sound Action - 即要控制哪一个 Play Sound Action,注意正确选择。
- Operation - 要对目标 Play Sound Action 执行哪种操作,停止、暂停或是播放。
您可以将 Play Sound Action 理解为一个音乐播放器,上面有播放、停止和暂停的三个开关。如果您的程序中出现了多个 Play Sound Action ,那您就拥有了多个音乐播放器。根据您的实验设计,他们可以独立工作,也可能一起工作,您可以通过 Play Sound Control Action 去控制特定 Play Sound Action 的工作状态。
如上图所示,即通过 Play Sound Control Action 将 PLAY_SOUND 这个控件播放的声音停止了。
2.3.2 Synchronize Audio
如果您使用 ASIO 声卡,则可以使用 Display Screen Action 的 Synchronize Audio
属性设置声音的播放。只需要一个 Display Screen Action 即可完成 “视觉呈现 → 等待 500 ms → 播放声音” 的全部操作。
与之前不变的是首先您需要在 Display Screen Action 中设置视觉内容的呈现。随后回到 Recording 层,选中 对应的 Display Screen Action ,找到 Synchronize Audio
属性。勾选为 True
,您会发现在 Synchronize Audio
属性后又多出了一些属性。
- Sound File - 即需要播放的声音文件名。如上图所示,您可以将每个试次需要播放的声音文件名写入 Datasource,并将此属性引用到对应的 Datasorce 条目上,即可实现引用播放。
- Volume - 音量相对百分比,默认为 1 。最小为 0 ,最大为 1。
- Pan - 声道平衡,同 Balance ,默认为 0 。负数偏左,正数偏右。如 0.5 代表左声道音量为 50% 且右声道音量为 100%。声音整体偏向右侧。此属性在 macOS 系统中无法使用。
- Sound Offset - 声音播放延迟,单位是 ms ,默认为 0 。如 500 即在视觉刺激呈现 500 ms 后播放声音。
如果需要提前停止声音播放,一样可以使用 Play Sound Control 控件进行控制,将其 Target Play Sound Action
属性设置为对应的 Display Screen Action 即可。
以上。