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
繁體地址,請注明出處:http://hk.pswp.cn/news/908653.shtml
英文地址,請注明出處:http://en.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)枚舉類型…