Lapisan Streaming Lab (LSL) untuk menyinkronkan beberapa aliran data
Roshini Randeniya
1 Okt 2025
Bagikan:


oleh Roshini Randeniya dan Lucas Kleine
Operasi:
Setelah dijalankan di command line, skrip ini langsung memulai aliran LSL. Setiap kali tombol 'Enter' ditekan, ia mengirimkan pemicu dan memutar file audio."""
import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet
def wait_for_keypress():
print("Tekan ENTER untuk memulai pemutaran audio dan mengirim marker LSL.")
while True: # This loop waits for a keyboard input input_str = input() # Wait for input from the terminal if input_str == "": # If the enter key is pressed, proceed break
def AudioMarker(audio_file, outlet): # fungsi untuk memutar audio dan mengirim marker
data, fs = sf.read(audio_file) # Memuat file audio
print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) # Send marker indicating the start of audio playback sd.play(data, fs) # play the audio sd.wait() # Wait until audio is done playing print("Audio playback finished.")
if name == "main": # LOOP UTAMA
# Siapkan aliran LSL untuk marker
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Diatur ke 0 laju sampling karena marker tidak teratur
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'
info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id) outlet = StreamOutlet(info) # create LSL outlet # Keep the script running and wait for ENTER key to play audio and send marker while True: wait_for_keypress() audio_filepath = "/path/to/your/audio_file.wav" # replace with correct path to your audio file AudioMarker(audio_filepath, outlet) # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>
Skrip contoh ini menunjukkan beberapa fungsi dasar untuk mengimpor dan memberi anotasi data EEG yang dikumpulkan dari perangkat lunak EmotivPRO. Ini menggunakan MNE untuk memuat file XDF, mencetak beberapa metadata dasar, membuat objek info, dan memplot spektrum daya."""
import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np
Path ke file XDF Anda
data_path = '/path/to/your/xdf_file.xdf'
Memuat file XDF
streams, fileheader = pyxdf.load_xdf(data_path)
print("Header File XDF:", fileheader)
print("Jumlah aliran yang ditemukan:", len(streams))
for i, stream in enumerate(streams):
print("\nAliran", i + 1)
print("Nama Aliran:", stream['info']['name'][0])
print("Tipe Aliran:", stream['info']['type'][0])
print("Jumlah Saluran:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Laju Sampling:", sfreq)
print("Jumlah Sampel:", len(stream['time_series']))
print("Cetak 5 titik data pertama:", stream['time_series'][:5])
channel_names = [chan['label'][0] for chan in stream['info']['desc'][0]['channels'][0]['channel']] print("Channel Names:", channel_names) channel_types = 'eeg'
Buat objek info MNE
info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Data perlu ditransposisikan: saluran x sampel
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # memplot spektrogram sederhana (kepadatan spektral daya)Sumber daya tambahanUnduh tutorial ini sebagai notebook Jupyter dari EMOTIV GitHubLihat dokumentasi online LSL, termasuk file README resmi di GitHubAnda memerlukan satu atau lebih perangkat akuisisi data yang didukung untuk mengumpulkan dataSemua perangkat brainware EMOTIV terhubung ke perangkat lunak EmotivPRO, yang memiliki kemampuan bawaan LSL untuk mengirim dan menerima aliran dataSumber daya tambahan:Kode untuk menjalankan LSL menggunakan perangkat Emotiv, dengan skrip contohDemo LSL berguna di YouTubeRepositori GitHub SCCN LSL untuk semua pustaka terkaitRepositori GitHub untuk koleksi submodul dan aplikasiRangkaian analisis HyPyP untuk studi Hyperscanning
oleh Roshini Randeniya dan Lucas Kleine
Operasi:
Setelah dijalankan di command line, skrip ini langsung memulai aliran LSL. Setiap kali tombol 'Enter' ditekan, ia mengirimkan pemicu dan memutar file audio."""
import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet
def wait_for_keypress():
print("Tekan ENTER untuk memulai pemutaran audio dan mengirim marker LSL.")
while True: # This loop waits for a keyboard input input_str = input() # Wait for input from the terminal if input_str == "": # If the enter key is pressed, proceed break
def AudioMarker(audio_file, outlet): # fungsi untuk memutar audio dan mengirim marker
data, fs = sf.read(audio_file) # Memuat file audio
print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) # Send marker indicating the start of audio playback sd.play(data, fs) # play the audio sd.wait() # Wait until audio is done playing print("Audio playback finished.")
if name == "main": # LOOP UTAMA
# Siapkan aliran LSL untuk marker
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Diatur ke 0 laju sampling karena marker tidak teratur
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'
info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id) outlet = StreamOutlet(info) # create LSL outlet # Keep the script running and wait for ENTER key to play audio and send marker while True: wait_for_keypress() audio_filepath = "/path/to/your/audio_file.wav" # replace with correct path to your audio file AudioMarker(audio_filepath, outlet) # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>
Skrip contoh ini menunjukkan beberapa fungsi dasar untuk mengimpor dan memberi anotasi data EEG yang dikumpulkan dari perangkat lunak EmotivPRO. Ini menggunakan MNE untuk memuat file XDF, mencetak beberapa metadata dasar, membuat objek info, dan memplot spektrum daya."""
import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np
Path ke file XDF Anda
data_path = '/path/to/your/xdf_file.xdf'
Memuat file XDF
streams, fileheader = pyxdf.load_xdf(data_path)
print("Header File XDF:", fileheader)
print("Jumlah aliran yang ditemukan:", len(streams))
for i, stream in enumerate(streams):
print("\nAliran", i + 1)
print("Nama Aliran:", stream['info']['name'][0])
print("Tipe Aliran:", stream['info']['type'][0])
print("Jumlah Saluran:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Laju Sampling:", sfreq)
print("Jumlah Sampel:", len(stream['time_series']))
print("Cetak 5 titik data pertama:", stream['time_series'][:5])
channel_names = [chan['label'][0] for chan in stream['info']['desc'][0]['channels'][0]['channel']] print("Channel Names:", channel_names) channel_types = 'eeg'
Buat objek info MNE
info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Data perlu ditransposisikan: saluran x sampel
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # memplot spektrogram sederhana (kepadatan spektral daya)Sumber daya tambahanUnduh tutorial ini sebagai notebook Jupyter dari EMOTIV GitHubLihat dokumentasi online LSL, termasuk file README resmi di GitHubAnda memerlukan satu atau lebih perangkat akuisisi data yang didukung untuk mengumpulkan dataSemua perangkat brainware EMOTIV terhubung ke perangkat lunak EmotivPRO, yang memiliki kemampuan bawaan LSL untuk mengirim dan menerima aliran dataSumber daya tambahan:Kode untuk menjalankan LSL menggunakan perangkat Emotiv, dengan skrip contohDemo LSL berguna di YouTubeRepositori GitHub SCCN LSL untuk semua pustaka terkaitRepositori GitHub untuk koleksi submodul dan aplikasiRangkaian analisis HyPyP untuk studi Hyperscanning
oleh Roshini Randeniya dan Lucas Kleine
Operasi:
Setelah dijalankan di command line, skrip ini langsung memulai aliran LSL. Setiap kali tombol 'Enter' ditekan, ia mengirimkan pemicu dan memutar file audio."""
import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet
def wait_for_keypress():
print("Tekan ENTER untuk memulai pemutaran audio dan mengirim marker LSL.")
while True: # This loop waits for a keyboard input input_str = input() # Wait for input from the terminal if input_str == "": # If the enter key is pressed, proceed break
def AudioMarker(audio_file, outlet): # fungsi untuk memutar audio dan mengirim marker
data, fs = sf.read(audio_file) # Memuat file audio
print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) # Send marker indicating the start of audio playback sd.play(data, fs) # play the audio sd.wait() # Wait until audio is done playing print("Audio playback finished.")
if name == "main": # LOOP UTAMA
# Siapkan aliran LSL untuk marker
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Diatur ke 0 laju sampling karena marker tidak teratur
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'
info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id) outlet = StreamOutlet(info) # create LSL outlet # Keep the script running and wait for ENTER key to play audio and send marker while True: wait_for_keypress() audio_filepath = "/path/to/your/audio_file.wav" # replace with correct path to your audio file AudioMarker(audio_filepath, outlet) # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>
Skrip contoh ini menunjukkan beberapa fungsi dasar untuk mengimpor dan memberi anotasi data EEG yang dikumpulkan dari perangkat lunak EmotivPRO. Ini menggunakan MNE untuk memuat file XDF, mencetak beberapa metadata dasar, membuat objek info, dan memplot spektrum daya."""
import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np
Path ke file XDF Anda
data_path = '/path/to/your/xdf_file.xdf'
Memuat file XDF
streams, fileheader = pyxdf.load_xdf(data_path)
print("Header File XDF:", fileheader)
print("Jumlah aliran yang ditemukan:", len(streams))
for i, stream in enumerate(streams):
print("\nAliran", i + 1)
print("Nama Aliran:", stream['info']['name'][0])
print("Tipe Aliran:", stream['info']['type'][0])
print("Jumlah Saluran:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Laju Sampling:", sfreq)
print("Jumlah Sampel:", len(stream['time_series']))
print("Cetak 5 titik data pertama:", stream['time_series'][:5])
channel_names = [chan['label'][0] for chan in stream['info']['desc'][0]['channels'][0]['channel']] print("Channel Names:", channel_names) channel_types = 'eeg'
Buat objek info MNE
info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Data perlu ditransposisikan: saluran x sampel
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # memplot spektrogram sederhana (kepadatan spektral daya)Sumber daya tambahanUnduh tutorial ini sebagai notebook Jupyter dari EMOTIV GitHubLihat dokumentasi online LSL, termasuk file README resmi di GitHubAnda memerlukan satu atau lebih perangkat akuisisi data yang didukung untuk mengumpulkan dataSemua perangkat brainware EMOTIV terhubung ke perangkat lunak EmotivPRO, yang memiliki kemampuan bawaan LSL untuk mengirim dan menerima aliran dataSumber daya tambahan:Kode untuk menjalankan LSL menggunakan perangkat Emotiv, dengan skrip contohDemo LSL berguna di YouTubeRepositori GitHub SCCN LSL untuk semua pustaka terkaitRepositori GitHub untuk koleksi submodul dan aplikasiRangkaian analisis HyPyP untuk studi Hyperscanning
Solusi
Dukungan
Perusahaan

© 2025 EMOTIV, Semua hak dilindungi.

Pilihan Privasi Anda (Pengaturan Cookie)
*Pemberitahuan – Produk EMOTIV dimaksudkan untuk digunakan untuk aplikasi penelitian dan penggunaan pribadi saja. Produk kami tidak dijual sebagai Alat Medis sebagaimana didefinisikan dalam arahan UE 93/42/EEC. Produk kami tidak dirancang atau dimaksudkan untuk digunakan dalam diagnosis atau pengobatan penyakit.
Catatan tentang Terjemahan: Versi non-Inggris dari situs web ini telah diterjemahkan untuk kenyamanan Anda menggunakan kecerdasan buatan. Meskipun kami berusaha agar akurat, terjemahan otomatis dapat mengandung kesalahan atau nuansa yang berbeda dari teks aslinya. Untuk informasi yang paling akurat, silakan rujuk ke versi bahasa Inggris dari situs ini.
Solusi
Dukungan
Perusahaan

© 2025 EMOTIV, Semua hak dilindungi.

Pilihan Privasi Anda (Pengaturan Cookie)
*Pemberitahuan – Produk EMOTIV dimaksudkan untuk digunakan untuk aplikasi penelitian dan penggunaan pribadi saja. Produk kami tidak dijual sebagai Alat Medis sebagaimana didefinisikan dalam arahan UE 93/42/EEC. Produk kami tidak dirancang atau dimaksudkan untuk digunakan dalam diagnosis atau pengobatan penyakit.
Catatan tentang Terjemahan: Versi non-Inggris dari situs web ini telah diterjemahkan untuk kenyamanan Anda menggunakan kecerdasan buatan. Meskipun kami berusaha agar akurat, terjemahan otomatis dapat mengandung kesalahan atau nuansa yang berbeda dari teks aslinya. Untuk informasi yang paling akurat, silakan rujuk ke versi bahasa Inggris dari situs ini.
Solusi
Dukungan
Perusahaan

© 2025 EMOTIV, Semua hak dilindungi.

Pilihan Privasi Anda (Pengaturan Cookie)
*Pemberitahuan – Produk EMOTIV dimaksudkan untuk digunakan untuk aplikasi penelitian dan penggunaan pribadi saja. Produk kami tidak dijual sebagai Alat Medis sebagaimana didefinisikan dalam arahan UE 93/42/EEC. Produk kami tidak dirancang atau dimaksudkan untuk digunakan dalam diagnosis atau pengobatan penyakit.
Catatan tentang Terjemahan: Versi non-Inggris dari situs web ini telah diterjemahkan untuk kenyamanan Anda menggunakan kecerdasan buatan. Meskipun kami berusaha agar akurat, terjemahan otomatis dapat mengandung kesalahan atau nuansa yang berbeda dari teks aslinya. Untuk informasi yang paling akurat, silakan rujuk ke versi bahasa Inggris dari situs ini.
