একাধিক ডেটা স্ট্রিম সিনক্রোনাইজ করার জন্য ল্যাব স্ট্রিমিং লেয়ার (LSL)

ডঃ রোশিনী রান্দেনিয়া এবং লুকাস ক্লাইন

সর্বশেষ আপডেট

১৭ মে, ২০২৪

একাধিক ডেটা স্ট্রিম সিনক্রোনাইজ করার জন্য ল্যাব স্ট্রিমিং লেয়ার (LSL)

ডঃ রোশিনী রান্দেনিয়া এবং লুকাস ক্লাইন

সর্বশেষ আপডেট

১৭ মে, ২০২৪

একাধিক ডেটা স্ট্রিম সিনক্রোনাইজ করার জন্য ল্যাব স্ট্রিমিং লেয়ার (LSL)

ডঃ রোশিনী রান্দেনিয়া এবং লুকাস ক্লাইন

সর্বশেষ আপডেট

১৭ মে, ২০২৪

স্বাগতম! এই টিউটোরিয়ালে আমরা শিখব কীভাবে Python-এ Lab Streaming Layer (LSL) ব্যবহার করে একাধিক ডিভাইস থেকে Emotiv EEG ডেটা সংগ্রহ এবং সিঙ্ক্রোনাইজ করা যায়। এর জন্য Python প্রোগ্রামিং ভাষার প্রাথমিক কার্যকারী জ্ঞান থাকা প্রয়োজন।

আপনি যা শিখবেন

  1. Lab Streaming Layer (LSL) কী এবং গবেষকরা কেন এটি ব্যবহার করেন

  2. কীভাবে একাধিক Emotiv EEG ডিভাইস থেকে সিঙ্ক্রোনাইজড ডেটা সংগ্রহ করবেন

  3. কীভাবে সংগৃহীত ডেটা ইম্পোর্ট এবং পরীক্ষা করবেন

1.1 LSL কী এবং এটি কীসের জন্য ভালো?

Lab streaming layer (LSL) হলো একটি ওপেন-সোর্স টুলবক্স যা বিভিন্ন সেন্সর হার্ডওয়্যার থেকে নিউরাল, ফিজিওলজিক্যাল এবং আচরণগত ডেটা স্ট্রিম পাঠাতে, গ্রহণ করতে এবং সিঙ্ক্রোনাইজ করতে ব্যবহার করা যেতে পারে। ক্রমেই আরও বেশি কার্যকরী, সুনির্দিষ্ট এবং বহনযোগ্য ব্রেন ও বডি-সেন্সিং হার্ডওয়্যার ডিভাইসগুলি (যেমন Emotiv EEG সিস্টেম) নিউরোসায়েন্সকে ল্যাবের বাইরে রিয়েল-টাইম ডেটার জগতে নিয়ে আসছে। যেখানে EEG এবং MEG-এর মতো মস্তিষ্কের পরিমাপ একসময় গবেষণাগারের মধ্যেই সীমাবদ্ধ ছিল, সেখানে মোবাইল ডিভাইসগুলি আমাদের আরও স্বাভাবিক পরিবেশে এবং একসাথে একাধিক ব্যক্তির কাছ থেকে বিপুল পরিমাণ ডেটা সংগ্রহ করতে সাহায্য করে।

একজন গবেষক একই গান শুনছেন এমন দুই ব্যক্তির মধ্যে শারীরবৃত্তীয় সামঞ্জস্য বা সিঙ্ক্রোনি নিয়ে আগ্রহী হতে পারেন। LSL আমাদের দুটি পৃথক EEG হেডসেট থেকে ডেটা সংগ্রহ করতে সাহায্য করতে পারে যা শব্দের প্লেব্যাকের সাথে সিঙ্ক্রোনাইজড থাকবে।

LSL-এর অন্যান্য ব্যবহারের কিছু উদাহরণ:

  1. একটি পরীক্ষা থেকে কোনো চলমান EEG ডেটাতে ইভেন্ট মার্কার যুক্ত করা

  2. একজন একক অংশগ্রহণকারীর জন্য একাধিক উৎস থেকে প্রাপ্ত ডেটা সময়ানুযায়ী মেলানো (যেমন হৃদস্পন্দনের হার, EMG, EEG)

  3. একাধিক অংশগ্রহণকারীর থেকে প্রাপ্ত ডেটা সময়ানুযায়ী মেলানো (যেমন EEG Hyperscanning স্টাডিজ)

1.2 LSL কীভাবে কাজ করে?

Lab Streaming Layer হলো একাধিক ডিভাইসের মধ্যে রিয়েল-টাইম টাইম-সিরিজ ডেটা আদান-প্রদানের একটি প্রোটোকল। Python, MATLAB, C++, Java এবং অন্যান্য প্রোগ্রামিং ভাষার ওপেন-সোর্স লাইব্রেরি ব্যবহার করে LSL প্রয়োগ করা যেতে পারে।

এর মূল কার্যকারিতা LSL ডেটা স্ট্রিম-কে কেন্দ্র করে আবর্তিত হয়:

১. একটি অ্যাকুইজিশন ডিভাইস/সফটওয়্যার ডেটা সংগ্রহ করে এবং একটি ডেটা স্ট্রিম তৈরি করে - EEG রেকর্ডিং ডিভাইস, আই-ট্যাকার, মোশন ক্যাপচার সিস্টেম, হার্ট রেট মনিটর ইত্যাদি থেকে মেটাডেটাসহ (স্যাম্পলিং রেট, ডেটা টাইপ, চ্যানেল ইনফরমেশন ইত্যাদি) ফিজিওলজিক্যাল ডেটা LSL-এ স্ট্রিম করা যেতে পারে - পরীক্ষা থেকে পাওয়া ইভেন্ট মার্কারগুলিও (যেমন PsychoPy ব্যবহার করে) LSL ব্যবহার করে ডেটা স্ট্রিম হিসেবে পাঠানো যেতে পারে

২. ডেটা স্ট্রিমটি নেটওয়ার্কে প্রকাশ (publish) করা হয় - এভাবেই LSL ব্যবহার করে ডেটা পাঠানো হয়; ডেটা স্ট্রিমটি নেটওয়ার্কে “ব্রডকাস্ট” হয় - প্রকাশিত স্ট্রিমগুলি নেটওয়ার্কে উপলব্ধ থাকে এবং একই নেটওয়ার্কে থাকা অন্যান্য LSL-সমর্থিত ডিভাইসগুলির দ্বারা সনাক্ত করা যায় - LSL একটি সাধারণ ঘড়ির উপর ভিত্তি করে (নেটওয়ার্ক টাইম প্রোটোকল অনুসরণ করে) প্রতিটি ডেটা চাঙ্ক বা স্যাম্পলকে একটি টাইমস্ট্যাম্প অ্যাসাইন করে। - স্ট্রিমটি একটি “আউটলেট”-এর মাধ্যমে স্যাম্পল-বাই-স্যাম্পল (অথবা চাঙ্ক-বাই-চাঙ্ক) পুশ করা হয়

৩. সংগ্রহকারী ডিভাইস(গুলি) ডেটা স্ট্রিম(গুলিতে) “সাবস্ক্রাইব” করে - এভাবেই LSL ব্যবহার করে ডেটা গ্রহণ করা হয় - একই নেটওয়ার্কে থাকা সংগ্রহকারী ডিভাইসগুলি “ইনলেট”-এর মাধ্যমে প্রকাশিত ডেটা স্ট্রিমগুলি গ্রহণ করে। - প্রতিটি ইনলেট কেবল একটি আউটলেট থেকেই স্ট্রিমের স্যাম্পল এবং মেটাডেটা গ্রহণ করে

৪. ডেটা সংরক্ষণ করুন - একটি ডেটা স্ট্রিমে সাবস্ক্রাইব করার পর, আপনি এটি আপনার পছন্দের প্রোগ্রামিং ভাষার একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন, অথবা এটি .xdf-এর মতো একটি স্ট্যান্ডার্ড ফরম্যাটে সংরক্ষণ করতে LSL-এর দেওয়া সফটওয়্যার LabRecorder ব্যবহার করতে পারেন।

২.০ টিউটোরিয়াল ওভারভিউ

এই টিউটোরিয়ালে, আমরা একটি নমুনা পরীক্ষামূলক সেটআপ নেব এবং Python-এ LSL ব্যবহার করে এটি প্রয়োগ করার জন্য প্রয়োজনীয় ধাপ এবং কোডগুলির মাধ্যমে আপনাকে গাইড করব। আমরা Emotiv হেডসেট পরিহিত দুই ব্যক্তির কাছ থেকে EEG ডেটা সংগ্রহ করার সময় একটি শব্দ বাজানোর জন্য Python ব্যবহার করব। আমরা EEG ডেটা সংগ্রহ করতে দুটি কম্পিউটার ব্যবহার করব যার প্রতিটিতে EmotivPRO চলবে, এবং প্রতিটি স্ট্রিমকে একটি পৃথক LSL আউটলেটের মাধ্যমে ব্রডকাস্ট করব। আমরা একটি অডিও ফাইল বাজাতে এবং একই সাথে ফাইলটি শুরু হওয়ার প্রতিবার একটি ট্রিগার পাঠাতে একটি Python লাইব্রেরি ব্যবহার করব।

ধাপসমূহ:

১. LSL আউটলেটের মাধ্যমে ডেটা স্ট্রিম করতে EmotivPRO ব্যবহার করুন যার মধ্যে EEG ডেটা (এবং/অথবা মোশন, কনট্যাক্ট কোয়ালিটি, সিগন্যাল কোয়ালিটি ইত্যাদি) অন্তর্ভুক্ত থাকবে। ২. একটি Python স্ক্রিপ্ট ব্যবহার করে একটি অডিও ট্র্যাক বাজান, এবং একই সাথে অন্য একটি LSL-এর মাধ্যমে একটি ট্রিগার পাঠান। LSL ইনলেটের মাধ্যমে তিনটি ডেটা স্ট্রিমই ক্যাপচার এবং সংরক্ষণ করতে LabRecorder ব্যবহার করুন।

২.১ ধাপ ১ - সেটআপ এবং ইনস্টল

  1. ডেটা সংগ্রহের জন্য আপনার সমর্থিত ডেটা অ্যাকুইজিশন ডিভাইস লাগবে
    Emotiv-এর সমস্ত ব্রেইনওয়্যার ডিভাইস EmotivPRO সফটওয়্যারের মাধ্যমে LSL-এর সাথে সংযুক্ত হয়

  2. আপনার ডিভাইসে EmotivPRO ইনস্টল করুন। LSL ব্যবহার করার জন্য আপনার একটি বৈধ EmotivPRO লাইসেন্স লাগবে।

  3. নিচের কমান্ডটি দিয়ে Python LSL লাইব্রেরি ইনস্টল করুন:
    pip install pylsl

  4. LabRecorder সফটওয়্যারটি ডাউনলোড করুন। এটি একটি সহজ, বিনামূল্যের অ্যাপ যা কমান্ড লাইন থেকে বা একটি স্ট্যান্ডঅ্যালোন ডাউনলোড ব্যবহার করে চালানো যেতে পারে

  5. আমাদের পরীক্ষার জন্য: Python ব্যবহার করে অডিও বাজানোর জন্য প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করুন
    pip install sounddevice soundfile

২.২ ধাপ ৩ - EmotivPRO থেকে একটি LSL স্ট্রিমের মাধ্যমে ডেটা পাঠান

  1. অ্যাপের ডানদিকের উপরের কোণায় “…” খুঁজুন, এরপর Settings-এ যান

  2. ‘Lab Streaming Layer’ সেকশন এবং ‘Outlet’ সাবসেকশনটি খুঁজুন

  3. আপনি যে সব ডেটাটাইপ ব্রডকাস্ট করতে চান তা সিলেক্ট করুন

  4. ডেটা ফরম্যাট সিলেক্ট করুন (32-bit float বা 64-bit double)

  5. ডেটা স্যাম্পল-বাই-স্যাম্পল নাকি স্যাম্পলের চাঙ্ক আকারে পাঠাবেন তা সিলেক্ট করুন

  6. একটি LSL ডেটা স্ট্রিম ব্রডকাস্ট করতে ‘Start’-এ ক্লিক করুন


২.৩ ধাপ ৪ - অডিও বাজাতে এবং ট্রিগার পাঠাতে একটি Python স্ক্রিপ্ট ব্যবহার করুন

  1. নিচের কোডব্লকটি কপি করে একটি python ফাইলে পেস্ট করুন এবং আপনার কম্পিউটারে সেভ করুন।

  2. আপনি যে অডিও ফাইলটি (আদর্শভাবে একটি .wav ফাইল) বাজাতে চান তা খুঁজুন এবং স্ক্রিপ্টের audio_filepath ভেরিয়েবলটি পরিবর্তন করে আপনার কম্পিউটারে থাকা আপনার অডিও ফাইলের ফাইলপাথটি দিন

  3. কমান্ড লাইনের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি কমান্ড প্রম্পট খুলুন এবং যে ফোল্ডারে আপনার Python ফাইলটি সংরক্ষিত আছে সেখানে যান

  4. লিখুন: python3 filename.py
    • আপনার Python ইনস্টলেশনের উপর নির্ভর করে, আপনি python3-এর পরিবর্তে python ব্যবহার করতে পারেন

    দ্রষ্টব্য: আপনার পরীক্ষা চলাকালীন আপনি যে অডিও ফাইলটি বাজাতে চান তার লোকেশন দিয়ে /path/to/audio.wav পরিবর্তন করুন।

"""
LSL Example: Play audio and send a trigger marker

This script creates an LSL marker stream, waits for the user to
press ENTER, then plays an audio file and sends a marker that
can be synchronized with EEG data collected through LabRecorder.
"""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet


def wait_for_keypress():
    print("Press ENTER to start audio playback and send an LSL marker.")
    while True:
        if input() == "":
            break


def play_audio_and_send_marker(audio_file, outlet):
    data, fs = sf.read(audio_file)

    print("Playing audio and sending LSL marker...")

    marker_val = [1]
    outlet.push_sample(marker_val)

    sd.play(data, fs)
    sd.wait()

    print("Audio playback finished.")


if __name__ == "__main__":

    info = StreamInfo(
        name="AudioMarkers",
        type="Markers",
        channel_count=1,
        nominal_srate=0,
        channel_format="int32",
        source_id="uniqueMarkerID12345"
    )

    outlet = StreamOutlet(info)

    while True:
        wait_for_keypress()

        audio_filepath = "/path/to/audio.wav"

        play_audio_and_send_marker(
            audio_filepath,
            outlet
        )
"""
LSL Example: Play audio and send a trigger marker

This script creates an LSL marker stream, waits for the user to
press ENTER, then plays an audio file and sends a marker that
can be synchronized with EEG data collected through LabRecorder.
"""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet


def wait_for_keypress():
    print("Press ENTER to start audio playback and send an LSL marker.")
    while True:
        if input() == "":
            break


def play_audio_and_send_marker(audio_file, outlet):
    data, fs = sf.read(audio_file)

    print("Playing audio and sending LSL marker...")

    marker_val = [1]
    outlet.push_sample(marker_val)

    sd.play(data, fs)
    sd.wait()

    print("Audio playback finished.")


if __name__ == "__main__":

    info = StreamInfo(
        name="AudioMarkers",
        type="Markers",
        channel_count=1,
        nominal_srate=0,
        channel_format="int32",
        source_id="uniqueMarkerID12345"
    )

    outlet = StreamOutlet(info)

    while True:
        wait_for_keypress()

        audio_filepath = "/path/to/audio.wav"

        play_audio_and_send_marker(
            audio_filepath,
            outlet
        )
"""
LSL Example: Play audio and send a trigger marker

This script creates an LSL marker stream, waits for the user to
press ENTER, then plays an audio file and sends a marker that
can be synchronized with EEG data collected through LabRecorder.
"""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet


def wait_for_keypress():
    print("Press ENTER to start audio playback and send an LSL marker.")
    while True:
        if input() == "":
            break


def play_audio_and_send_marker(audio_file, outlet):
    data, fs = sf.read(audio_file)

    print("Playing audio and sending LSL marker...")

    marker_val = [1]
    outlet.push_sample(marker_val)

    sd.play(data, fs)
    sd.wait()

    print("Audio playback finished.")


if __name__ == "__main__":

    info = StreamInfo(
        name="AudioMarkers",
        type="Markers",
        channel_count=1,
        nominal_srate=0,
        channel_format="int32",
        source_id="uniqueMarkerID12345"
    )

    outlet = StreamOutlet(info)

    while True:
        wait_for_keypress()

        audio_filepath = "/path/to/audio.wav"

        play_audio_and_send_marker(
            audio_filepath,
            outlet
        )

২.৪ ধাপ ৫ - সমস্ত LSL স্ট্রিম দেখতে এবং সংরক্ষণ করতে LabRecorder ব্যবহার করুন

  1. LabRecorder খুলুন

  2. Update চাপুন। উপলব্ধ LSL স্ট্রিমগুলি স্ট্রিম তালিকায় দৃশ্যমান হওয়া উচিত
    • আপনার উভয় EmotivPROs (সাধারণত “Emotiv-DataStream” নামে পরিচিত) এবং মার্কার স্ট্রিম (“AudioMarkers” নামে পরিচিত) থেকে স্ট্রিমগুলি দেখতে পাওয়া উচিত

  3. ডেটা সংরক্ষণ করার জন্য একটি লোকেশন সিলেক্ট করতে Browse-এ ক্লিক করুন (এবং অন্যান্য প্যারামিটার সেট করুন)

  4. সব স্ট্রিম সিলেক্ট করুন এবং রেকর্ডিং শুরু করতে Record চাপুন

৩.০ ডেটা নিয়ে কাজ করা

LabRecorder একটি XDF ফাইল (Extensible Data Format) আউটপুট দেয় যা সমস্ত স্ট্রিমের ডেটা ধারণ করে। XDF ফাইলগুলি বিভিন্ন স্ট্রিমে সাজানো থাকে, যার প্রতিটিতে একটি আলাদা হেডার থাকে যা বর্ণনা করে যে এতে কী রয়েছে (ডিভাইসের নাম, ডেটার ধরন, স্যাম্পলিং রেট, চ্যানেল এবং আরও অনেক কিছু)। আপনি আপনার XDF ফাইল খুলতে এবং কিছু প্রাথমিক তথ্য প্রদর্শন করতে নিচের কোডব্লকটি ব্যবহার করতে পারেন।

দ্রষ্টব্য: আপনার LabRecorder XDF আউটপুট ফাইলের ফাইলপাথ দিয়ে /path/to/your/file.xdf পরিবর্তন করুন।

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

# Give the path to your LSL output file here.
data_path = "/path/to/your/file.xdf"

# Load the XDF file.
streams, fileheader = pyxdf.load_xdf(data_path)

print("XDF File Header:", fileheader)
print("Number of streams found:", len(streams))

for i, stream in enumerate(streams):
    print("\nStream", i + 1)
    print("Stream Name:", stream["info"]["name"][0])
    print("Stream Type:", stream["info"]["type"][0])
    print("Number of Channels:", stream["info"]["channel_count"][0])

    sfreq = float(stream["info"]["nominal_srate"][0])
    print("Sampling Rate:", sfreq)

    print("Number of Samples:", len(stream["time_series"]))
    print("First 5 data points:", 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"
import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

# Give the path to your LSL output file here.
data_path = "/path/to/your/file.xdf"

# Load the XDF file.
streams, fileheader = pyxdf.load_xdf(data_path)

print("XDF File Header:", fileheader)
print("Number of streams found:", len(streams))

for i, stream in enumerate(streams):
    print("\nStream", i + 1)
    print("Stream Name:", stream["info"]["name"][0])
    print("Stream Type:", stream["info"]["type"][0])
    print("Number of Channels:", stream["info"]["channel_count"][0])

    sfreq = float(stream["info"]["nominal_srate"][0])
    print("Sampling Rate:", sfreq)

    print("Number of Samples:", len(stream["time_series"]))
    print("First 5 data points:", 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"
import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

# Give the path to your LSL output file here.
data_path = "/path/to/your/file.xdf"

# Load the XDF file.
streams, fileheader = pyxdf.load_xdf(data_path)

print("XDF File Header:", fileheader)
print("Number of streams found:", len(streams))

for i, stream in enumerate(streams):
    print("\nStream", i + 1)
    print("Stream Name:", stream["info"]["name"][0])
    print("Stream Type:", stream["info"]["type"][0])
    print("Number of Channels:", stream["info"]["channel_count"][0])

    sfreq = float(stream["info"]["nominal_srate"][0])
    print("Sampling Rate:", sfreq)

    print("Number of Samples:", len(stream["time_series"]))
    print("First 5 data points:", 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"


৪.০ অতিরিক্ত রিসোর্স

অফিসিয়াল ডকুমেন্টেশন

  1. GitHub-এ অফিসিয়াল README ফাইলসহ অনলাইন ডকুমেন্টেশন দেখে নিন

  2. অতিরিক্ত রিসোর্স:
    • উদাহরণ স্ক্রিপ্টসহ Emotiv-এর ডিভাইসগুলি ব্যবহার করে LSL চালানোর কোড
    • YouTube-এ একটি দরকারী LSL ডোমো
    • সমস্ত সংশ্লিষ্ট লাইব্রেরির জন্য SCCN LSL GitHub রিপোজিটরি
    • সাবমডিউল এবং অ্যাপের সংগ্রহের জন্য LSL GitHub রিপোজিটরি

  3. Hyperscanning স্টাডির জন্য HyPyP বিশ্লেষণ পাইপলাইন

স্বাগতম! এই টিউটোরিয়ালে আমরা শিখব কীভাবে Python-এ Lab Streaming Layer (LSL) ব্যবহার করে একাধিক ডিভাইস থেকে Emotiv EEG ডেটা সংগ্রহ এবং সিঙ্ক্রোনাইজ করা যায়। এর জন্য Python প্রোগ্রামিং ভাষার প্রাথমিক কার্যকারী জ্ঞান থাকা প্রয়োজন।

আপনি যা শিখবেন

  1. Lab Streaming Layer (LSL) কী এবং গবেষকরা কেন এটি ব্যবহার করেন

  2. কীভাবে একাধিক Emotiv EEG ডিভাইস থেকে সিঙ্ক্রোনাইজড ডেটা সংগ্রহ করবেন

  3. কীভাবে সংগৃহীত ডেটা ইম্পোর্ট এবং পরীক্ষা করবেন

1.1 LSL কী এবং এটি কীসের জন্য ভালো?

Lab streaming layer (LSL) হলো একটি ওপেন-সোর্স টুলবক্স যা বিভিন্ন সেন্সর হার্ডওয়্যার থেকে নিউরাল, ফিজিওলজিক্যাল এবং আচরণগত ডেটা স্ট্রিম পাঠাতে, গ্রহণ করতে এবং সিঙ্ক্রোনাইজ করতে ব্যবহার করা যেতে পারে। ক্রমেই আরও বেশি কার্যকরী, সুনির্দিষ্ট এবং বহনযোগ্য ব্রেন ও বডি-সেন্সিং হার্ডওয়্যার ডিভাইসগুলি (যেমন Emotiv EEG সিস্টেম) নিউরোসায়েন্সকে ল্যাবের বাইরে রিয়েল-টাইম ডেটার জগতে নিয়ে আসছে। যেখানে EEG এবং MEG-এর মতো মস্তিষ্কের পরিমাপ একসময় গবেষণাগারের মধ্যেই সীমাবদ্ধ ছিল, সেখানে মোবাইল ডিভাইসগুলি আমাদের আরও স্বাভাবিক পরিবেশে এবং একসাথে একাধিক ব্যক্তির কাছ থেকে বিপুল পরিমাণ ডেটা সংগ্রহ করতে সাহায্য করে।

একজন গবেষক একই গান শুনছেন এমন দুই ব্যক্তির মধ্যে শারীরবৃত্তীয় সামঞ্জস্য বা সিঙ্ক্রোনি নিয়ে আগ্রহী হতে পারেন। LSL আমাদের দুটি পৃথক EEG হেডসেট থেকে ডেটা সংগ্রহ করতে সাহায্য করতে পারে যা শব্দের প্লেব্যাকের সাথে সিঙ্ক্রোনাইজড থাকবে।

LSL-এর অন্যান্য ব্যবহারের কিছু উদাহরণ:

  1. একটি পরীক্ষা থেকে কোনো চলমান EEG ডেটাতে ইভেন্ট মার্কার যুক্ত করা

  2. একজন একক অংশগ্রহণকারীর জন্য একাধিক উৎস থেকে প্রাপ্ত ডেটা সময়ানুযায়ী মেলানো (যেমন হৃদস্পন্দনের হার, EMG, EEG)

  3. একাধিক অংশগ্রহণকারীর থেকে প্রাপ্ত ডেটা সময়ানুযায়ী মেলানো (যেমন EEG Hyperscanning স্টাডিজ)

1.2 LSL কীভাবে কাজ করে?

Lab Streaming Layer হলো একাধিক ডিভাইসের মধ্যে রিয়েল-টাইম টাইম-সিরিজ ডেটা আদান-প্রদানের একটি প্রোটোকল। Python, MATLAB, C++, Java এবং অন্যান্য প্রোগ্রামিং ভাষার ওপেন-সোর্স লাইব্রেরি ব্যবহার করে LSL প্রয়োগ করা যেতে পারে।

এর মূল কার্যকারিতা LSL ডেটা স্ট্রিম-কে কেন্দ্র করে আবর্তিত হয়:

১. একটি অ্যাকুইজিশন ডিভাইস/সফটওয়্যার ডেটা সংগ্রহ করে এবং একটি ডেটা স্ট্রিম তৈরি করে - EEG রেকর্ডিং ডিভাইস, আই-ট্যাকার, মোশন ক্যাপচার সিস্টেম, হার্ট রেট মনিটর ইত্যাদি থেকে মেটাডেটাসহ (স্যাম্পলিং রেট, ডেটা টাইপ, চ্যানেল ইনফরমেশন ইত্যাদি) ফিজিওলজিক্যাল ডেটা LSL-এ স্ট্রিম করা যেতে পারে - পরীক্ষা থেকে পাওয়া ইভেন্ট মার্কারগুলিও (যেমন PsychoPy ব্যবহার করে) LSL ব্যবহার করে ডেটা স্ট্রিম হিসেবে পাঠানো যেতে পারে

২. ডেটা স্ট্রিমটি নেটওয়ার্কে প্রকাশ (publish) করা হয় - এভাবেই LSL ব্যবহার করে ডেটা পাঠানো হয়; ডেটা স্ট্রিমটি নেটওয়ার্কে “ব্রডকাস্ট” হয় - প্রকাশিত স্ট্রিমগুলি নেটওয়ার্কে উপলব্ধ থাকে এবং একই নেটওয়ার্কে থাকা অন্যান্য LSL-সমর্থিত ডিভাইসগুলির দ্বারা সনাক্ত করা যায় - LSL একটি সাধারণ ঘড়ির উপর ভিত্তি করে (নেটওয়ার্ক টাইম প্রোটোকল অনুসরণ করে) প্রতিটি ডেটা চাঙ্ক বা স্যাম্পলকে একটি টাইমস্ট্যাম্প অ্যাসাইন করে। - স্ট্রিমটি একটি “আউটলেট”-এর মাধ্যমে স্যাম্পল-বাই-স্যাম্পল (অথবা চাঙ্ক-বাই-চাঙ্ক) পুশ করা হয়

৩. সংগ্রহকারী ডিভাইস(গুলি) ডেটা স্ট্রিম(গুলিতে) “সাবস্ক্রাইব” করে - এভাবেই LSL ব্যবহার করে ডেটা গ্রহণ করা হয় - একই নেটওয়ার্কে থাকা সংগ্রহকারী ডিভাইসগুলি “ইনলেট”-এর মাধ্যমে প্রকাশিত ডেটা স্ট্রিমগুলি গ্রহণ করে। - প্রতিটি ইনলেট কেবল একটি আউটলেট থেকেই স্ট্রিমের স্যাম্পল এবং মেটাডেটা গ্রহণ করে

৪. ডেটা সংরক্ষণ করুন - একটি ডেটা স্ট্রিমে সাবস্ক্রাইব করার পর, আপনি এটি আপনার পছন্দের প্রোগ্রামিং ভাষার একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন, অথবা এটি .xdf-এর মতো একটি স্ট্যান্ডার্ড ফরম্যাটে সংরক্ষণ করতে LSL-এর দেওয়া সফটওয়্যার LabRecorder ব্যবহার করতে পারেন।

২.০ টিউটোরিয়াল ওভারভিউ

এই টিউটোরিয়ালে, আমরা একটি নমুনা পরীক্ষামূলক সেটআপ নেব এবং Python-এ LSL ব্যবহার করে এটি প্রয়োগ করার জন্য প্রয়োজনীয় ধাপ এবং কোডগুলির মাধ্যমে আপনাকে গাইড করব। আমরা Emotiv হেডসেট পরিহিত দুই ব্যক্তির কাছ থেকে EEG ডেটা সংগ্রহ করার সময় একটি শব্দ বাজানোর জন্য Python ব্যবহার করব। আমরা EEG ডেটা সংগ্রহ করতে দুটি কম্পিউটার ব্যবহার করব যার প্রতিটিতে EmotivPRO চলবে, এবং প্রতিটি স্ট্রিমকে একটি পৃথক LSL আউটলেটের মাধ্যমে ব্রডকাস্ট করব। আমরা একটি অডিও ফাইল বাজাতে এবং একই সাথে ফাইলটি শুরু হওয়ার প্রতিবার একটি ট্রিগার পাঠাতে একটি Python লাইব্রেরি ব্যবহার করব।

ধাপসমূহ:

১. LSL আউটলেটের মাধ্যমে ডেটা স্ট্রিম করতে EmotivPRO ব্যবহার করুন যার মধ্যে EEG ডেটা (এবং/অথবা মোশন, কনট্যাক্ট কোয়ালিটি, সিগন্যাল কোয়ালিটি ইত্যাদি) অন্তর্ভুক্ত থাকবে। ২. একটি Python স্ক্রিপ্ট ব্যবহার করে একটি অডিও ট্র্যাক বাজান, এবং একই সাথে অন্য একটি LSL-এর মাধ্যমে একটি ট্রিগার পাঠান। LSL ইনলেটের মাধ্যমে তিনটি ডেটা স্ট্রিমই ক্যাপচার এবং সংরক্ষণ করতে LabRecorder ব্যবহার করুন।

২.১ ধাপ ১ - সেটআপ এবং ইনস্টল

  1. ডেটা সংগ্রহের জন্য আপনার সমর্থিত ডেটা অ্যাকুইজিশন ডিভাইস লাগবে
    Emotiv-এর সমস্ত ব্রেইনওয়্যার ডিভাইস EmotivPRO সফটওয়্যারের মাধ্যমে LSL-এর সাথে সংযুক্ত হয়

  2. আপনার ডিভাইসে EmotivPRO ইনস্টল করুন। LSL ব্যবহার করার জন্য আপনার একটি বৈধ EmotivPRO লাইসেন্স লাগবে।

  3. নিচের কমান্ডটি দিয়ে Python LSL লাইব্রেরি ইনস্টল করুন:
    pip install pylsl

  4. LabRecorder সফটওয়্যারটি ডাউনলোড করুন। এটি একটি সহজ, বিনামূল্যের অ্যাপ যা কমান্ড লাইন থেকে বা একটি স্ট্যান্ডঅ্যালোন ডাউনলোড ব্যবহার করে চালানো যেতে পারে

  5. আমাদের পরীক্ষার জন্য: Python ব্যবহার করে অডিও বাজানোর জন্য প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করুন
    pip install sounddevice soundfile

২.২ ধাপ ৩ - EmotivPRO থেকে একটি LSL স্ট্রিমের মাধ্যমে ডেটা পাঠান

  1. অ্যাপের ডানদিকের উপরের কোণায় “…” খুঁজুন, এরপর Settings-এ যান

  2. ‘Lab Streaming Layer’ সেকশন এবং ‘Outlet’ সাবসেকশনটি খুঁজুন

  3. আপনি যে সব ডেটাটাইপ ব্রডকাস্ট করতে চান তা সিলেক্ট করুন

  4. ডেটা ফরম্যাট সিলেক্ট করুন (32-bit float বা 64-bit double)

  5. ডেটা স্যাম্পল-বাই-স্যাম্পল নাকি স্যাম্পলের চাঙ্ক আকারে পাঠাবেন তা সিলেক্ট করুন

  6. একটি LSL ডেটা স্ট্রিম ব্রডকাস্ট করতে ‘Start’-এ ক্লিক করুন


২.৩ ধাপ ৪ - অডিও বাজাতে এবং ট্রিগার পাঠাতে একটি Python স্ক্রিপ্ট ব্যবহার করুন

  1. নিচের কোডব্লকটি কপি করে একটি python ফাইলে পেস্ট করুন এবং আপনার কম্পিউটারে সেভ করুন।

  2. আপনি যে অডিও ফাইলটি (আদর্শভাবে একটি .wav ফাইল) বাজাতে চান তা খুঁজুন এবং স্ক্রিপ্টের audio_filepath ভেরিয়েবলটি পরিবর্তন করে আপনার কম্পিউটারে থাকা আপনার অডিও ফাইলের ফাইলপাথটি দিন

  3. কমান্ড লাইনের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি কমান্ড প্রম্পট খুলুন এবং যে ফোল্ডারে আপনার Python ফাইলটি সংরক্ষিত আছে সেখানে যান

  4. লিখুন: python3 filename.py
    • আপনার Python ইনস্টলেশনের উপর নির্ভর করে, আপনি python3-এর পরিবর্তে python ব্যবহার করতে পারেন

    দ্রষ্টব্য: আপনার পরীক্ষা চলাকালীন আপনি যে অডিও ফাইলটি বাজাতে চান তার লোকেশন দিয়ে /path/to/audio.wav পরিবর্তন করুন।

"""
LSL Example: Play audio and send a trigger marker

This script creates an LSL marker stream, waits for the user to
press ENTER, then plays an audio file and sends a marker that
can be synchronized with EEG data collected through LabRecorder.
"""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet


def wait_for_keypress():
    print("Press ENTER to start audio playback and send an LSL marker.")
    while True:
        if input() == "":
            break


def play_audio_and_send_marker(audio_file, outlet):
    data, fs = sf.read(audio_file)

    print("Playing audio and sending LSL marker...")

    marker_val = [1]
    outlet.push_sample(marker_val)

    sd.play(data, fs)
    sd.wait()

    print("Audio playback finished.")


if __name__ == "__main__":

    info = StreamInfo(
        name="AudioMarkers",
        type="Markers",
        channel_count=1,
        nominal_srate=0,
        channel_format="int32",
        source_id="uniqueMarkerID12345"
    )

    outlet = StreamOutlet(info)

    while True:
        wait_for_keypress()

        audio_filepath = "/path/to/audio.wav"

        play_audio_and_send_marker(
            audio_filepath,
            outlet
        )

২.৪ ধাপ ৫ - সমস্ত LSL স্ট্রিম দেখতে এবং সংরক্ষণ করতে LabRecorder ব্যবহার করুন

  1. LabRecorder খুলুন

  2. Update চাপুন। উপলব্ধ LSL স্ট্রিমগুলি স্ট্রিম তালিকায় দৃশ্যমান হওয়া উচিত
    • আপনার উভয় EmotivPROs (সাধারণত “Emotiv-DataStream” নামে পরিচিত) এবং মার্কার স্ট্রিম (“AudioMarkers” নামে পরিচিত) থেকে স্ট্রিমগুলি দেখতে পাওয়া উচিত

  3. ডেটা সংরক্ষণ করার জন্য একটি লোকেশন সিলেক্ট করতে Browse-এ ক্লিক করুন (এবং অন্যান্য প্যারামিটার সেট করুন)

  4. সব স্ট্রিম সিলেক্ট করুন এবং রেকর্ডিং শুরু করতে Record চাপুন

৩.০ ডেটা নিয়ে কাজ করা

LabRecorder একটি XDF ফাইল (Extensible Data Format) আউটপুট দেয় যা সমস্ত স্ট্রিমের ডেটা ধারণ করে। XDF ফাইলগুলি বিভিন্ন স্ট্রিমে সাজানো থাকে, যার প্রতিটিতে একটি আলাদা হেডার থাকে যা বর্ণনা করে যে এতে কী রয়েছে (ডিভাইসের নাম, ডেটার ধরন, স্যাম্পলিং রেট, চ্যানেল এবং আরও অনেক কিছু)। আপনি আপনার XDF ফাইল খুলতে এবং কিছু প্রাথমিক তথ্য প্রদর্শন করতে নিচের কোডব্লকটি ব্যবহার করতে পারেন।

দ্রষ্টব্য: আপনার LabRecorder XDF আউটপুট ফাইলের ফাইলপাথ দিয়ে /path/to/your/file.xdf পরিবর্তন করুন।

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

# Give the path to your LSL output file here.
data_path = "/path/to/your/file.xdf"

# Load the XDF file.
streams, fileheader = pyxdf.load_xdf(data_path)

print("XDF File Header:", fileheader)
print("Number of streams found:", len(streams))

for i, stream in enumerate(streams):
    print("\nStream", i + 1)
    print("Stream Name:", stream["info"]["name"][0])
    print("Stream Type:", stream["info"]["type"][0])
    print("Number of Channels:", stream["info"]["channel_count"][0])

    sfreq = float(stream["info"]["nominal_srate"][0])
    print("Sampling Rate:", sfreq)

    print("Number of Samples:", len(stream["time_series"]))
    print("First 5 data points:", 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"


৪.০ অতিরিক্ত রিসোর্স

অফিসিয়াল ডকুমেন্টেশন

  1. GitHub-এ অফিসিয়াল README ফাইলসহ অনলাইন ডকুমেন্টেশন দেখে নিন

  2. অতিরিক্ত রিসোর্স:
    • উদাহরণ স্ক্রিপ্টসহ Emotiv-এর ডিভাইসগুলি ব্যবহার করে LSL চালানোর কোড
    • YouTube-এ একটি দরকারী LSL ডোমো
    • সমস্ত সংশ্লিষ্ট লাইব্রেরির জন্য SCCN LSL GitHub রিপোজিটরি
    • সাবমডিউল এবং অ্যাপের সংগ্রহের জন্য LSL GitHub রিপোজিটরি

  3. Hyperscanning স্টাডির জন্য HyPyP বিশ্লেষণ পাইপলাইন

স্বাগতম! এই টিউটোরিয়ালে আমরা শিখব কীভাবে Python-এ Lab Streaming Layer (LSL) ব্যবহার করে একাধিক ডিভাইস থেকে Emotiv EEG ডেটা সংগ্রহ এবং সিঙ্ক্রোনাইজ করা যায়। এর জন্য Python প্রোগ্রামিং ভাষার প্রাথমিক কার্যকারী জ্ঞান থাকা প্রয়োজন।

আপনি যা শিখবেন

  1. Lab Streaming Layer (LSL) কী এবং গবেষকরা কেন এটি ব্যবহার করেন

  2. কীভাবে একাধিক Emotiv EEG ডিভাইস থেকে সিঙ্ক্রোনাইজড ডেটা সংগ্রহ করবেন

  3. কীভাবে সংগৃহীত ডেটা ইম্পোর্ট এবং পরীক্ষা করবেন

1.1 LSL কী এবং এটি কীসের জন্য ভালো?

Lab streaming layer (LSL) হলো একটি ওপেন-সোর্স টুলবক্স যা বিভিন্ন সেন্সর হার্ডওয়্যার থেকে নিউরাল, ফিজিওলজিক্যাল এবং আচরণগত ডেটা স্ট্রিম পাঠাতে, গ্রহণ করতে এবং সিঙ্ক্রোনাইজ করতে ব্যবহার করা যেতে পারে। ক্রমেই আরও বেশি কার্যকরী, সুনির্দিষ্ট এবং বহনযোগ্য ব্রেন ও বডি-সেন্সিং হার্ডওয়্যার ডিভাইসগুলি (যেমন Emotiv EEG সিস্টেম) নিউরোসায়েন্সকে ল্যাবের বাইরে রিয়েল-টাইম ডেটার জগতে নিয়ে আসছে। যেখানে EEG এবং MEG-এর মতো মস্তিষ্কের পরিমাপ একসময় গবেষণাগারের মধ্যেই সীমাবদ্ধ ছিল, সেখানে মোবাইল ডিভাইসগুলি আমাদের আরও স্বাভাবিক পরিবেশে এবং একসাথে একাধিক ব্যক্তির কাছ থেকে বিপুল পরিমাণ ডেটা সংগ্রহ করতে সাহায্য করে।

একজন গবেষক একই গান শুনছেন এমন দুই ব্যক্তির মধ্যে শারীরবৃত্তীয় সামঞ্জস্য বা সিঙ্ক্রোনি নিয়ে আগ্রহী হতে পারেন। LSL আমাদের দুটি পৃথক EEG হেডসেট থেকে ডেটা সংগ্রহ করতে সাহায্য করতে পারে যা শব্দের প্লেব্যাকের সাথে সিঙ্ক্রোনাইজড থাকবে।

LSL-এর অন্যান্য ব্যবহারের কিছু উদাহরণ:

  1. একটি পরীক্ষা থেকে কোনো চলমান EEG ডেটাতে ইভেন্ট মার্কার যুক্ত করা

  2. একজন একক অংশগ্রহণকারীর জন্য একাধিক উৎস থেকে প্রাপ্ত ডেটা সময়ানুযায়ী মেলানো (যেমন হৃদস্পন্দনের হার, EMG, EEG)

  3. একাধিক অংশগ্রহণকারীর থেকে প্রাপ্ত ডেটা সময়ানুযায়ী মেলানো (যেমন EEG Hyperscanning স্টাডিজ)

1.2 LSL কীভাবে কাজ করে?

Lab Streaming Layer হলো একাধিক ডিভাইসের মধ্যে রিয়েল-টাইম টাইম-সিরিজ ডেটা আদান-প্রদানের একটি প্রোটোকল। Python, MATLAB, C++, Java এবং অন্যান্য প্রোগ্রামিং ভাষার ওপেন-সোর্স লাইব্রেরি ব্যবহার করে LSL প্রয়োগ করা যেতে পারে।

এর মূল কার্যকারিতা LSL ডেটা স্ট্রিম-কে কেন্দ্র করে আবর্তিত হয়:

১. একটি অ্যাকুইজিশন ডিভাইস/সফটওয়্যার ডেটা সংগ্রহ করে এবং একটি ডেটা স্ট্রিম তৈরি করে - EEG রেকর্ডিং ডিভাইস, আই-ট্যাকার, মোশন ক্যাপচার সিস্টেম, হার্ট রেট মনিটর ইত্যাদি থেকে মেটাডেটাসহ (স্যাম্পলিং রেট, ডেটা টাইপ, চ্যানেল ইনফরমেশন ইত্যাদি) ফিজিওলজিক্যাল ডেটা LSL-এ স্ট্রিম করা যেতে পারে - পরীক্ষা থেকে পাওয়া ইভেন্ট মার্কারগুলিও (যেমন PsychoPy ব্যবহার করে) LSL ব্যবহার করে ডেটা স্ট্রিম হিসেবে পাঠানো যেতে পারে

২. ডেটা স্ট্রিমটি নেটওয়ার্কে প্রকাশ (publish) করা হয় - এভাবেই LSL ব্যবহার করে ডেটা পাঠানো হয়; ডেটা স্ট্রিমটি নেটওয়ার্কে “ব্রডকাস্ট” হয় - প্রকাশিত স্ট্রিমগুলি নেটওয়ার্কে উপলব্ধ থাকে এবং একই নেটওয়ার্কে থাকা অন্যান্য LSL-সমর্থিত ডিভাইসগুলির দ্বারা সনাক্ত করা যায় - LSL একটি সাধারণ ঘড়ির উপর ভিত্তি করে (নেটওয়ার্ক টাইম প্রোটোকল অনুসরণ করে) প্রতিটি ডেটা চাঙ্ক বা স্যাম্পলকে একটি টাইমস্ট্যাম্প অ্যাসাইন করে। - স্ট্রিমটি একটি “আউটলেট”-এর মাধ্যমে স্যাম্পল-বাই-স্যাম্পল (অথবা চাঙ্ক-বাই-চাঙ্ক) পুশ করা হয়

৩. সংগ্রহকারী ডিভাইস(গুলি) ডেটা স্ট্রিম(গুলিতে) “সাবস্ক্রাইব” করে - এভাবেই LSL ব্যবহার করে ডেটা গ্রহণ করা হয় - একই নেটওয়ার্কে থাকা সংগ্রহকারী ডিভাইসগুলি “ইনলেট”-এর মাধ্যমে প্রকাশিত ডেটা স্ট্রিমগুলি গ্রহণ করে। - প্রতিটি ইনলেট কেবল একটি আউটলেট থেকেই স্ট্রিমের স্যাম্পল এবং মেটাডেটা গ্রহণ করে

৪. ডেটা সংরক্ষণ করুন - একটি ডেটা স্ট্রিমে সাবস্ক্রাইব করার পর, আপনি এটি আপনার পছন্দের প্রোগ্রামিং ভাষার একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন, অথবা এটি .xdf-এর মতো একটি স্ট্যান্ডার্ড ফরম্যাটে সংরক্ষণ করতে LSL-এর দেওয়া সফটওয়্যার LabRecorder ব্যবহার করতে পারেন।

২.০ টিউটোরিয়াল ওভারভিউ

এই টিউটোরিয়ালে, আমরা একটি নমুনা পরীক্ষামূলক সেটআপ নেব এবং Python-এ LSL ব্যবহার করে এটি প্রয়োগ করার জন্য প্রয়োজনীয় ধাপ এবং কোডগুলির মাধ্যমে আপনাকে গাইড করব। আমরা Emotiv হেডসেট পরিহিত দুই ব্যক্তির কাছ থেকে EEG ডেটা সংগ্রহ করার সময় একটি শব্দ বাজানোর জন্য Python ব্যবহার করব। আমরা EEG ডেটা সংগ্রহ করতে দুটি কম্পিউটার ব্যবহার করব যার প্রতিটিতে EmotivPRO চলবে, এবং প্রতিটি স্ট্রিমকে একটি পৃথক LSL আউটলেটের মাধ্যমে ব্রডকাস্ট করব। আমরা একটি অডিও ফাইল বাজাতে এবং একই সাথে ফাইলটি শুরু হওয়ার প্রতিবার একটি ট্রিগার পাঠাতে একটি Python লাইব্রেরি ব্যবহার করব।

ধাপসমূহ:

১. LSL আউটলেটের মাধ্যমে ডেটা স্ট্রিম করতে EmotivPRO ব্যবহার করুন যার মধ্যে EEG ডেটা (এবং/অথবা মোশন, কনট্যাক্ট কোয়ালিটি, সিগন্যাল কোয়ালিটি ইত্যাদি) অন্তর্ভুক্ত থাকবে। ২. একটি Python স্ক্রিপ্ট ব্যবহার করে একটি অডিও ট্র্যাক বাজান, এবং একই সাথে অন্য একটি LSL-এর মাধ্যমে একটি ট্রিগার পাঠান। LSL ইনলেটের মাধ্যমে তিনটি ডেটা স্ট্রিমই ক্যাপচার এবং সংরক্ষণ করতে LabRecorder ব্যবহার করুন।

২.১ ধাপ ১ - সেটআপ এবং ইনস্টল

  1. ডেটা সংগ্রহের জন্য আপনার সমর্থিত ডেটা অ্যাকুইজিশন ডিভাইস লাগবে
    Emotiv-এর সমস্ত ব্রেইনওয়্যার ডিভাইস EmotivPRO সফটওয়্যারের মাধ্যমে LSL-এর সাথে সংযুক্ত হয়

  2. আপনার ডিভাইসে EmotivPRO ইনস্টল করুন। LSL ব্যবহার করার জন্য আপনার একটি বৈধ EmotivPRO লাইসেন্স লাগবে।

  3. নিচের কমান্ডটি দিয়ে Python LSL লাইব্রেরি ইনস্টল করুন:
    pip install pylsl

  4. LabRecorder সফটওয়্যারটি ডাউনলোড করুন। এটি একটি সহজ, বিনামূল্যের অ্যাপ যা কমান্ড লাইন থেকে বা একটি স্ট্যান্ডঅ্যালোন ডাউনলোড ব্যবহার করে চালানো যেতে পারে

  5. আমাদের পরীক্ষার জন্য: Python ব্যবহার করে অডিও বাজানোর জন্য প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করুন
    pip install sounddevice soundfile

২.২ ধাপ ৩ - EmotivPRO থেকে একটি LSL স্ট্রিমের মাধ্যমে ডেটা পাঠান

  1. অ্যাপের ডানদিকের উপরের কোণায় “…” খুঁজুন, এরপর Settings-এ যান

  2. ‘Lab Streaming Layer’ সেকশন এবং ‘Outlet’ সাবসেকশনটি খুঁজুন

  3. আপনি যে সব ডেটাটাইপ ব্রডকাস্ট করতে চান তা সিলেক্ট করুন

  4. ডেটা ফরম্যাট সিলেক্ট করুন (32-bit float বা 64-bit double)

  5. ডেটা স্যাম্পল-বাই-স্যাম্পল নাকি স্যাম্পলের চাঙ্ক আকারে পাঠাবেন তা সিলেক্ট করুন

  6. একটি LSL ডেটা স্ট্রিম ব্রডকাস্ট করতে ‘Start’-এ ক্লিক করুন


২.৩ ধাপ ৪ - অডিও বাজাতে এবং ট্রিগার পাঠাতে একটি Python স্ক্রিপ্ট ব্যবহার করুন

  1. নিচের কোডব্লকটি কপি করে একটি python ফাইলে পেস্ট করুন এবং আপনার কম্পিউটারে সেভ করুন।

  2. আপনি যে অডিও ফাইলটি (আদর্শভাবে একটি .wav ফাইল) বাজাতে চান তা খুঁজুন এবং স্ক্রিপ্টের audio_filepath ভেরিয়েবলটি পরিবর্তন করে আপনার কম্পিউটারে থাকা আপনার অডিও ফাইলের ফাইলপাথটি দিন

  3. কমান্ড লাইনের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি কমান্ড প্রম্পট খুলুন এবং যে ফোল্ডারে আপনার Python ফাইলটি সংরক্ষিত আছে সেখানে যান

  4. লিখুন: python3 filename.py
    • আপনার Python ইনস্টলেশনের উপর নির্ভর করে, আপনি python3-এর পরিবর্তে python ব্যবহার করতে পারেন

    দ্রষ্টব্য: আপনার পরীক্ষা চলাকালীন আপনি যে অডিও ফাইলটি বাজাতে চান তার লোকেশন দিয়ে /path/to/audio.wav পরিবর্তন করুন।

"""
LSL Example: Play audio and send a trigger marker

This script creates an LSL marker stream, waits for the user to
press ENTER, then plays an audio file and sends a marker that
can be synchronized with EEG data collected through LabRecorder.
"""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet


def wait_for_keypress():
    print("Press ENTER to start audio playback and send an LSL marker.")
    while True:
        if input() == "":
            break


def play_audio_and_send_marker(audio_file, outlet):
    data, fs = sf.read(audio_file)

    print("Playing audio and sending LSL marker...")

    marker_val = [1]
    outlet.push_sample(marker_val)

    sd.play(data, fs)
    sd.wait()

    print("Audio playback finished.")


if __name__ == "__main__":

    info = StreamInfo(
        name="AudioMarkers",
        type="Markers",
        channel_count=1,
        nominal_srate=0,
        channel_format="int32",
        source_id="uniqueMarkerID12345"
    )

    outlet = StreamOutlet(info)

    while True:
        wait_for_keypress()

        audio_filepath = "/path/to/audio.wav"

        play_audio_and_send_marker(
            audio_filepath,
            outlet
        )

২.৪ ধাপ ৫ - সমস্ত LSL স্ট্রিম দেখতে এবং সংরক্ষণ করতে LabRecorder ব্যবহার করুন

  1. LabRecorder খুলুন

  2. Update চাপুন। উপলব্ধ LSL স্ট্রিমগুলি স্ট্রিম তালিকায় দৃশ্যমান হওয়া উচিত
    • আপনার উভয় EmotivPROs (সাধারণত “Emotiv-DataStream” নামে পরিচিত) এবং মার্কার স্ট্রিম (“AudioMarkers” নামে পরিচিত) থেকে স্ট্রিমগুলি দেখতে পাওয়া উচিত

  3. ডেটা সংরক্ষণ করার জন্য একটি লোকেশন সিলেক্ট করতে Browse-এ ক্লিক করুন (এবং অন্যান্য প্যারামিটার সেট করুন)

  4. সব স্ট্রিম সিলেক্ট করুন এবং রেকর্ডিং শুরু করতে Record চাপুন

৩.০ ডেটা নিয়ে কাজ করা

LabRecorder একটি XDF ফাইল (Extensible Data Format) আউটপুট দেয় যা সমস্ত স্ট্রিমের ডেটা ধারণ করে। XDF ফাইলগুলি বিভিন্ন স্ট্রিমে সাজানো থাকে, যার প্রতিটিতে একটি আলাদা হেডার থাকে যা বর্ণনা করে যে এতে কী রয়েছে (ডিভাইসের নাম, ডেটার ধরন, স্যাম্পলিং রেট, চ্যানেল এবং আরও অনেক কিছু)। আপনি আপনার XDF ফাইল খুলতে এবং কিছু প্রাথমিক তথ্য প্রদর্শন করতে নিচের কোডব্লকটি ব্যবহার করতে পারেন।

দ্রষ্টব্য: আপনার LabRecorder XDF আউটপুট ফাইলের ফাইলপাথ দিয়ে /path/to/your/file.xdf পরিবর্তন করুন।

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

# Give the path to your LSL output file here.
data_path = "/path/to/your/file.xdf"

# Load the XDF file.
streams, fileheader = pyxdf.load_xdf(data_path)

print("XDF File Header:", fileheader)
print("Number of streams found:", len(streams))

for i, stream in enumerate(streams):
    print("\nStream", i + 1)
    print("Stream Name:", stream["info"]["name"][0])
    print("Stream Type:", stream["info"]["type"][0])
    print("Number of Channels:", stream["info"]["channel_count"][0])

    sfreq = float(stream["info"]["nominal_srate"][0])
    print("Sampling Rate:", sfreq)

    print("Number of Samples:", len(stream["time_series"]))
    print("First 5 data points:", 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"


৪.০ অতিরিক্ত রিসোর্স

অফিসিয়াল ডকুমেন্টেশন

  1. GitHub-এ অফিসিয়াল README ফাইলসহ অনলাইন ডকুমেন্টেশন দেখে নিন

  2. অতিরিক্ত রিসোর্স:
    • উদাহরণ স্ক্রিপ্টসহ Emotiv-এর ডিভাইসগুলি ব্যবহার করে LSL চালানোর কোড
    • YouTube-এ একটি দরকারী LSL ডোমো
    • সমস্ত সংশ্লিষ্ট লাইব্রেরির জন্য SCCN LSL GitHub রিপোজিটরি
    • সাবমডিউল এবং অ্যাপের সংগ্রহের জন্য LSL GitHub রিপোজিটরি

  3. Hyperscanning স্টাডির জন্য HyPyP বিশ্লেষণ পাইপলাইন

A technician fits an Emotiv saline EEG headset on a test participant.

পড়তে থাকুন

Basics of Neural Oscillations