
複数データストリーム同期のためのLab Streaming Layer (LSL)
ロシニ・ランデニヤ博士とルーカス・クライネ
更新日
2024/05/17

複数データストリーム同期のためのLab Streaming Layer (LSL)
ロシニ・ランデニヤ博士とルーカス・クライネ
更新日
2024/05/17

複数データストリーム同期のためのLab Streaming Layer (LSL)
ロシニ・ランデニヤ博士とルーカス・クライネ
更新日
2024/05/17
ようこそ!このチュートリアルでは、PythonでLab Streaming Layer(LSL)を使用して、複数のデバイスから流入するEmotiv EEG(脳波)データを収集および同期する方法を学びます。本チュートリアルを進めるには、Pythonプログラミング言語の基本的な知識が必要となります。
学習内容
Lab Streaming Layer(LSL)とは何か、そしてなぜ研究者がそれを使用するのか
複数のEmotiv EEGデバイスから同期されたデータを収集する方法
収集したデータをインポートして検査する方法
1.1 LSLとは何か、何に役立つのか?
Lab Streaming Layer(LSL)は、さまざまなセンサーハードウェアから供給される神経データ、生理学的データ、および行動データのストリームを送信、受信、同期するために使用できるオープンソースツールボックスです。Emotiv EEGシステムのように、高機能で高精度、かつモバイル対応の脳・身体センサハードウェアデバイスの登場により、神経科学はラボから飛び出し、リアルタイムデータの世界へと移行しつつあります。EEGやMEGなどの脳測定はかつて研究室内に限定されていましたが、モバイルデバイスのおかげで、より自然な環境下で、複数の人々から同時にさまざまなデータを収集できるようになりました。
研究者は、同じ音楽を聴いている2人の間の生理学的同調性に関心を持つかもしれません。LSLを使用すれば、音の提示に同期した形で、2台のEEGヘッドセットから個別にデータを収集できます。
LSLのその他の使用イメージ:
実験中のイベントマーカーを継続しているEEGデータに追加する
1人の参加者の複数のデータソース(心拍数、EMG、EEGなど)の時間軸を合わせる
複数人の参加者のデータ(EEGハイパースキャニング研究など)の時間軸を合わせる
1.2 LSLの仕組みは?
Lab Streaming Layerは、複数のデバイス間で時系列データをリアルタイムにやり取りするためのプロトコルです。LSLは、Python、MATLAB、C++、Javaなどのプログラミング言語向けのオープンソースライブラリを使用することで実装できます。

その中核機能は、LSLのデータストリームを中心に展開されます:
1. 計測デバイスもしくはソフトウェアがデータを収集し、データストリームを作成する - EEG記録デバイス、視線追跡システム、モーションキャプチャシステム、心拍モニターなどから、メタデータ(サンプリングレート、データ形式、チャネル情報など)を含む生理学的データがLSLにストリーミング送信されます。PsychoPy等を使用した実験からのイベントマーカーも、LSLを用いてデータストリームとして送信できます。
2. データストリームがネットワーク上に「パブリッシュ(公開)」される - LSLを介してデータが送信される仕組みです。データストリームはネットワークに「ブロードキャスト」されます。公開されたストリームはネットワーク上で利用可能になり、同じネットワーク上の他のLSL対応デバイスから検出できるようになります。LSLは共通のクロック(ネットワークタイムプロトコルに従う)に基づいて、各データチャンクまたはサンプルにタイムスタンプを割り当てます。ストリームは「アウトレット」を介して、サンプルごと(またはチャンクごと)にプッシュされます。
3. データ収集デバイスがデータストリームを「サブスクライブ(受信)」する - LSLを使用してデータを受信します。同一ネットワーク上の収集デバイスは、「インレット」を介して公開されたデータストリームを受信します。各インレットは、1つのアウトレットのみからストリームサンプルとメタデータを受信します。
4. データを保存する - データストリームを購読すると、好みのプログラミング言語の変数にデータを保存したり、LSLが提供するソフトウェア「LabRecorder」を使用して .xdf などの標準フォーマットに保存したりできます。
2.0 チュートリアルの概要
このチュートリアルでは、実験セットアップの例を取り上げ、PythonでLSLを使用して実装するために必要なステップとコードを案内します。Emotivヘッドセットを装着した2人のEEGデータを収集しながら、Pythonを使って音声を再生します。それぞれEmotivPROを実行している2台のコンピュータを使用しておのおののEEGデータを集め、それぞれ個別のアウトレットを介してLSLへストリーミング配信します。またPythonライブラリを使用してオーディオファイルを再生し、ファイルが開始されるたびにトリガーを同時に送信します。
手順:
1. EmotivPROを使用して、EEGデータ(および/またはモーション、接触品質、信号品質など)を含むLSLアウトレットを介してデータをストリーミング配信します。2. Pythonスクリプトを用いてオーディオトラックを再生し、同時に別のLSLからトリガーを送信します。LabRecorderを利用して、LSLインレットを介して3つすべてのデータストリームをキャプチャし保存します。

2.1 ステップ 1 - 設定とインストール
データを収集するには、サポートされているデータ計測デバイスが必要になります。
• すべてのEmotivのブレインウェアデバイスは、EmotivPROソフトウェアを介してLSLに接続できます。お使いのデバイスにEmotivPROをインストールします。LSLを使用するには、有効なEmotivPROライセンスが必要です。
次のコマンドを使用して、Python LSLライブラリをインストールします:
pip install pylslLabRecorder ソフトウェアをダウンロードします。これは、コマンドラインから、またはスタンドアロンのダウンロードファイルを使用して実行できる、シンプルで無料のアプリです。
この実験に向けて:Pythonを用いてオーディオ再生に必要なパッケージをインストールします。
pip install sounddevice soundfile
2.2 ステップ 3 - EmotivPROからLSLストリームを介してデータを送信する
アプリ右上にある「...」をクリックし、「Settings」(設定)に移動します。
「Lab Streaming Layer」セクションと「Outlet」サブセクションを見つけます。
配信したいすべてのデータタイプを選択します。
データフォーマットを選択します(32-bit float または 64-bit double)。
データをサンプルごとに送信するか、サンプルのチャンク(塊)ごとに送信するかを選択します。
「Start」をクリックして、LSLデータストリームの配信を開始します。
2.3 ステップ 4 - Pythonスクリプトを使用してオーディオ再生とトリガー送信を行う
以下のコードブロックをコピーしてpythonファイルに貼り付け、コンピュータに保存します。
再生したいオーディオファイル(できれば .wav ファイル)を用意し、変数
audio_filepathのパスをご自身のコンピュータ上にあるオーディオファイルのパスに変更して、スクリプトを編集します。コマンドプロンプト(ターミナル)を開いてコマンドラインを操作し、Pythonファイルが保存されているフォルダーに移動します。
python3 filename.pyと入力します。
• Pythonのインストール環境によっては、python3の代わりにpythonを使用する場合があります。
重要:/path/to/audio.wavの部分を、実験中に再生したいオーディオファイルの場所(パス)に書き換えてください。
""" LSL Example: Play audio and send a trigger marker <p>This script creates an LSL marker stream, waits for the user to<br>press ENTER, then plays an audio file and sends a marker that<br>can be synchronized with EEG data collected through LabRecorder.<br>"""</p> <p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p> <p>def wait_for_keypress():<br>print("Press ENTER to start audio playback and send an LSL marker.")<br>while True:<br>if input() == "":<br>break</p> <p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p> <pre><code>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.") </code></pre> <p>if <strong>name</strong> == "<strong>main</strong>":</p> <pre><code>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 )</code></pre><h2 dir="auto">2.4 ステップ 5 - LabRecorder を使用してすべてのLSLストリームのプレビューと保存を行う</h2><ol dir="auto"><li data-preset-tag="p"><p>LabRecorder を起動します</p></li><li data-preset-tag="p"><p><code>Update</code>(更新)ボタンを押します。利用可能なLSLストリームがストリームリストに表示されるはずです。<br>• 両方の EmotivPROs からのストリーム(通常は「Emotiv-DataStream」という名前)と、マーカーストリーム(「AudioMarkers」という名前)が表示されていることを確認します。</p></li><li data-preset-tag="p"><p><code>Browse</code>(参照)をクリックして、データを保存する場所を選択(およびその他のパラメータを設定)します。</p></li><li data-preset-tag="p"><p>すべてのストリームを選択し、<code>Record</code>(記録開始)を押して録音を開始します。</p></li></ol><h2 dir="auto">3.0 データの操作</h2><p dir="auto">LabRecorderは、すべてのストリームデータを含む XDFファイル(Extensible Data Format)を出力します。XDFファイルは複数のストリームで構成されており、各ストリームにはその中身(デバイス名、データ型、サンプリングレート、チャネルなど)を記述した異なるヘッダーが含まれています。以下のコードブロックを使用して XDFファイルを開き、いくつかの基本情報を表示させることができます。</p><p dir="auto"><strong>重要:</strong><code><strong>/path/to/your/file.xdf</strong></code><strong> を、お手元の LabRecorder XDF出力ファイルの正確なパスに書き換えてください。</strong></p><pre data-language="JSX"><code>import pyxdf </code></pre> <p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p> <h1>LSL出力ファイルへのパスをここに指定します。</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>XDFファイルをロード(読み込み)します。</h1> <p>streams, fileheader = pyxdf.load_xdf(data_path)</p> <p>print("XDF File Header:", fileheader)<br>print("Number of streams found:", len(streams))</p> <p>for i, stream in enumerate(streams):<br>print("\nStream", i + 1)<br>print("Stream Name:", stream["info"]["name"][0])<br>print("Stream Type:", stream["info"]["type"][0])<br>print("Number of Channels:", stream["info"]["channel_count"][0])</p> <pre><code>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"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 その他のリソース</h2><h4 dir="auto">公式ドキュメント</h4><ol dir="auto"><li data-preset-tag="p"><p>GitHub 上にある公式の README ファイルを含めた <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">オンラインドキュメント</a>をご確認ください。<a href="https://github.com/sccn/labstreaminglayer/" target="_blank"></a></p></li><li data-preset-tag="p"><p>追加リソース:<br>• Emotivのデバイスとサンプルスクリプトを使用してLSLを実行するための<a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">コード</a><br>• 便利な<a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">YouTubeでのLSLデモ</a><br>• 関連するすべてのライブラリが格納された<a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub リポジトリ</a><br>• サブモジュールやアプリを収集した<a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub リポジトリ</a></p></li><li data-preset-tag="p"><p>Hyperscanning 調査向けの <a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP 分析パイプライン</a></p></li></ol
""" LSL Example: Play audio and send a trigger marker <p>This script creates an LSL marker stream, waits for the user to<br>press ENTER, then plays an audio file and sends a marker that<br>can be synchronized with EEG data collected through LabRecorder.<br>"""</p> <p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p> <p>def wait_for_keypress():<br>print("Press ENTER to start audio playback and send an LSL marker.")<br>while True:<br>if input() == "":<br>break</p> <p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p> <pre><code>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.") </code></pre> <p>if <strong>name</strong> == "<strong>main</strong>":</p> <pre><code>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 )</code></pre><h2 dir="auto">2.4 ステップ 5 - LabRecorder を使用してすべてのLSLストリームのプレビューと保存を行う</h2><ol dir="auto"><li data-preset-tag="p"><p>LabRecorder を起動します</p></li><li data-preset-tag="p"><p><code>Update</code>(更新)ボタンを押します。利用可能なLSLストリームがストリームリストに表示されるはずです。<br>• 両方の EmotivPROs からのストリーム(通常は「Emotiv-DataStream」という名前)と、マーカーストリーム(「AudioMarkers」という名前)が表示されていることを確認します。</p></li><li data-preset-tag="p"><p><code>Browse</code>(参照)をクリックして、データを保存する場所を選択(およびその他のパラメータを設定)します。</p></li><li data-preset-tag="p"><p>すべてのストリームを選択し、<code>Record</code>(記録開始)を押して録音を開始します。</p></li></ol><h2 dir="auto">3.0 データの操作</h2><p dir="auto">LabRecorderは、すべてのストリームデータを含む XDFファイル(Extensible Data Format)を出力します。XDFファイルは複数のストリームで構成されており、各ストリームにはその中身(デバイス名、データ型、サンプリングレート、チャネルなど)を記述した異なるヘッダーが含まれています。以下のコードブロックを使用して XDFファイルを開き、いくつかの基本情報を表示させることができます。</p><p dir="auto"><strong>重要:</strong><code><strong>/path/to/your/file.xdf</strong></code><strong> を、お手元の LabRecorder XDF出力ファイルの正確なパスに書き換えてください。</strong></p><pre data-language="JSX"><code>import pyxdf </code></pre> <p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p> <h1>LSL出力ファイルへのパスをここに指定します。</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>XDFファイルをロード(読み込み)します。</h1> <p>streams, fileheader = pyxdf.load_xdf(data_path)</p> <p>print("XDF File Header:", fileheader)<br>print("Number of streams found:", len(streams))</p> <p>for i, stream in enumerate(streams):<br>print("\nStream", i + 1)<br>print("Stream Name:", stream["info"]["name"][0])<br>print("Stream Type:", stream["info"]["type"][0])<br>print("Number of Channels:", stream["info"]["channel_count"][0])</p> <pre><code>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"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 その他のリソース</h2><h4 dir="auto">公式ドキュメント</h4><ol dir="auto"><li data-preset-tag="p"><p>GitHub 上にある公式の README ファイルを含めた <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">オンラインドキュメント</a>をご確認ください。<a href="https://github.com/sccn/labstreaminglayer/" target="_blank"></a></p></li><li data-preset-tag="p"><p>追加リソース:<br>• Emotivのデバイスとサンプルスクリプトを使用してLSLを実行するための<a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">コード</a><br>• 便利な<a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">YouTubeでのLSLデモ</a><br>• 関連するすべてのライブラリが格納された<a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub リポジトリ</a><br>• サブモジュールやアプリを収集した<a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub リポジトリ</a></p></li><li data-preset-tag="p"><p>Hyperscanning 調査向けの <a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP 分析パイプライン</a></p></li></ol
""" LSL Example: Play audio and send a trigger marker <p>This script creates an LSL marker stream, waits for the user to<br>press ENTER, then plays an audio file and sends a marker that<br>can be synchronized with EEG data collected through LabRecorder.<br>"""</p> <p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p> <p>def wait_for_keypress():<br>print("Press ENTER to start audio playback and send an LSL marker.")<br>while True:<br>if input() == "":<br>break</p> <p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p> <pre><code>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.") </code></pre> <p>if <strong>name</strong> == "<strong>main</strong>":</p> <pre><code>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 )</code></pre><h2 dir="auto">2.4 ステップ 5 - LabRecorder を使用してすべてのLSLストリームのプレビューと保存を行う</h2><ol dir="auto"><li data-preset-tag="p"><p>LabRecorder を起動します</p></li><li data-preset-tag="p"><p><code>Update</code>(更新)ボタンを押します。利用可能なLSLストリームがストリームリストに表示されるはずです。<br>• 両方の EmotivPROs からのストリーム(通常は「Emotiv-DataStream」という名前)と、マーカーストリーム(「AudioMarkers」という名前)が表示されていることを確認します。</p></li><li data-preset-tag="p"><p><code>Browse</code>(参照)をクリックして、データを保存する場所を選択(およびその他のパラメータを設定)します。</p></li><li data-preset-tag="p"><p>すべてのストリームを選択し、<code>Record</code>(記録開始)を押して録音を開始します。</p></li></ol><h2 dir="auto">3.0 データの操作</h2><p dir="auto">LabRecorderは、すべてのストリームデータを含む XDFファイル(Extensible Data Format)を出力します。XDFファイルは複数のストリームで構成されており、各ストリームにはその中身(デバイス名、データ型、サンプリングレート、チャネルなど)を記述した異なるヘッダーが含まれています。以下のコードブロックを使用して XDFファイルを開き、いくつかの基本情報を表示させることができます。</p><p dir="auto"><strong>重要:</strong><code><strong>/path/to/your/file.xdf</strong></code><strong> を、お手元の LabRecorder XDF出力ファイルの正確なパスに書き換えてください。</strong></p><pre data-language="JSX"><code>import pyxdf </code></pre> <p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p> <h1>LSL出力ファイルへのパスをここに指定します。</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>XDFファイルをロード(読み込み)します。</h1> <p>streams, fileheader = pyxdf.load_xdf(data_path)</p> <p>print("XDF File Header:", fileheader)<br>print("Number of streams found:", len(streams))</p> <p>for i, stream in enumerate(streams):<br>print("\nStream", i + 1)<br>print("Stream Name:", stream["info"]["name"][0])<br>print("Stream Type:", stream["info"]["type"][0])<br>print("Number of Channels:", stream["info"]["channel_count"][0])</p> <pre><code>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"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 その他のリソース</h2><h4 dir="auto">公式ドキュメント</h4><ol dir="auto"><li data-preset-tag="p"><p>GitHub 上にある公式の README ファイルを含めた <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">オンラインドキュメント</a>をご確認ください。<a href="https://github.com/sccn/labstreaminglayer/" target="_blank"></a></p></li><li data-preset-tag="p"><p>追加リソース:<br>• Emotivのデバイスとサンプルスクリプトを使用してLSLを実行するための<a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">コード</a><br>• 便利な<a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">YouTubeでのLSLデモ</a><br>• 関連するすべてのライブラリが格納された<a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub リポジトリ</a><br>• サブモジュールやアプリを収集した<a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub リポジトリ</a></p></li><li data-preset-tag="p"><p>Hyperscanning 調査向けの <a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP 分析パイプライン</a></p></li></ol
ようこそ!このチュートリアルでは、PythonでLab Streaming Layer(LSL)を使用して、複数のデバイスから流入するEmotiv EEG(脳波)データを収集および同期する方法を学びます。本チュートリアルを進めるには、Pythonプログラミング言語の基本的な知識が必要となります。
学習内容
Lab Streaming Layer(LSL)とは何か、そしてなぜ研究者がそれを使用するのか
複数のEmotiv EEGデバイスから同期されたデータを収集する方法
収集したデータをインポートして検査する方法
1.1 LSLとは何か、何に役立つのか?
Lab Streaming Layer(LSL)は、さまざまなセンサーハードウェアから供給される神経データ、生理学的データ、および行動データのストリームを送信、受信、同期するために使用できるオープンソースツールボックスです。Emotiv EEGシステムのように、高機能で高精度、かつモバイル対応の脳・身体センサハードウェアデバイスの登場により、神経科学はラボから飛び出し、リアルタイムデータの世界へと移行しつつあります。EEGやMEGなどの脳測定はかつて研究室内に限定されていましたが、モバイルデバイスのおかげで、より自然な環境下で、複数の人々から同時にさまざまなデータを収集できるようになりました。
研究者は、同じ音楽を聴いている2人の間の生理学的同調性に関心を持つかもしれません。LSLを使用すれば、音の提示に同期した形で、2台のEEGヘッドセットから個別にデータを収集できます。
LSLのその他の使用イメージ:
実験中のイベントマーカーを継続しているEEGデータに追加する
1人の参加者の複数のデータソース(心拍数、EMG、EEGなど)の時間軸を合わせる
複数人の参加者のデータ(EEGハイパースキャニング研究など)の時間軸を合わせる
1.2 LSLの仕組みは?
Lab Streaming Layerは、複数のデバイス間で時系列データをリアルタイムにやり取りするためのプロトコルです。LSLは、Python、MATLAB、C++、Javaなどのプログラミング言語向けのオープンソースライブラリを使用することで実装できます。

その中核機能は、LSLのデータストリームを中心に展開されます:
1. 計測デバイスもしくはソフトウェアがデータを収集し、データストリームを作成する - EEG記録デバイス、視線追跡システム、モーションキャプチャシステム、心拍モニターなどから、メタデータ(サンプリングレート、データ形式、チャネル情報など)を含む生理学的データがLSLにストリーミング送信されます。PsychoPy等を使用した実験からのイベントマーカーも、LSLを用いてデータストリームとして送信できます。
2. データストリームがネットワーク上に「パブリッシュ(公開)」される - LSLを介してデータが送信される仕組みです。データストリームはネットワークに「ブロードキャスト」されます。公開されたストリームはネットワーク上で利用可能になり、同じネットワーク上の他のLSL対応デバイスから検出できるようになります。LSLは共通のクロック(ネットワークタイムプロトコルに従う)に基づいて、各データチャンクまたはサンプルにタイムスタンプを割り当てます。ストリームは「アウトレット」を介して、サンプルごと(またはチャンクごと)にプッシュされます。
3. データ収集デバイスがデータストリームを「サブスクライブ(受信)」する - LSLを使用してデータを受信します。同一ネットワーク上の収集デバイスは、「インレット」を介して公開されたデータストリームを受信します。各インレットは、1つのアウトレットのみからストリームサンプルとメタデータを受信します。
4. データを保存する - データストリームを購読すると、好みのプログラミング言語の変数にデータを保存したり、LSLが提供するソフトウェア「LabRecorder」を使用して .xdf などの標準フォーマットに保存したりできます。
2.0 チュートリアルの概要
このチュートリアルでは、実験セットアップの例を取り上げ、PythonでLSLを使用して実装するために必要なステップとコードを案内します。Emotivヘッドセットを装着した2人のEEGデータを収集しながら、Pythonを使って音声を再生します。それぞれEmotivPROを実行している2台のコンピュータを使用しておのおののEEGデータを集め、それぞれ個別のアウトレットを介してLSLへストリーミング配信します。またPythonライブラリを使用してオーディオファイルを再生し、ファイルが開始されるたびにトリガーを同時に送信します。
手順:
1. EmotivPROを使用して、EEGデータ(および/またはモーション、接触品質、信号品質など)を含むLSLアウトレットを介してデータをストリーミング配信します。2. Pythonスクリプトを用いてオーディオトラックを再生し、同時に別のLSLからトリガーを送信します。LabRecorderを利用して、LSLインレットを介して3つすべてのデータストリームをキャプチャし保存します。

2.1 ステップ 1 - 設定とインストール
データを収集するには、サポートされているデータ計測デバイスが必要になります。
• すべてのEmotivのブレインウェアデバイスは、EmotivPROソフトウェアを介してLSLに接続できます。お使いのデバイスにEmotivPROをインストールします。LSLを使用するには、有効なEmotivPROライセンスが必要です。
次のコマンドを使用して、Python LSLライブラリをインストールします:
pip install pylslLabRecorder ソフトウェアをダウンロードします。これは、コマンドラインから、またはスタンドアロンのダウンロードファイルを使用して実行できる、シンプルで無料のアプリです。
この実験に向けて:Pythonを用いてオーディオ再生に必要なパッケージをインストールします。
pip install sounddevice soundfile
2.2 ステップ 3 - EmotivPROからLSLストリームを介してデータを送信する
アプリ右上にある「...」をクリックし、「Settings」(設定)に移動します。
「Lab Streaming Layer」セクションと「Outlet」サブセクションを見つけます。
配信したいすべてのデータタイプを選択します。
データフォーマットを選択します(32-bit float または 64-bit double)。
データをサンプルごとに送信するか、サンプルのチャンク(塊)ごとに送信するかを選択します。
「Start」をクリックして、LSLデータストリームの配信を開始します。
2.3 ステップ 4 - Pythonスクリプトを使用してオーディオ再生とトリガー送信を行う
以下のコードブロックをコピーしてpythonファイルに貼り付け、コンピュータに保存します。
再生したいオーディオファイル(できれば .wav ファイル)を用意し、変数
audio_filepathのパスをご自身のコンピュータ上にあるオーディオファイルのパスに変更して、スクリプトを編集します。コマンドプロンプト(ターミナル)を開いてコマンドラインを操作し、Pythonファイルが保存されているフォルダーに移動します。
python3 filename.pyと入力します。
• Pythonのインストール環境によっては、python3の代わりにpythonを使用する場合があります。
重要:/path/to/audio.wavの部分を、実験中に再生したいオーディオファイルの場所(パス)に書き換えてください。
""" LSL Example: Play audio and send a trigger marker <p>This script creates an LSL marker stream, waits for the user to<br>press ENTER, then plays an audio file and sends a marker that<br>can be synchronized with EEG data collected through LabRecorder.<br>"""</p> <p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p> <p>def wait_for_keypress():<br>print("Press ENTER to start audio playback and send an LSL marker.")<br>while True:<br>if input() == "":<br>break</p> <p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p> <pre><code>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.") </code></pre> <p>if <strong>name</strong> == "<strong>main</strong>":</p> <pre><code>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 )</code></pre><h2 dir="auto">2.4 ステップ 5 - LabRecorder を使用してすべてのLSLストリームのプレビューと保存を行う</h2><ol dir="auto"><li data-preset-tag="p"><p>LabRecorder を起動します</p></li><li data-preset-tag="p"><p><code>Update</code>(更新)ボタンを押します。利用可能なLSLストリームがストリームリストに表示されるはずです。<br>• 両方の EmotivPROs からのストリーム(通常は「Emotiv-DataStream」という名前)と、マーカーストリーム(「AudioMarkers」という名前)が表示されていることを確認します。</p></li><li data-preset-tag="p"><p><code>Browse</code>(参照)をクリックして、データを保存する場所を選択(およびその他のパラメータを設定)します。</p></li><li data-preset-tag="p"><p>すべてのストリームを選択し、<code>Record</code>(記録開始)を押して録音を開始します。</p></li></ol><h2 dir="auto">3.0 データの操作</h2><p dir="auto">LabRecorderは、すべてのストリームデータを含む XDFファイル(Extensible Data Format)を出力します。XDFファイルは複数のストリームで構成されており、各ストリームにはその中身(デバイス名、データ型、サンプリングレート、チャネルなど)を記述した異なるヘッダーが含まれています。以下のコードブロックを使用して XDFファイルを開き、いくつかの基本情報を表示させることができます。</p><p dir="auto"><strong>重要:</strong><code><strong>/path/to/your/file.xdf</strong></code><strong> を、お手元の LabRecorder XDF出力ファイルの正確なパスに書き換えてください。</strong></p><pre data-language="JSX"><code>import pyxdf </code></pre> <p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p> <h1>LSL出力ファイルへのパスをここに指定します。</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>XDFファイルをロード(読み込み)します。</h1> <p>streams, fileheader = pyxdf.load_xdf(data_path)</p> <p>print("XDF File Header:", fileheader)<br>print("Number of streams found:", len(streams))</p> <p>for i, stream in enumerate(streams):<br>print("\nStream", i + 1)<br>print("Stream Name:", stream["info"]["name"][0])<br>print("Stream Type:", stream["info"]["type"][0])<br>print("Number of Channels:", stream["info"]["channel_count"][0])</p> <pre><code>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"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 その他のリソース</h2><h4 dir="auto">公式ドキュメント</h4><ol dir="auto"><li data-preset-tag="p"><p>GitHub 上にある公式の README ファイルを含めた <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">オンラインドキュメント</a>をご確認ください。<a href="https://github.com/sccn/labstreaminglayer/" target="_blank"></a></p></li><li data-preset-tag="p"><p>追加リソース:<br>• Emotivのデバイスとサンプルスクリプトを使用してLSLを実行するための<a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">コード</a><br>• 便利な<a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">YouTubeでのLSLデモ</a><br>• 関連するすべてのライブラリが格納された<a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub リポジトリ</a><br>• サブモジュールやアプリを収集した<a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub リポジトリ</a></p></li><li data-preset-tag="p"><p>Hyperscanning 調査向けの <a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP 分析パイプライン</a></p></li></ol
ようこそ!このチュートリアルでは、PythonでLab Streaming Layer(LSL)を使用して、複数のデバイスから流入するEmotiv EEG(脳波)データを収集および同期する方法を学びます。本チュートリアルを進めるには、Pythonプログラミング言語の基本的な知識が必要となります。
学習内容
Lab Streaming Layer(LSL)とは何か、そしてなぜ研究者がそれを使用するのか
複数のEmotiv EEGデバイスから同期されたデータを収集する方法
収集したデータをインポートして検査する方法
1.1 LSLとは何か、何に役立つのか?
Lab Streaming Layer(LSL)は、さまざまなセンサーハードウェアから供給される神経データ、生理学的データ、および行動データのストリームを送信、受信、同期するために使用できるオープンソースツールボックスです。Emotiv EEGシステムのように、高機能で高精度、かつモバイル対応の脳・身体センサハードウェアデバイスの登場により、神経科学はラボから飛び出し、リアルタイムデータの世界へと移行しつつあります。EEGやMEGなどの脳測定はかつて研究室内に限定されていましたが、モバイルデバイスのおかげで、より自然な環境下で、複数の人々から同時にさまざまなデータを収集できるようになりました。
研究者は、同じ音楽を聴いている2人の間の生理学的同調性に関心を持つかもしれません。LSLを使用すれば、音の提示に同期した形で、2台のEEGヘッドセットから個別にデータを収集できます。
LSLのその他の使用イメージ:
実験中のイベントマーカーを継続しているEEGデータに追加する
1人の参加者の複数のデータソース(心拍数、EMG、EEGなど)の時間軸を合わせる
複数人の参加者のデータ(EEGハイパースキャニング研究など)の時間軸を合わせる
1.2 LSLの仕組みは?
Lab Streaming Layerは、複数のデバイス間で時系列データをリアルタイムにやり取りするためのプロトコルです。LSLは、Python、MATLAB、C++、Javaなどのプログラミング言語向けのオープンソースライブラリを使用することで実装できます。

その中核機能は、LSLのデータストリームを中心に展開されます:
1. 計測デバイスもしくはソフトウェアがデータを収集し、データストリームを作成する - EEG記録デバイス、視線追跡システム、モーションキャプチャシステム、心拍モニターなどから、メタデータ(サンプリングレート、データ形式、チャネル情報など)を含む生理学的データがLSLにストリーミング送信されます。PsychoPy等を使用した実験からのイベントマーカーも、LSLを用いてデータストリームとして送信できます。
2. データストリームがネットワーク上に「パブリッシュ(公開)」される - LSLを介してデータが送信される仕組みです。データストリームはネットワークに「ブロードキャスト」されます。公開されたストリームはネットワーク上で利用可能になり、同じネットワーク上の他のLSL対応デバイスから検出できるようになります。LSLは共通のクロック(ネットワークタイムプロトコルに従う)に基づいて、各データチャンクまたはサンプルにタイムスタンプを割り当てます。ストリームは「アウトレット」を介して、サンプルごと(またはチャンクごと)にプッシュされます。
3. データ収集デバイスがデータストリームを「サブスクライブ(受信)」する - LSLを使用してデータを受信します。同一ネットワーク上の収集デバイスは、「インレット」を介して公開されたデータストリームを受信します。各インレットは、1つのアウトレットのみからストリームサンプルとメタデータを受信します。
4. データを保存する - データストリームを購読すると、好みのプログラミング言語の変数にデータを保存したり、LSLが提供するソフトウェア「LabRecorder」を使用して .xdf などの標準フォーマットに保存したりできます。
2.0 チュートリアルの概要
このチュートリアルでは、実験セットアップの例を取り上げ、PythonでLSLを使用して実装するために必要なステップとコードを案内します。Emotivヘッドセットを装着した2人のEEGデータを収集しながら、Pythonを使って音声を再生します。それぞれEmotivPROを実行している2台のコンピュータを使用しておのおののEEGデータを集め、それぞれ個別のアウトレットを介してLSLへストリーミング配信します。またPythonライブラリを使用してオーディオファイルを再生し、ファイルが開始されるたびにトリガーを同時に送信します。
手順:
1. EmotivPROを使用して、EEGデータ(および/またはモーション、接触品質、信号品質など)を含むLSLアウトレットを介してデータをストリーミング配信します。2. Pythonスクリプトを用いてオーディオトラックを再生し、同時に別のLSLからトリガーを送信します。LabRecorderを利用して、LSLインレットを介して3つすべてのデータストリームをキャプチャし保存します。

2.1 ステップ 1 - 設定とインストール
データを収集するには、サポートされているデータ計測デバイスが必要になります。
• すべてのEmotivのブレインウェアデバイスは、EmotivPROソフトウェアを介してLSLに接続できます。お使いのデバイスにEmotivPROをインストールします。LSLを使用するには、有効なEmotivPROライセンスが必要です。
次のコマンドを使用して、Python LSLライブラリをインストールします:
pip install pylslLabRecorder ソフトウェアをダウンロードします。これは、コマンドラインから、またはスタンドアロンのダウンロードファイルを使用して実行できる、シンプルで無料のアプリです。
この実験に向けて:Pythonを用いてオーディオ再生に必要なパッケージをインストールします。
pip install sounddevice soundfile
2.2 ステップ 3 - EmotivPROからLSLストリームを介してデータを送信する
アプリ右上にある「...」をクリックし、「Settings」(設定)に移動します。
「Lab Streaming Layer」セクションと「Outlet」サブセクションを見つけます。
配信したいすべてのデータタイプを選択します。
データフォーマットを選択します(32-bit float または 64-bit double)。
データをサンプルごとに送信するか、サンプルのチャンク(塊)ごとに送信するかを選択します。
「Start」をクリックして、LSLデータストリームの配信を開始します。
2.3 ステップ 4 - Pythonスクリプトを使用してオーディオ再生とトリガー送信を行う
以下のコードブロックをコピーしてpythonファイルに貼り付け、コンピュータに保存します。
再生したいオーディオファイル(できれば .wav ファイル)を用意し、変数
audio_filepathのパスをご自身のコンピュータ上にあるオーディオファイルのパスに変更して、スクリプトを編集します。コマンドプロンプト(ターミナル)を開いてコマンドラインを操作し、Pythonファイルが保存されているフォルダーに移動します。
python3 filename.pyと入力します。
• Pythonのインストール環境によっては、python3の代わりにpythonを使用する場合があります。
重要:/path/to/audio.wavの部分を、実験中に再生したいオーディオファイルの場所(パス)に書き換えてください。
""" LSL Example: Play audio and send a trigger marker <p>This script creates an LSL marker stream, waits for the user to<br>press ENTER, then plays an audio file and sends a marker that<br>can be synchronized with EEG data collected through LabRecorder.<br>"""</p> <p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p> <p>def wait_for_keypress():<br>print("Press ENTER to start audio playback and send an LSL marker.")<br>while True:<br>if input() == "":<br>break</p> <p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p> <pre><code>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.") </code></pre> <p>if <strong>name</strong> == "<strong>main</strong>":</p> <pre><code>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 )</code></pre><h2 dir="auto">2.4 ステップ 5 - LabRecorder を使用してすべてのLSLストリームのプレビューと保存を行う</h2><ol dir="auto"><li data-preset-tag="p"><p>LabRecorder を起動します</p></li><li data-preset-tag="p"><p><code>Update</code>(更新)ボタンを押します。利用可能なLSLストリームがストリームリストに表示されるはずです。<br>• 両方の EmotivPROs からのストリーム(通常は「Emotiv-DataStream」という名前)と、マーカーストリーム(「AudioMarkers」という名前)が表示されていることを確認します。</p></li><li data-preset-tag="p"><p><code>Browse</code>(参照)をクリックして、データを保存する場所を選択(およびその他のパラメータを設定)します。</p></li><li data-preset-tag="p"><p>すべてのストリームを選択し、<code>Record</code>(記録開始)を押して録音を開始します。</p></li></ol><h2 dir="auto">3.0 データの操作</h2><p dir="auto">LabRecorderは、すべてのストリームデータを含む XDFファイル(Extensible Data Format)を出力します。XDFファイルは複数のストリームで構成されており、各ストリームにはその中身(デバイス名、データ型、サンプリングレート、チャネルなど)を記述した異なるヘッダーが含まれています。以下のコードブロックを使用して XDFファイルを開き、いくつかの基本情報を表示させることができます。</p><p dir="auto"><strong>重要:</strong><code><strong>/path/to/your/file.xdf</strong></code><strong> を、お手元の LabRecorder XDF出力ファイルの正確なパスに書き換えてください。</strong></p><pre data-language="JSX"><code>import pyxdf </code></pre> <p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p> <h1>LSL出力ファイルへのパスをここに指定します。</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>XDFファイルをロード(読み込み)します。</h1> <p>streams, fileheader = pyxdf.load_xdf(data_path)</p> <p>print("XDF File Header:", fileheader)<br>print("Number of streams found:", len(streams))</p> <p>for i, stream in enumerate(streams):<br>print("\nStream", i + 1)<br>print("Stream Name:", stream["info"]["name"][0])<br>print("Stream Type:", stream["info"]["type"][0])<br>print("Number of Channels:", stream["info"]["channel_count"][0])</p> <pre><code>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"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 その他のリソース</h2><h4 dir="auto">公式ドキュメント</h4><ol dir="auto"><li data-preset-tag="p"><p>GitHub 上にある公式の README ファイルを含めた <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">オンラインドキュメント</a>をご確認ください。<a href="https://github.com/sccn/labstreaminglayer/" target="_blank"></a></p></li><li data-preset-tag="p"><p>追加リソース:<br>• Emotivのデバイスとサンプルスクリプトを使用してLSLを実行するための<a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">コード</a><br>• 便利な<a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">YouTubeでのLSLデモ</a><br>• 関連するすべてのライブラリが格納された<a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub リポジトリ</a><br>• サブモジュールやアプリを収集した<a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub リポジトリ</a></p></li><li data-preset-tag="p"><p>Hyperscanning 調査向けの <a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP 分析パイプライン</a></p></li></ol

読むのを続ける