【问题标题】:What is the best way to schedule multiple audio events with audiomath?使用 audiomath 安排多个音频事件的最佳方法是什么?
【发布时间】:2025-11-21 14:00:01
【问题描述】:

我想安排在任意时间播放多个音频片段。从 audiomath 文档中,我认为我应该使用 PyschPortAudio 来获得最可预测的延迟。同样从文档中,我了解到我可以schedule 播放单个声音。我很好奇是否可以在准确的时间提前安排多个短段(模延迟)?另外:理想情况下,此时间表可以在播放期间更改。

【问题讨论】:

    标签: audiomath


    【解决方案1】:

    是的,多个独立 PsychPortAudio 播放器的协调预调度是可能的。作为一个最小的例子,以下似乎适用于我在 Mac 上:

    import audiomath as am
    am.BackEnd.Load('PsychToolboxInterface')
    
    p1 = am.Player(am.TestSound('12'))
    p2 = am.Player(am.TestSound('34'))
    
    t0 = am.Seconds()
    
    p1.Play(when=t0 + 2.0)
    p2.Play(when=t0 + 2.2)   # overlaps p1, but offset by 200ms
    

    这将不允许p1p2 被无缝地完全地计时——每个预定的开始时间仍然会被大约几百微秒的东西抖动。这在刺激呈现时非常好,但可能(取决于声音内容)仍然足以在声音之间创建可听的过渡伪影。这取决于你想要达到什么样的效果——最好的办法是尝试一下,看看它是否满足你的需求。根据您希望事物的声音和行为方式,可能有比 PsychPortAudio 预调度更好的策略(例如:加载 PsychPortAudio 后端,而是在循环中播放声音然后打开 -在Player 到达它们之前即时更改Sound 数据的部分。)

    【讨论】:

    • 多个播放器对象有效。我还没有完全探讨在解雇一堆未来计划的玩家时垃圾收集的后果。
    • @MJT 如果您遵循audiomath.readthedocs.io/en/release/auto/… 上关于预初始化和重新使用Stream() 实例的建议,则可以使垃圾收集问题变得更加顺畅。