senselab 0.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. senselab/__init__.py +34 -0
  2. senselab/agentic_interface/__init__.py +1 -0
  3. senselab/agentic_interface/doc.md +57 -0
  4. senselab/agentic_interface/launcher.py +18 -0
  5. senselab/agentic_interface/nbi-config.json +71 -0
  6. senselab/agentic_interface/senselab_agent/__init__.py +3 -0
  7. senselab/agentic_interface/senselab_agent/extension.json +3 -0
  8. senselab/agentic_interface/senselab_agent/extension.py +2017 -0
  9. senselab/agentic_interface/senselab_agent/install.py +114 -0
  10. senselab/agentic_interface/senselab_agent/notebook_share_tool.py +133 -0
  11. senselab/audio/__init__.py +1 -0
  12. senselab/audio/data_structures/__init__.py +4 -0
  13. senselab/audio/data_structures/audio.py +446 -0
  14. senselab/audio/data_structures/audio_classification_result.py +116 -0
  15. senselab/audio/tasks/__init__.py +1 -0
  16. senselab/audio/tasks/classification/__init__.py +3 -0
  17. senselab/audio/tasks/classification/api.py +42 -0
  18. senselab/audio/tasks/classification/doc.md +40 -0
  19. senselab/audio/tasks/classification/huggingface.py +158 -0
  20. senselab/audio/tasks/classification/speech_emotion_recognition/__init__.py +3 -0
  21. senselab/audio/tasks/classification/speech_emotion_recognition/api.py +114 -0
  22. senselab/audio/tasks/classification/speech_emotion_recognition/doc.md +74 -0
  23. senselab/audio/tasks/data_augmentation/__init__.py +3 -0
  24. senselab/audio/tasks/data_augmentation/api.py +92 -0
  25. senselab/audio/tasks/data_augmentation/audiomentations.py +74 -0
  26. senselab/audio/tasks/data_augmentation/doc.md +25 -0
  27. senselab/audio/tasks/data_augmentation/torch_audiomentations.py +58 -0
  28. senselab/audio/tasks/features_extraction/__init__.py +3 -0
  29. senselab/audio/tasks/features_extraction/api.py +486 -0
  30. senselab/audio/tasks/features_extraction/doc.md +98 -0
  31. senselab/audio/tasks/features_extraction/opensmile.py +113 -0
  32. senselab/audio/tasks/features_extraction/praat_parselmouth.py +1472 -0
  33. senselab/audio/tasks/features_extraction/torchaudio.py +367 -0
  34. senselab/audio/tasks/features_extraction/torchaudio_squim.py +108 -0
  35. senselab/audio/tasks/forced_alignment/__init__.py +3 -0
  36. senselab/audio/tasks/forced_alignment/constants.py +45 -0
  37. senselab/audio/tasks/forced_alignment/data_structures.py +96 -0
  38. senselab/audio/tasks/forced_alignment/doc.md +125 -0
  39. senselab/audio/tasks/forced_alignment/evaluation.py +45 -0
  40. senselab/audio/tasks/forced_alignment/forced_alignment.py +661 -0
  41. senselab/audio/tasks/input_output/__init__.py +8 -0
  42. senselab/audio/tasks/input_output/utils.py +170 -0
  43. senselab/audio/tasks/plotting/__init__.py +3 -0
  44. senselab/audio/tasks/plotting/plotting.py +512 -0
  45. senselab/audio/tasks/preprocessing/__init__.py +3 -0
  46. senselab/audio/tasks/preprocessing/preprocessing.py +443 -0
  47. senselab/audio/tasks/quality_control/__init__.py +26 -0
  48. senselab/audio/tasks/quality_control/checks.py +860 -0
  49. senselab/audio/tasks/quality_control/evaluate.py +351 -0
  50. senselab/audio/tasks/quality_control/format.py +120 -0
  51. senselab/audio/tasks/quality_control/metrics.py +773 -0
  52. senselab/audio/tasks/quality_control/quality_control.py +115 -0
  53. senselab/audio/tasks/quality_control/review.py +361 -0
  54. senselab/audio/tasks/quality_control/taxonomies/__init__.py +13 -0
  55. senselab/audio/tasks/quality_control/taxonomies/bioacoustic.py +49 -0
  56. senselab/audio/tasks/quality_control/taxonomies/bridge2ai_voice.py +269 -0
  57. senselab/audio/tasks/quality_control/taxonomy.py +174 -0
  58. senselab/audio/tasks/speaker_diarization/__init__.py +3 -0
  59. senselab/audio/tasks/speaker_diarization/api.py +92 -0
  60. senselab/audio/tasks/speaker_diarization/doc.md +45 -0
  61. senselab/audio/tasks/speaker_diarization/nemo_diarization_worker.py +83 -0
  62. senselab/audio/tasks/speaker_diarization/nvidia.py +124 -0
  63. senselab/audio/tasks/speaker_diarization/pyannote.py +192 -0
  64. senselab/audio/tasks/speaker_diarization_evaluation/__init__.py +3 -0
  65. senselab/audio/tasks/speaker_diarization_evaluation/utils.py +71 -0
  66. senselab/audio/tasks/speaker_embeddings/__init__.py +3 -0
  67. senselab/audio/tasks/speaker_embeddings/api.py +83 -0
  68. senselab/audio/tasks/speaker_embeddings/doc.md +29 -0
  69. senselab/audio/tasks/speaker_embeddings/speechbrain.py +127 -0
  70. senselab/audio/tasks/speaker_verification/__init__.py +3 -0
  71. senselab/audio/tasks/speaker_verification/doc.md +60 -0
  72. senselab/audio/tasks/speaker_verification/speaker_verification.py +63 -0
  73. senselab/audio/tasks/speech_enhancement/__init__.py +3 -0
  74. senselab/audio/tasks/speech_enhancement/api.py +34 -0
  75. senselab/audio/tasks/speech_enhancement/doc.md +26 -0
  76. senselab/audio/tasks/speech_enhancement/speechbrain.py +149 -0
  77. senselab/audio/tasks/speech_to_text/__init__.py +3 -0
  78. senselab/audio/tasks/speech_to_text/api.py +94 -0
  79. senselab/audio/tasks/speech_to_text/doc.md +77 -0
  80. senselab/audio/tasks/speech_to_text/huggingface.py +237 -0
  81. senselab/audio/tasks/speech_to_text_evaluation/__init__.py +3 -0
  82. senselab/audio/tasks/speech_to_text_evaluation/doc.md +107 -0
  83. senselab/audio/tasks/speech_to_text_evaluation/utils.py +119 -0
  84. senselab/audio/tasks/ssl_embeddings/__init__.py +3 -0
  85. senselab/audio/tasks/ssl_embeddings/api.py +48 -0
  86. senselab/audio/tasks/ssl_embeddings/self_supervised_features.py +125 -0
  87. senselab/audio/tasks/text_to_speech/__init__.py +3 -0
  88. senselab/audio/tasks/text_to_speech/api.py +79 -0
  89. senselab/audio/tasks/text_to_speech/coqui.py +126 -0
  90. senselab/audio/tasks/text_to_speech/doc.md +60 -0
  91. senselab/audio/tasks/text_to_speech/huggingface.py +83 -0
  92. senselab/audio/tasks/voice_activity_detection/__init__.py +3 -0
  93. senselab/audio/tasks/voice_activity_detection/api.py +99 -0
  94. senselab/audio/tasks/voice_activity_detection/doc.md +46 -0
  95. senselab/audio/tasks/voice_cloning/__init__.py +3 -0
  96. senselab/audio/tasks/voice_cloning/api.py +74 -0
  97. senselab/audio/tasks/voice_cloning/coqui.py +132 -0
  98. senselab/audio/tasks/voice_cloning/doc.md +34 -0
  99. senselab/audio/tasks/voice_cloning/sparc.py +120 -0
  100. senselab/audio/workflows/__init__.py +3 -0
  101. senselab/audio/workflows/explore_conversation.py +184 -0
  102. senselab/audio/workflows/health_measurements/__init__.py +1 -0
  103. senselab/audio/workflows/health_measurements/doc.md +9 -0
  104. senselab/audio/workflows/health_measurements/extract_health_measurements.py +126 -0
  105. senselab/text/.gitkeep +0 -0
  106. senselab/text/__init__.py +1 -0
  107. senselab/text/tasks/__init__.py +1 -0
  108. senselab/text/tasks/embeddings_extraction/__init__.py +3 -0
  109. senselab/text/tasks/embeddings_extraction/api.py +29 -0
  110. senselab/text/tasks/embeddings_extraction/huggingface.py +116 -0
  111. senselab/text/tasks/embeddings_extraction/sentence_transformers.py +84 -0
  112. senselab/utils/__init__.py +1 -0
  113. senselab/utils/config.json +16 -0
  114. senselab/utils/config.py +17 -0
  115. senselab/utils/constants.py +5 -0
  116. senselab/utils/data_structures/__init__.py +30 -0
  117. senselab/utils/data_structures/dataset.py +442 -0
  118. senselab/utils/data_structures/device.py +148 -0
  119. senselab/utils/data_structures/docker.py +48 -0
  120. senselab/utils/data_structures/file.py +235 -0
  121. senselab/utils/data_structures/language.py +114 -0
  122. senselab/utils/data_structures/logging.py +20 -0
  123. senselab/utils/data_structures/model.py +260 -0
  124. senselab/utils/data_structures/script_line.py +280 -0
  125. senselab/utils/data_structures/talk_bank_helpers.py +65 -0
  126. senselab/utils/tasks/__init__.py +1 -0
  127. senselab/utils/tasks/batching.py +22 -0
  128. senselab/utils/tasks/cca_cka.py +194 -0
  129. senselab/utils/tasks/cosine_similarity.py +46 -0
  130. senselab/utils/tasks/cross_correlation.py +52 -0
  131. senselab/utils/tasks/dimensionality_reduction.py +158 -0
  132. senselab/utils/tasks/dimensionality_reduction_table.md +7 -0
  133. senselab/utils/tasks/eer.py +84 -0
  134. senselab/utils/tasks/input_output.py +188 -0
  135. senselab/utils/tasks/plotting.py +148 -0
  136. senselab/utils/tasks/pooling.py +69 -0
  137. senselab/video/.gitkeep +0 -0
  138. senselab/video/__init__.py +1 -0
  139. senselab/video/data_structures/__init__.py +11 -0
  140. senselab/video/data_structures/pose.py +162 -0
  141. senselab/video/data_structures/video.py +195 -0
  142. senselab/video/tasks/__init__.py +1 -0
  143. senselab/video/tasks/input_output.py +56 -0
  144. senselab/video/tasks/pose_estimation/__init__.py +3 -0
  145. senselab/video/tasks/pose_estimation/api.py +78 -0
  146. senselab/video/tasks/pose_estimation/doc.md +44 -0
  147. senselab/video/tasks/pose_estimation/estimate.py +398 -0
  148. senselab/video/tasks/pose_estimation/mp_pose_worker.py +42 -0
  149. senselab/video/tasks/pose_estimation/mp_visualization_worker.py +105 -0
  150. senselab/video/tasks/pose_estimation/utils.py +180 -0
  151. senselab/video/tasks/pose_estimation/visualization.py +245 -0
  152. senselab-0.0.0.dist-info/METADATA +389 -0
  153. senselab-0.0.0.dist-info/RECORD +156 -0
  154. senselab-0.0.0.dist-info/WHEEL +4 -0
  155. senselab-0.0.0.dist-info/entry_points.txt +3 -0
  156. senselab-0.0.0.dist-info/licenses/LICENSE.md +147 -0
senselab/__init__.py ADDED
@@ -0,0 +1,34 @@
1
+ """.. include:: ../../README.md""" # noqa: D415
2
+
3
+ import asyncio
4
+ import platform
5
+ from multiprocessing import set_start_method
6
+
7
+ import nest_asyncio
8
+
9
+ # Raise error on incompatible macOS architecture
10
+ if platform.system() == "Darwin" and platform.machine() != "arm64":
11
+ raise RuntimeError(
12
+ "Error: This package requires an ARM64 architecture on macOS "
13
+ "since PyTorch 2.2.2+ does not support x86-64 on macOS."
14
+ )
15
+
16
+
17
+ # Conditionally apply nest_asyncio to avoid uvloop conflict
18
+ def safe_apply_nest_asyncio() -> None:
19
+ """Apply nest_asyncio to avoid uvloop conflict."""
20
+ try:
21
+ loop = asyncio.get_event_loop()
22
+ if "uvloop" not in str(type(loop)):
23
+ nest_asyncio.apply()
24
+ except Exception as e:
25
+ print(f"nest_asyncio not applied: {e}")
26
+
27
+
28
+ safe_apply_nest_asyncio()
29
+
30
+ # Ensure multiprocessing start method is 'spawn'
31
+ try:
32
+ set_start_method("spawn", force=True)
33
+ except RuntimeError:
34
+ pass # Method already set
@@ -0,0 +1 @@
1
+ """.. include:: ./doc.md""" # noqa: D415
@@ -0,0 +1,57 @@
1
+ # Agentic Interface for senselab
2
+
3
+ <button class="tutorial-button" onclick="window.location.href='https://github.com/sensein/senselab/blob/main/tutorials/senselab-ai/senselab_ai_intro.ipynb'">Getting started</button>
4
+
5
+ The `agentic_interface` submodule provides a flexible, user-friendly bridge between natural language and code, enabling users to interact with senselab's AI agent for scientific coding, data analysis, and reproducible research—even without strong technical skills.
6
+
7
+ ![alt text](<https://github.com/sensein/senselab/blob/main/tutorials/senselab-ai/resources/Screenshot 2025-09-02 at 8.52.07 PM.png>)
8
+
9
+ ---
10
+
11
+ ### Motivation
12
+
13
+ The goal is to **lower the entry barrier for non-programmers** while keeping workflows transparent and reproducible for technical users. Many potential users of senseLab (e.g., clinicians, clinical researchers, students from non-technical domains) could benefit from audio data analysis but lack the Python expertise required today.
14
+
15
+ `agentic_interface` aims to:
16
+
17
+ * Enable **interactive exploration and analysis** of audio datasets through natural-language interaction.
18
+ * **Generate reproducible code** alongside the analysis, so that results can be shared, rerun, and extended.
19
+ * Integrate seamlessly with existing senselab functionality without adding setup complexity.
20
+
21
+ In short: make audio analysis in senseLab **as simple as asking questions**, while still producing transparent, reproducible workflows.
22
+
23
+ ---
24
+
25
+ ### Related work & alternative tools we evaluated
26
+
27
+ We reviewed several existing tools that inspired this direction but also highlighted limitations that `agentic_interface` aims to overcome:
28
+
29
+ #### 1. **Jupyter AI**
30
+
31
+ * Reference: [Jupyter AI](https://jupyter-ai.readthedocs.io/en/latest/index.html)
32
+ * Strengths: Side-chat within Jupyter notebooks for natural-language queries.
33
+ * Limitation: Does **not yet support MCP server integration**, which is key to exposing senseLab features as tools and enabling autonomous analysis.
34
+
35
+ #### 2. **PretzelAI**
36
+
37
+ * Reference: [PretzelAI GitHub](https://github.com/pretzelai/pretzelai?tab=readme-ov-file)
38
+ * Strengths: Chat interface, inline prompting, polished UI.
39
+ * Limitation: Also lacks **MCP server integration**, making full tool-driven workflows harder.
40
+
41
+ #### 3. **Toolchain Integration via MCP**
42
+
43
+ * Workflow idea: Run [jupyter-mcp-server](https://jupyter-mcp-server.datalayer.tech/jupyter/) to control a notebook, connect MCP clients like Claude Desktop, Cline, or [LM Studio](https://lmstudio.ai/), and request analyses.
44
+ * Tested: Works in principle.
45
+ * Limitations:
46
+
47
+ * Requires installing & launching multiple tools (high setup overhead for non-technical users).
48
+ * Without a dedicated MCP server exposing senselab tools/docs, the LLM often gets confused about available functions.
49
+ * Relies on external LLM usage credits, which can be restrictive.
50
+
51
+ #### 4. **Notebook Intelligence**
52
+
53
+ * Reference: [notebook-intelligence](https://github.com/notebook-intelligence/notebook-intelligence)
54
+ * Strengths: Easy install, integrates chat and inline commands into JupyterLab, supports many LLMs (including local models like Ollama), and supports MCP servers (remote only for now).
55
+ * Limitations:
56
+ * Cannot enforce ReAct behaviors like consulting senseLab docs first, executing cells step-by-step, or test-driven coding ([issue #63](https://github.com/notebook-intelligence/notebook-intelligence/issues/63#issuecomment-3245071828)).
57
+ * This is the one we currently use under the hood for our implementation.
@@ -0,0 +1,18 @@
1
+ """This is the launcher for the AI Agent extension."""
2
+
3
+ import subprocess
4
+ import sys
5
+
6
+ from .senselab_agent.install import ensure_installed
7
+
8
+
9
+ def senselab_ai() -> None:
10
+ """Launch the senselab AI agent.
11
+
12
+ Ensures the AI Agent extension is installed and ready to use.
13
+ Then, launches Jupyter Lab with the appropriate arguments.
14
+ """
15
+ # Install the example AI Agent extension
16
+ ensure_installed()
17
+ # pass through args to jupyter
18
+ sys.exit(subprocess.call(["jupyter", "lab", *sys.argv[1:]]))
@@ -0,0 +1,71 @@
1
+ {
2
+ "chat_model": {
3
+ "provider": "openai-compatible",
4
+ "model": "openai-compatible-chat-model",
5
+ "properties": [
6
+ {
7
+ "id": "api_key",
8
+ "name": "API key",
9
+ "description": "API key",
10
+ "value": "",
11
+ "optional": false
12
+ },
13
+ {
14
+ "id": "model_id",
15
+ "name": "Model",
16
+ "description": "Model (must support streaming)",
17
+ "value": "gpt-4o",
18
+ "optional": false
19
+ },
20
+ {
21
+ "id": "base_url",
22
+ "name": "Base URL",
23
+ "description": "Base URL",
24
+ "value": "",
25
+ "optional": true
26
+ },
27
+ {
28
+ "id": "context_window",
29
+ "name": "Context window",
30
+ "description": "Context window length",
31
+ "value": "",
32
+ "optional": true
33
+ }
34
+ ]
35
+ },
36
+ "inline_completion_model": {
37
+ "provider": "openai-compatible",
38
+ "model": "openai-compatible-inline-completion-model",
39
+ "properties": [
40
+ {
41
+ "id": "api_key",
42
+ "name": "API key",
43
+ "description": "API key",
44
+ "value": "sk-",
45
+ "optional": false
46
+ },
47
+ {
48
+ "id": "model_id",
49
+ "name": "Model",
50
+ "description": "Model",
51
+ "value": "gpt-4o",
52
+ "optional": false
53
+ },
54
+ {
55
+ "id": "base_url",
56
+ "name": "Base URL",
57
+ "description": "Base URL",
58
+ "value": "",
59
+ "optional": true
60
+ },
61
+ {
62
+ "id": "context_window",
63
+ "name": "Context window",
64
+ "description": "Context window length",
65
+ "value": "",
66
+ "optional": true
67
+ }
68
+ ]
69
+ },
70
+ "store_github_access_token": false
71
+ }
@@ -0,0 +1,3 @@
1
+ """This is the senselab AI agentic interface."""
2
+
3
+ from .extension import AIAgentExtension
@@ -0,0 +1,3 @@
1
+ {
2
+ "class": "senselab.agentic_interface.senselab_agent.AIAgentExtension"
3
+ }