🧪 Skills
Meeting Summarizer
Transcribe meetings with SenseAudio ASR speaker diarization, timestamps, and meeting-note extraction workflows. Use when users need meeting transcription, me...
v1.0.2
Description
name: senseaudio-meeting-summarizer description: Transcribe meetings with SenseAudio ASR speaker diarization, timestamps, and meeting-note extraction workflows. Use when users need meeting transcription, meeting notes, speaker-separated transcripts, or action-item extraction from recordings. metadata: openclaw: requires: env: - SENSEAUDIO_API_KEY bins: - python3 primaryEnv: SENSEAUDIO_API_KEY homepage: https://senseaudio.cn install: - kind: uv package: requests - kind: uv package: websockets compatibility: required_credentials: - name: SENSEAUDIO_API_KEY description: API key from https://senseaudio.cn/platform/api-key env_var: SENSEAUDIO_API_KEY homepage: https://senseaudio.cn
SenseAudio Meeting Summarizer
Transform meeting recordings into structured transcripts with speaker identification, timestamps, and local meeting summaries.
What This Skill Does
- Transcribe recorded meetings with official SenseAudio ASR endpoints
- Separate speakers with diarization on supported models
- Generate word and segment timestamps for navigation
- Produce local summaries and action-item candidates from transcripts
- Support optional realtime transcription for live meetings
- Export transcript and notes in text-friendly formats
Credential and Dependency Rules
- Read the API key from
SENSEAUDIO_API_KEY. - Send auth only as
Authorization: Bearer <API_KEY>. - Do not place API keys in query parameters, logs, or saved examples.
- If Python helpers are used, this skill expects
python3,requests, andwebsockets. - This skill should work without any external LLM credentials.
- If a user explicitly asks for LLM-based summarization, require a separately declared credential for that provider instead of assuming one exists.
Official ASR Constraints
Use the official SenseAudio ASR rules summarized below:
- HTTP endpoint:
POST https://api.senseaudio.cn/v1/audio/transcriptions - WebSocket endpoint:
wss://api.senseaudio.cn/ws/v1/audio/transcriptions - File upload limit:
<=10MBper request - Meeting-oriented HTTP model:
sense-asr-pro - Realtime WebSocket model:
sense-asr-deepthink enable_speaker_diarizationis supported only onsense-asr/sense-asr-promax_speakersis documented only forsense-asr-proenable_sentimentandtimestamp_granularities[]are supported only onsense-asr/sense-asr-pro- WebSocket audio must be
pcm,16000Hz, mono
Recommended Workflow
- Validate the meeting asset:
- Prefer clear audio with limited background noise.
- Split files larger than
10MBbefore upload.
- Transcribe with the right mode:
- Use HTTP
sense-asr-profor recorded meetings needing diarization and timestamps. - Use WebSocket
sense-asr-deepthinkonly for live streaming scenarios.
- Request only needed features:
- For meeting notes, use
response_format=verbose_json. - Enable diarization, timestamps, and sentiment only when the user needs them.
- Provide
max_speakersonly when known and usingsense-asr-pro.
- Summarize locally first:
- Build summaries, decisions, and action-item candidates from the transcript itself.
- Keep the no-extra-credentials path as the default behavior.
- Handle sensitive output carefully:
- Treat returned
session_id,trace_id, and transcript contents as potentially sensitive. - Do not expose provider identifiers unless needed for debugging.
Minimal HTTP Transcription Helper
import os
import requests
API_KEY = os.environ["SENSEAUDIO_API_KEY"]
API_URL = "https://api.senseaudio.cn/v1/audio/transcriptions"
def transcribe_meeting(audio_file, max_speakers=None, language=None, target_language=None):
with open(audio_file, "rb") as handle:
response = requests.post(
API_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
files={"file": handle},
data={
"model": "sense-asr-pro",
"response_format": "verbose_json",
"enable_speaker_diarization": "true",
"enable_sentiment": "true",
"enable_punctuation": "true",
"timestamp_granularities[]": ["word", "segment"],
**({"max_speakers": max_speakers} if max_speakers else {}),
**({"language": language} if language else {}),
**({"target_language": target_language} if target_language else {}),
},
timeout=300,
)
response.raise_for_status()
return response.json()
Transcript Processing Pattern
- Read
textfor the full transcript - Read
segmentsfor speaker-separated timeline entries - Use
speaker,start,end,text, and optionalsentimentfields when present - Use
wordsonly when word timestamps were requested
Local Summary Pattern
Generate notes from transcript structure without external services:
summary: 3-6 bullets capturing the meeting arcdecisions: statements containing agreements or final choicesaction_items: statements with owners, deadlines, or explicit follow-upsparticipants: derived from speaker labelstimeline: ordered segments with timestamps
Heuristics that work without an LLM:
- Detect action items from patterns like
will,need to,follow up,by Friday - Detect decisions from patterns like
decided,agreed,we will,final choice - Aggregate speaker time by summing
end - start
Realtime Meeting Pattern
For live meetings, use WebSocket only when streaming audio is actually available.
import asyncio
import json
import os
import websockets
API_KEY = os.environ["SENSEAUDIO_API_KEY"]
WS_URL = "wss://api.senseaudio.cn/ws/v1/audio/transcriptions"
async def transcribe_live_meeting(audio_stream):
async with websockets.connect(
WS_URL,
additional_headers={"Authorization": f"Bearer {API_KEY}"},
) as ws:
await ws.recv()
await ws.send(json.dumps({
"event": "task_start",
"model": "sense-asr-deepthink",
"audio_setting": {
"sample_rate": 16000,
"format": "pcm",
"channel": 1,
},
}))
async for audio_chunk in audio_stream:
await ws.send(audio_chunk)
await ws.send(json.dumps({"event": "task_finish"}))
Output Options
- Full transcript with timestamps in
txtorjson - Meeting notes in
md - Action-item list in
jsonorcsv - Speaker statistics in
json - Optional sentiment timeline when requested
Error Handling
- Poor audio quality: run an audio-quality check first or request a cleaner recording
- Large files: split recordings into chunks under
10MB - Wrong language detection: set
languageexplicitly on HTTP transcription - Too many speakers: provide
max_speakersonly withsense-asr-pro - Realtime failures: inspect WebSocket
task_failedandbase_resp.status_msg
Safety Notes
- Do not assume any external summarization provider credential exists.
- Do not add an LLM call unless the user asks for it and the skill metadata is updated to declare that credential.
- Prefer local transcript-based summarization for the default path.
Reviews (0)
Sign in to write a review.
No reviews yet. Be the first to review!
Comments (0)
No comments yet. Be the first to share your thoughts!