Psychopy音频的使用

Psychopy音频的使用

本文主要解决以下问题:

  1. 指定音频引擎与设备;
  2. 播放音频文件

本文所使用的环境:

Python3.10

numpy==2.2.6
psychopy==2025.1.1
psychtoolbox==3.0.19.14

一、音频配置

Psychopy文档链接为Sound - for audio playback — PsychoPy v2025.1.1。

1. 指定音频引擎

Psychopy支持多种音频引擎,包括:

  • SoundPTB

  • SoundDevice

  • SoundPyo

  • SoundPygame

但由于种种原因,现在仅对ptb支持较好。因此建议使用ptb作为音频引擎。

配置方式如下:

from psychopy import prefs
prefs.hardware["audioLib"] = ["ptb"]  # 强制使用 ptb 后端

当然,默认的引擎就是ptb,上面的代码也可以忽略不写。

需要指出的是,对于音频的配置,最好在导入sound组件前进行

原因:因为一旦导入sound模块,并创建了sound对象,后端和设备可能就已经确定了。如果在导入sound模块之后更改prefs,可能不会影响已经创建的音频流。

特别地,sound.init()方法或许可以解决这个问题

2. 指定音频设备

2.1 获取所有音频设备

指定音频设备的前提是我们知道哪些音频设备可以使用,下面的程序实现了这个效果:

import psychtoolbox.audio
devices = psychtoolbox.audio.get_devices()
for dev in devices:print(dev)

运行结果如下图所示:

每一个都是一个字典,结构如下所示:

 {'DefaultSampleRate': 48000.0,'DeviceIndex': 5.0,'DeviceName': 'DELL S3423DWC (NVIDIA High Definition Audio)','HighInputLatency': 0.0,'HighOutputLatency': 0.01,'HostAudioAPIId': 13.0,'HostAudioAPIName': 'Windows WASAPI','LowInputLatency': 0.0,'LowOutputLatency': 0.003,'NrInputChannels': 0.0,'NrOutputChannels': 2.0},

 我这里准备使用的音频设备就是DELL S3423DWC (NVIDIA High Definition Audio),即DeviceName的值。

2.2 指定音频设备

如下所示,与指定音频引擎相类似:

prefs.hardware["audioDevice"] = 'DELL S3423DWC (NVIDIA High Definition Audio)'

注意导入prefs。

2.3 总结

推荐把上述内容写成函数:

def init_audio(device_name: str):prefs.hardware["audioLib"] = ["ptb"]devices = psychtoolbox.audio.get_devices()exists = any(dev['DeviceName'] == device_name for dev in devices)if not exists:raise ValueError(f"音频设备 {device_name} 不存在")prefs.hardware["audioDevice"] = device_name  # 设置音频设备

二、播放音频文件

1. 读取音频文件

下面代码用于读取音频文件:

import os
from psychopy import sound
wav_path = os.path.join(base_path, "sound_click_1000Hz.wav")
tone = sound.Sound(wav_path, stereo=True, hamming=False)

需要注意的是,psychopy对部分主流音频文件格式没有支持,例如mp3等都无法使用。推荐的音频文件格式是.wav

对部分属性说明如下:

  • volume:音量,浮点数取值0~1.0,默认为1.0。
  • stereo:是否使用立体声播放,True表示自动开启立体声,False表示单声道,默认值为True。
  • loops:循环播放次数,0表示只播放1次,-1表示一直循环,默认值为0。
  • hamming:用于控制是否对声音应用汉明窗,默认为True。

这里对汉明窗做特别说明:加窗是信号分析与处理中的常见操作,这里不再赘述,只简单概述结论。

汉明窗对信号有平滑的作用,对于需要精确控制声音波形的场景已预处理的声音或其他特殊情况,可以选择关闭汉明窗,否则最好默认开启。

文档中对这一部分的解释是

boolean (default True) to indicate if the sound should be apodized (i.e., the onset and offset smoothly ramped up from down to zero).

其中apodized表示变迹。

此外还有一点需要说明:

The function apodize uses a Hanning window, but arguments named ‘hamming’ are preserved so that existing code is not broken by the change from Hamming to Hanning internally. Not applied to sounds from files. 

可见使用的其实是汉宁窗,而不是汉明。 

2. 播放音频

音频的播放非常简单,如下所示:

tone.play()

3. 音频播放状态

这个Sound有两个属性,可以反应音频是否在播放中或已经播放完毕

  • isPlaying
  • isFinished

下面的代码就起到了等待音频播放完毕的效果:

# 等待音频播放完毕
while tone.isFinished == False:pass

4. 获取音频时长

有时候我们希望音频播放完毕后等待一段时间,这里提供了一种写法:

duration = tone.getDuration()
tone.play()
core.wait(1.5*duration)

播放后等待1.5个duration,也即播放后等待0.5个duration。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/908653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式互斥算法

1. 概述:什么是分布式互斥 假设有两个小孩想玩同一个玩具(临界资源),但玩具只有一个,必须保证一次只有一个人能够玩。当一个小孩在玩时,另一个小孩只能原地等待,直到玩完才能轮到自己。这就是 …

[创业之路-410]:经济学 - 国富论的核心思想和观点,以及对创业者的启发

一、国富论的核心思想和观点 《国富论》全称为《国民财富的性质和原因的研究》,由英国经济学家亚当斯密于1776年出版,是经济学领域的经典之作,其核心思想和观点对现代经济学的发展产生了深远影响,具体如下: 劳动价值…

Tavily 技术详解:为大模型提供实时搜索增强的利器

目录 🚀 Tavily 技术详解:为大模型提供实时搜索增强的利器 🧩 为什么需要 Tavily? 🔍 Tavily 是什么? 核心特性: 📦 Tavily 在 RAG 架构中的位置 🧪 示例&#xff…

欣佰特科技亮相2025张江具身智能开发者大会:呈现人形机器人全链条解决方案

5月29日 ,2025年张江具身智能开发者大会在上海落下帷幕。欣佰特科技作为专注人形机器人与具身智能领域的创新企业,携一系列前沿产品与解决方案参展,与全球行业专家、企业共同探讨技术落地路径,展现其在具身智能领域的技术积累与场…

@Prometheus 监控-MySQL (Mysqld Exporter)

文章目录 **Prometheus 监控 MySQL ****1. 目标****2. 环境准备****2.1 所需组件****2.2 权限要求** **3. 部署 mysqld_exporter****3.1 下载与安装****3.2 创建配置文件****3.3 创建 Systemd 服务****3.4 验证 Exporter** **4. 配置 Prometheus****4.1 添加 Job 到 prometheus…

MCP Resource模块详解

MCP Resource模块详解 摘要 MCP Resource模块是模型上下文协议的核心组件,通过标准化URI接口为AI模型提供安全可控的只读数据访问能力。其核心设计包括数据隔离架构和客户端驱动的访问控制,支持文本/二进制编码格式,适用于配置文件读取、数据…

Docker 容器化基础:镜像、容器与仓库的本质解析

Docker 概念与容器化技术 Docker 是一种容器化平台,能够将应用程序及其依赖项打包成一个容器,确保在任何环境中都能一致运行。容器化技术通过操作系统级别的虚拟化,为应用程序提供了一个独立的运行环境。 容器化技术的核心优势 一致性&…

解决SQL Server SQL语句性能问题(9)——SQL语句改写(2)

9.4.3. update语句改写 与Oracle类似,SQL Server中,update语句被用户相关技术人员广泛应用于现实日常工作中。但是,有些情况下,尤其是海量数据场景中,update语句也许会带来性能方面的严重问题或极大隐患。因此,为了解决和消除update语句导致的性能问题或隐患,我们将需对…

Unity VR/MR开发-VR/开发SDK选型对比分析

视频讲解链接: 【XR马斯维】Unity开发VR/MR用哪些SDK?【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…

java复习 05

我的天啊一天又要过去了,没事的还有时间!!! 不要焦虑不要焦虑,事实证明只要我认真地投入进去一切都还是来得及的,代码多实操多复盘,别叽叽喳喳胡思乱想多多思考,有迷茫前害怕后的功…

《Go小技巧易错点100例》第三十五篇

本期分享: 1.循环依赖导致栈溢出 2.无法捕获子协程的panic 循环依赖导致栈溢出 在Go语言开发中,我们经常会遇到结构体之间需要相互引用的情况。当两个结构体直接或间接地相互包含对方作为自己的字段时,就会形成循环依赖。 但是在Go语言中…

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…

.NET 9中的异常处理性能提升分析:为什么过去慢,未来快

一、为什么要关注.NET异常处理的性能 随着现代云原生、高并发、分布式场景的大量普及,异常处理(Exception Handling)早已不再只是一个冷僻的代码路径。在高复杂度的微服务、网络服务、异步编程环境下,服务依赖的外部资源往往不可…

第二十九章 数组

第二十九章 数组 数组。所有编程语言中都少不了数组,Shell语言也不例外,只不过支持程度非常有限。即便如此,在解决某些编程问题时,数组也能发挥大作用。 什么是数组 数组是一种可以一次存放多个值的变量,其组织形式类似与表格。数组中的每个变量叫做元素,每个元素都含…

ffmpeg(五):裁剪与合并命令

裁剪(剪切) 精准裁剪(有转码,支持任意起止时间) # 从第 10 秒到第 30 秒,重新编码 ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:30 -c:v libx264 -c:a aac output.mp4快速裁剪(无转码&#x…

20、typedef和typename

在C中,typedef和typename有不同的用途和语法。以下是它们的主要区别: typedef typedef用于为现有类型定义一个新的名字。它通常用于简化复杂类型声明,使代码更易读。 示例: typedef unsigned long ulong; typedef int (*func_…

僵尸进程是什么?怎么回收?孤儿进程?

僵尸进程是什么? 僵尸进程的定义:对于多进程程序,当子进程结束运行但父进程还未读取其退出状态时,子进程就处于僵尸态。此时,内核不会立即释放该子进程的进程表表项,以满足父进程后续查询子进程退出信息的…

[AI绘画]sd学习记录(二)文生图参数进阶

目录 7.高分辨率修复:以小博大8.细化器(Refiner):两模型接力9.随机数种子(Seed):复现图片吧 本文接续https://blog.csdn.net/qq_23220445/article/details/148460878?spm1001.2014.3001.5501…

C++学习思路

C++知识体系详细大纲 一、基础语法 (一)数据类型 基本数据类型 整数类型(int, short, long, long long)浮点类型(float, double, long double)字符类型(char, wchar_t, char16_t, char32_t)布尔类型(bool)复合数据类型 数组结构体(struct)联合体(union)枚举类型…