← 返回 Skills 市场
scikkk

Voice Memos

作者 scikkk · GitHub ↗ · v1.0.0 · MIT-0
cross-platform ✓ 安全检测通过
311
总下载
0
收藏
0
当前安装
1
版本数
在 OpenClaw 中安装
/install memo
功能描述
Transcribe and organize voice memos with automatic categorization and information extraction. Use when users have voice notes, audio memos, or spoken notes t...
使用说明 (SKILL.md)

SenseAudio Voice Memo Transcriber

Transform voice memos into organized, searchable text with automatic categorization and key information extraction.

What This Skill Does

  • Transcribe voice memos to text with high accuracy
  • Convert casual speech to structured written format
  • Extract key information (dates, tasks, contacts)
  • Organize memos by topic or category
  • Generate summaries and action items

Prerequisites

Install required Python packages:

pip install requests

Implementation Guide

Step 1: Transcribe Voice Memo

import requests

def transcribe_voice_memo(audio_file):
    url = "https://api.senseaudio.cn/v1/audio/transcriptions"

    headers = {"Authorization": f"Bearer {API_KEY}"}
    files = {"file": open(audio_file, "rb")}
    data = {
        "model": "sense-asr",  # Standard model: full features, good for voice memos
        "response_format": "json"
    }

    response = requests.post(url, headers=headers, files=files, data=data)
    return response.json()["text"]

Step 2: Clean and Structure Text

Convert casual speech to readable text:

import re

def clean_transcription(text):
    # Remove filler words
    fillers = ["um", "uh", "like", "you know", "basically", "actually"]
    for filler in fillers:
        text = re.sub(rf'\b{filler}\b', '', text, flags=re.IGNORECASE)

    # Fix spacing
    text = re.sub(r'\s+', ' ', text).strip()

    # Capitalize sentences
    sentences = text.split('. ')
    text = '. '.join(s.capitalize() for s in sentences)

    return text

Step 3: Extract Key Information

import re
from datetime import datetime

def extract_info(text):
    info = {
        "dates": [],
        "tasks": [],
        "contacts": [],
        "keywords": []
    }

    # Extract dates
    date_patterns = [
        r'\b(?:tomorrow|today|yesterday)\b',
        r'\b(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday)\b',
        r'\b\d{1,2}/\d{1,2}/\d{2,4}\b'
    ]
    for pattern in date_patterns:
        info["dates"].extend(re.findall(pattern, text, re.IGNORECASE))

    # Extract tasks (action verbs)
    task_patterns = [
        r'(?:need to|have to|must|should)\s+(\w+(?:\s+\w+){0,5})',
        r'(?:remember to|don\'t forget to)\s+(\w+(?:\s+\w+){0,5})'
    ]
    for pattern in task_patterns:
        info["tasks"].extend(re.findall(pattern, text, re.IGNORECASE))

    # Extract names (capitalized words)
    info["contacts"] = re.findall(r'\b[A-Z][a-z]+(?:\s+[A-Z][a-z]+)*\b', text)

    return info

Step 4: Categorize Memo

def categorize_memo(text):
    categories = {
        "work": ["meeting", "project", "deadline", "client", "email"],
        "personal": ["family", "friend", "home", "weekend"],
        "shopping": ["buy", "purchase", "store", "grocery"],
        "ideas": ["idea", "think", "maybe", "could"],
        "tasks": ["todo", "task", "need to", "must"]
    }

    text_lower = text.lower()
    scores = {}

    for category, keywords in categories.items():
        score = sum(1 for keyword in keywords if keyword in text_lower)
        scores[category] = score

    return max(scores, key=scores.get) if max(scores.values()) > 0 else "general"

Step 5: Generate Structured Output

def process_voice_memo(audio_file):
    # Transcribe
    raw_text = transcribe_voice_memo(audio_file)

    # Clean
    clean_text = clean_transcription(raw_text)

    # Extract info
    info = extract_info(clean_text)

    # Categorize
    category = categorize_memo(clean_text)

    # Create structured memo
    memo = {
        "timestamp": datetime.now().isoformat(),
        "category": category,
        "text": clean_text,
        "raw_text": raw_text,
        "extracted_info": info,
        "summary": generate_summary(clean_text)
    }

    return memo

def generate_summary(text):
    # Use first sentence or first 100 chars
    sentences = text.split('. ')
    return sentences[0] if sentences else text[:100]

Advanced Features

Batch Processing

Process multiple memos:

def process_memo_batch(audio_files):
    memos = []
    for audio_file in audio_files:
        memo = process_voice_memo(audio_file)
        memos.append(memo)

    # Group by category
    by_category = {}
    for memo in memos:
        category = memo["category"]
        if category not in by_category:
            by_category[category] = []
        by_category[category].append(memo)

    return by_category

Search and Filter

def search_memos(memos, query):
    results = []
    query_lower = query.lower()

    for memo in memos:
        if query_lower in memo["text"].lower():
            results.append(memo)

    return results

def filter_by_date(memos, date):
    return [m for m in memos if date in m["extracted_info"]["dates"]]

Export Formats

def export_to_markdown(memos):
    md = "# Voice Memos\
\
"

    for memo in memos:
        md += f"## {memo['timestamp']}\
"
        md += f"**Category**: {memo['category']}\
\
"
        md += f"{memo['text']}\
\
"

        if memo['extracted_info']['tasks']:
            md += "**Tasks**:\
"
            for task in memo['extracted_info']['tasks']:
                md += f"- [ ] {task}\
"
            md += "\
"

    return md

Output Format

  • Cleaned transcription text
  • Structured memo JSON
  • Extracted information (dates, tasks, contacts)
  • Category classification
  • Summary

Tips for Best Results

  • Speak clearly and at normal pace
  • Mention dates and names explicitly
  • Use action verbs for tasks
  • Keep memos under 5 minutes for best results
  • Review and edit extracted information

Reference

安全使用建议
This skill appears internally consistent, but check these before installing or using with real data: 1) Verify the API key handling — the example code uses API_KEY but the declared env var is SENSEAUDIO_API_KEY; ensure your implementation reads the env var securely (e.g., os.environ['SENSEAUDIO_API_KEY']) and never hard-codes keys. 2) Understand privacy: audio files are uploaded to https://api.senseaudio.cn — review SenseAudio's privacy, retention, and jurisdiction policies before sending sensitive audio (personal data, credentials, health info, etc.). 3) Test with non-sensitive samples first to confirm responses and error handling. 4) Limit the API key scope/permissions where possible and rotate keys if you suspect misuse. 5) If you need offline processing or stronger data controls, prefer a local/offline transcription solution instead of sending audio externally.
功能分析
Type: OpenClaw Skill Name: memo Version: 1.0.0 The skill provides legitimate functionality for transcribing and organizing voice memos using the SenseAudio API (api.senseaudio.cn). The provided Python code in SKILL.md uses standard libraries like 'requests' and 're' to perform audio uploads, text cleaning, and keyword-based information extraction, with no evidence of malicious intent, obfuscation, or unauthorized data access.
能力评估
Purpose & Capability
Name/description match the declared requirement (SENSEAUDIO_API_KEY) and the SKILL.md shows calls to https://api.senseaudio.cn for transcription and local text processing; asking for an API key for the service is proportional to the stated purpose.
Instruction Scope
Instructions are limited to uploading audio files to the SenseAudio API and local text processing. No steps instruct reading unrelated system files or credentials. Minor issues: the example code uses an undefined variable API_KEY instead of reading SENSEAUDIO_API_KEY from the environment (so implementers must explicitly read the env var), and the contact-extraction regex may over-match non-name tokens (a functional, not security, concern).
Install Mechanism
Instruction-only skill with no install spec or downloaded code; the only install suggestion is pip install requests, which is proportional and low-risk.
Credentials
Only one credential is required (SENSEAUDIO_API_KEY) and it is the primaryEnv; that is appropriate for a hosted transcription service. No unrelated secrets or config paths are requested.
Persistence & Privilege
always is false and there is no install script or persistent agent modification. The skill does not request elevated platform privileges or permanent presence.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install memo
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /memo 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v1.0.0
- Initial release of SenseAudio Voice Memo Transcriber skill - Transcribes voice memos to structured, organized text - Automatically extracts dates, tasks, and contacts from transcriptions - Categorizes memos by topics like work, personal, shopping, and more - Supports batch processing, searching, filtering, and export to Markdown - Requires SENSEAUDIO_API_KEY for API access
元数据
Slug memo
版本 1.0.0
许可证 MIT-0
累计安装 0
当前安装数 0
历史版本数 1
常见问题

Voice Memos 是什么?

Transcribe and organize voice memos with automatic categorization and information extraction. Use when users have voice notes, audio memos, or spoken notes t... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 311 次。

如何安装 Voice Memos?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install memo」即可一键安装,无需额外配置。

Voice Memos 是免费的吗?

是的,Voice Memos 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。

Voice Memos 支持哪些平台?

Voice Memos 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 Voice Memos?

由 scikkk(@scikkk)开发并维护,当前版本 v1.0.0。

💬 留言讨论