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.
- senselab/__init__.py +34 -0
- senselab/agentic_interface/__init__.py +1 -0
- senselab/agentic_interface/doc.md +57 -0
- senselab/agentic_interface/launcher.py +18 -0
- senselab/agentic_interface/nbi-config.json +71 -0
- senselab/agentic_interface/senselab_agent/__init__.py +3 -0
- senselab/agentic_interface/senselab_agent/extension.json +3 -0
- senselab/agentic_interface/senselab_agent/extension.py +2017 -0
- senselab/agentic_interface/senselab_agent/install.py +114 -0
- senselab/agentic_interface/senselab_agent/notebook_share_tool.py +133 -0
- senselab/audio/__init__.py +1 -0
- senselab/audio/data_structures/__init__.py +4 -0
- senselab/audio/data_structures/audio.py +446 -0
- senselab/audio/data_structures/audio_classification_result.py +116 -0
- senselab/audio/tasks/__init__.py +1 -0
- senselab/audio/tasks/classification/__init__.py +3 -0
- senselab/audio/tasks/classification/api.py +42 -0
- senselab/audio/tasks/classification/doc.md +40 -0
- senselab/audio/tasks/classification/huggingface.py +158 -0
- senselab/audio/tasks/classification/speech_emotion_recognition/__init__.py +3 -0
- senselab/audio/tasks/classification/speech_emotion_recognition/api.py +114 -0
- senselab/audio/tasks/classification/speech_emotion_recognition/doc.md +74 -0
- senselab/audio/tasks/data_augmentation/__init__.py +3 -0
- senselab/audio/tasks/data_augmentation/api.py +92 -0
- senselab/audio/tasks/data_augmentation/audiomentations.py +74 -0
- senselab/audio/tasks/data_augmentation/doc.md +25 -0
- senselab/audio/tasks/data_augmentation/torch_audiomentations.py +58 -0
- senselab/audio/tasks/features_extraction/__init__.py +3 -0
- senselab/audio/tasks/features_extraction/api.py +486 -0
- senselab/audio/tasks/features_extraction/doc.md +98 -0
- senselab/audio/tasks/features_extraction/opensmile.py +113 -0
- senselab/audio/tasks/features_extraction/praat_parselmouth.py +1472 -0
- senselab/audio/tasks/features_extraction/torchaudio.py +367 -0
- senselab/audio/tasks/features_extraction/torchaudio_squim.py +108 -0
- senselab/audio/tasks/forced_alignment/__init__.py +3 -0
- senselab/audio/tasks/forced_alignment/constants.py +45 -0
- senselab/audio/tasks/forced_alignment/data_structures.py +96 -0
- senselab/audio/tasks/forced_alignment/doc.md +125 -0
- senselab/audio/tasks/forced_alignment/evaluation.py +45 -0
- senselab/audio/tasks/forced_alignment/forced_alignment.py +661 -0
- senselab/audio/tasks/input_output/__init__.py +8 -0
- senselab/audio/tasks/input_output/utils.py +170 -0
- senselab/audio/tasks/plotting/__init__.py +3 -0
- senselab/audio/tasks/plotting/plotting.py +512 -0
- senselab/audio/tasks/preprocessing/__init__.py +3 -0
- senselab/audio/tasks/preprocessing/preprocessing.py +443 -0
- senselab/audio/tasks/quality_control/__init__.py +26 -0
- senselab/audio/tasks/quality_control/checks.py +860 -0
- senselab/audio/tasks/quality_control/evaluate.py +351 -0
- senselab/audio/tasks/quality_control/format.py +120 -0
- senselab/audio/tasks/quality_control/metrics.py +773 -0
- senselab/audio/tasks/quality_control/quality_control.py +115 -0
- senselab/audio/tasks/quality_control/review.py +361 -0
- senselab/audio/tasks/quality_control/taxonomies/__init__.py +13 -0
- senselab/audio/tasks/quality_control/taxonomies/bioacoustic.py +49 -0
- senselab/audio/tasks/quality_control/taxonomies/bridge2ai_voice.py +269 -0
- senselab/audio/tasks/quality_control/taxonomy.py +174 -0
- senselab/audio/tasks/speaker_diarization/__init__.py +3 -0
- senselab/audio/tasks/speaker_diarization/api.py +92 -0
- senselab/audio/tasks/speaker_diarization/doc.md +45 -0
- senselab/audio/tasks/speaker_diarization/nemo_diarization_worker.py +83 -0
- senselab/audio/tasks/speaker_diarization/nvidia.py +124 -0
- senselab/audio/tasks/speaker_diarization/pyannote.py +192 -0
- senselab/audio/tasks/speaker_diarization_evaluation/__init__.py +3 -0
- senselab/audio/tasks/speaker_diarization_evaluation/utils.py +71 -0
- senselab/audio/tasks/speaker_embeddings/__init__.py +3 -0
- senselab/audio/tasks/speaker_embeddings/api.py +83 -0
- senselab/audio/tasks/speaker_embeddings/doc.md +29 -0
- senselab/audio/tasks/speaker_embeddings/speechbrain.py +127 -0
- senselab/audio/tasks/speaker_verification/__init__.py +3 -0
- senselab/audio/tasks/speaker_verification/doc.md +60 -0
- senselab/audio/tasks/speaker_verification/speaker_verification.py +63 -0
- senselab/audio/tasks/speech_enhancement/__init__.py +3 -0
- senselab/audio/tasks/speech_enhancement/api.py +34 -0
- senselab/audio/tasks/speech_enhancement/doc.md +26 -0
- senselab/audio/tasks/speech_enhancement/speechbrain.py +149 -0
- senselab/audio/tasks/speech_to_text/__init__.py +3 -0
- senselab/audio/tasks/speech_to_text/api.py +94 -0
- senselab/audio/tasks/speech_to_text/doc.md +77 -0
- senselab/audio/tasks/speech_to_text/huggingface.py +237 -0
- senselab/audio/tasks/speech_to_text_evaluation/__init__.py +3 -0
- senselab/audio/tasks/speech_to_text_evaluation/doc.md +107 -0
- senselab/audio/tasks/speech_to_text_evaluation/utils.py +119 -0
- senselab/audio/tasks/ssl_embeddings/__init__.py +3 -0
- senselab/audio/tasks/ssl_embeddings/api.py +48 -0
- senselab/audio/tasks/ssl_embeddings/self_supervised_features.py +125 -0
- senselab/audio/tasks/text_to_speech/__init__.py +3 -0
- senselab/audio/tasks/text_to_speech/api.py +79 -0
- senselab/audio/tasks/text_to_speech/coqui.py +126 -0
- senselab/audio/tasks/text_to_speech/doc.md +60 -0
- senselab/audio/tasks/text_to_speech/huggingface.py +83 -0
- senselab/audio/tasks/voice_activity_detection/__init__.py +3 -0
- senselab/audio/tasks/voice_activity_detection/api.py +99 -0
- senselab/audio/tasks/voice_activity_detection/doc.md +46 -0
- senselab/audio/tasks/voice_cloning/__init__.py +3 -0
- senselab/audio/tasks/voice_cloning/api.py +74 -0
- senselab/audio/tasks/voice_cloning/coqui.py +132 -0
- senselab/audio/tasks/voice_cloning/doc.md +34 -0
- senselab/audio/tasks/voice_cloning/sparc.py +120 -0
- senselab/audio/workflows/__init__.py +3 -0
- senselab/audio/workflows/explore_conversation.py +184 -0
- senselab/audio/workflows/health_measurements/__init__.py +1 -0
- senselab/audio/workflows/health_measurements/doc.md +9 -0
- senselab/audio/workflows/health_measurements/extract_health_measurements.py +126 -0
- senselab/text/.gitkeep +0 -0
- senselab/text/__init__.py +1 -0
- senselab/text/tasks/__init__.py +1 -0
- senselab/text/tasks/embeddings_extraction/__init__.py +3 -0
- senselab/text/tasks/embeddings_extraction/api.py +29 -0
- senselab/text/tasks/embeddings_extraction/huggingface.py +116 -0
- senselab/text/tasks/embeddings_extraction/sentence_transformers.py +84 -0
- senselab/utils/__init__.py +1 -0
- senselab/utils/config.json +16 -0
- senselab/utils/config.py +17 -0
- senselab/utils/constants.py +5 -0
- senselab/utils/data_structures/__init__.py +30 -0
- senselab/utils/data_structures/dataset.py +442 -0
- senselab/utils/data_structures/device.py +148 -0
- senselab/utils/data_structures/docker.py +48 -0
- senselab/utils/data_structures/file.py +235 -0
- senselab/utils/data_structures/language.py +114 -0
- senselab/utils/data_structures/logging.py +20 -0
- senselab/utils/data_structures/model.py +260 -0
- senselab/utils/data_structures/script_line.py +280 -0
- senselab/utils/data_structures/talk_bank_helpers.py +65 -0
- senselab/utils/tasks/__init__.py +1 -0
- senselab/utils/tasks/batching.py +22 -0
- senselab/utils/tasks/cca_cka.py +194 -0
- senselab/utils/tasks/cosine_similarity.py +46 -0
- senselab/utils/tasks/cross_correlation.py +52 -0
- senselab/utils/tasks/dimensionality_reduction.py +158 -0
- senselab/utils/tasks/dimensionality_reduction_table.md +7 -0
- senselab/utils/tasks/eer.py +84 -0
- senselab/utils/tasks/input_output.py +188 -0
- senselab/utils/tasks/plotting.py +148 -0
- senselab/utils/tasks/pooling.py +69 -0
- senselab/video/.gitkeep +0 -0
- senselab/video/__init__.py +1 -0
- senselab/video/data_structures/__init__.py +11 -0
- senselab/video/data_structures/pose.py +162 -0
- senselab/video/data_structures/video.py +195 -0
- senselab/video/tasks/__init__.py +1 -0
- senselab/video/tasks/input_output.py +56 -0
- senselab/video/tasks/pose_estimation/__init__.py +3 -0
- senselab/video/tasks/pose_estimation/api.py +78 -0
- senselab/video/tasks/pose_estimation/doc.md +44 -0
- senselab/video/tasks/pose_estimation/estimate.py +398 -0
- senselab/video/tasks/pose_estimation/mp_pose_worker.py +42 -0
- senselab/video/tasks/pose_estimation/mp_visualization_worker.py +105 -0
- senselab/video/tasks/pose_estimation/utils.py +180 -0
- senselab/video/tasks/pose_estimation/visualization.py +245 -0
- senselab-0.0.0.dist-info/METADATA +389 -0
- senselab-0.0.0.dist-info/RECORD +156 -0
- senselab-0.0.0.dist-info/WHEEL +4 -0
- senselab-0.0.0.dist-info/entry_points.txt +3 -0
- 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
|
+

|
|
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
|
+
}
|