{
  "schemaVersion": "1.0",
  "item": {
    "slug": "audiopod",
    "name": "AudioPod",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Rakesh1002/audiopod",
    "canonicalUrl": "https://clawhub.ai/Rakesh1002/audiopod",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/audiopod",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=audiopod",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/stems.md",
      "references/tts.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/audiopod"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/audiopod",
    "agentPageUrl": "https://openagent3.xyz/skills/audiopod/agent",
    "manifestUrl": "https://openagent3.xyz/skills/audiopod/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/audiopod/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "AudioPod AI",
        "body": "Full audio processing API: music generation, stem separation, TTS, noise reduction, transcription, speaker separation, wallet management."
      },
      {
        "title": "Setup",
        "body": "pip install audiopod  # Python\nnpm install audiopod  # Node.js\n\nAuth: set AUDIOPOD_API_KEY env var or pass to client constructor."
      },
      {
        "title": "Getting an API Key",
        "body": "Sign up at https://audiopod.ai/auth/signup (free, no credit card required)\nGo to https://www.audiopod.ai/dashboard/account/api-keys\nClick \"Create API Key\" and copy the key (starts with ap_)\nAdd funds to your wallet at https://www.audiopod.ai/dashboard/account/wallet (pay-as-you-go, no subscription)\n\nfrom audiopod import AudioPod\nclient = AudioPod()  # uses AUDIOPOD_API_KEY env var\n# or: client = AudioPod(api_key=\"ap_...\")"
      },
      {
        "title": "AI Music Generation",
        "body": "Generate songs, rap, instrumentals, samples, and vocals from text prompts.\n\nTasks: text2music (song with vocals), text2rap (rap), prompt2instrumental (instrumental), lyric2vocals (vocals only), text2samples (loops/samples), audio2audio (style transfer), songbloom"
      },
      {
        "title": "Python SDK",
        "body": "# Generate a full song with lyrics\nresult = client.music.song(\n    prompt=\"Upbeat pop, synth, drums, 120 bpm, female vocals, radio-ready\",\n    lyrics=\"Verse 1:\\nWalking down the street on a sunny day\\n\\nChorus:\\nWe're on fire tonight!\",\n    duration=60\n)\nprint(result[\"output_url\"])\n\n# Generate rap\nresult = client.music.rap(\n    prompt=\"Lo-Fi Hip Hop, 100 BPM, male rap, melancholy, keyboard chords\",\n    lyrics=\"Verse 1:\\nStarted from the bottom, now we climbing...\",\n    duration=60\n)\n\n# Generate instrumental (no lyrics needed)\nresult = client.music.instrumental(\n    prompt=\"Atmospheric ambient soundscape, uplifting, driving mood\",\n    duration=30\n)\n\n# Generic generate with explicit task\nresult = client.music.generate(\n    prompt=\"Electronic dance music, high energy\",\n    task=\"text2samples\",  # any task type\n    duration=30\n)\n\n# Async: submit then poll\njob = client.music.create(\n    prompt=\"Chill lofi beat\", \n    duration=30, \n    task=\"prompt2instrumental\"\n)\nresult = client.music.wait_for_completion(job[\"id\"], timeout=600)\n\n# Get available genre presets\npresets = client.music.get_presets()\n\n# List/manage jobs\njobs = client.music.list(skip=0, limit=50)\njob = client.music.get(job_id=123)\nclient.music.delete(job_id=123)"
      },
      {
        "title": "cURL",
        "body": "# Song with lyrics\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/text2music\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\":\"upbeat pop, synth, 120bpm, female vocals\", \"lyrics\":\"Walking down the street...\", \"audio_duration\":60}'\n\n# Rap\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/text2rap\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\":\"Lo-Fi Hip Hop, male rap, 100 BPM\", \"lyrics\":\"Started from the bottom...\", \"audio_duration\":60}'\n\n# Instrumental\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/prompt2instrumental\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\":\"ambient soundscape, uplifting\", \"audio_duration\":30}'\n\n# Samples/loops\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/text2samples\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\":\"drum loop, sad mood\", \"audio_duration\":15}'\n\n# Vocals only\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/lyric2vocals\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\":\"clean vocals, happy\", \"lyrics\":\"Eternal chorus of unity...\", \"audio_duration\":30}'\n\n# Check job status / get result\ncurl \"https://api.audiopod.ai/api/v1/music/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Get genre presets\ncurl \"https://api.audiopod.ai/api/v1/music/presets\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List jobs\ncurl \"https://api.audiopod.ai/api/v1/music/jobs?skip=0&limit=50\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Delete job\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/music/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\""
      },
      {
        "title": "Parameters",
        "body": "FieldRequiredDescriptionpromptyesStyle/genre descriptionlyricsfor song/rap/vocalsSong lyrics with verse/chorus structureaudio_durationnoDuration in seconds (default: 30)genre_presetnoGenre preset name (from presets endpoint)display_namenoTrack display name"
      },
      {
        "title": "Stem Separation",
        "body": "Split audio into individual instrument/vocal tracks."
      },
      {
        "title": "Modes",
        "body": "ModeStemsOutputUse Casesingle1Specified stem onlyVocal isolation, drum extractiontwo2vocals + instrumentalKaraoke tracksfour4vocals, drums, bass, otherStandard remixing (default)six6+ guitar, pianoFull instrument separationproducer8+ kick, snare, hihatBeat productionstudio12+ cymbals, sub_bass, synthProfessional mixingmastering16Maximum detailForensic analysis\n\nSingle stem options: vocals, drums, bass, guitar, piano, other"
      },
      {
        "title": "Python SDK",
        "body": "# Sync: extract and wait for result\nresult = client.stems.separate(\n    url=\"https://youtube.com/watch?v=VIDEO_ID\",\n    mode=\"six\",\n    timeout=600\n)\nfor stem, url in result[\"download_urls\"].items():\n    print(f\"{stem}: {url}\")\n\n# From local file\nresult = client.stems.separate(file=\"/path/to/song.mp3\", mode=\"four\")\n\n# Single stem extraction\nresult = client.stems.separate(\n    url=\"https://youtube.com/watch?v=ID\",\n    mode=\"single\",\n    stem=\"vocals\"\n)\n\n# Async: submit then poll\njob = client.stems.extract(url=\"https://youtube.com/watch?v=ID\", mode=\"six\")\nprint(f\"Job ID: {job['id']}\")\nstatus = client.stems.status(job[\"id\"])\n# or wait:\nresult = client.stems.wait_for_completion(job[\"id\"], timeout=600)\n\n# List available modes\nmodes = client.stems.modes()\n\n# Job management\njobs = client.stems.list(skip=0, limit=50, status=\"COMPLETED\")\njob = client.stems.get(job_id=1234)\nclient.stems.delete(job_id=1234)"
      },
      {
        "title": "cURL",
        "body": "# Extract from URL\ncurl -X POST \"https://api.audiopod.ai/api/v1/stem-extraction/api/extract\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"url=https://youtube.com/watch?v=VIDEO_ID\" \\\n  -F \"mode=six\"\n\n# Extract from file\ncurl -X POST \"https://api.audiopod.ai/api/v1/stem-extraction/api/extract\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"file=@/path/to/song.mp3\" \\\n  -F \"mode=four\"\n\n# Single stem\ncurl -X POST \"https://api.audiopod.ai/api/v1/stem-extraction/api/extract\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"url=URL\" \\\n  -F \"mode=single\" \\\n  -F \"stem=vocals\"\n\n# Check job status\ncurl \"https://api.audiopod.ai/api/v1/stem-extraction/status/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List available modes\ncurl \"https://api.audiopod.ai/api/v1/stem-extraction/modes\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List jobs (filter by status: PENDING, PROCESSING, COMPLETED, FAILED)\ncurl \"https://api.audiopod.ai/api/v1/stem-extraction/jobs?skip=0&limit=50&status=COMPLETED\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Get specific job\ncurl \"https://api.audiopod.ai/api/v1/stem-extraction/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Delete job\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/stem-extraction/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\""
      },
      {
        "title": "Response Format",
        "body": "{\n  \"id\": 1234,\n  \"status\": \"COMPLETED\",\n  \"download_urls\": {\n    \"vocals\": \"https://...\",\n    \"drums\": \"https://...\",\n    \"bass\": \"https://...\",\n    \"other\": \"https://...\"\n  },\n  \"quality_scores\": {\n    \"vocals\": 0.95,\n    \"drums\": 0.88\n  }\n}"
      },
      {
        "title": "Text to Speech",
        "body": "Generate speech from text with 50+ voices in 60+ languages. Supports voice cloning."
      },
      {
        "title": "Voice Types",
        "body": "50+ production-ready voices — multilingual, supporting 60+ languages with auto-detection\nCustom clones — clone any voice with ~5 seconds of audio sample"
      },
      {
        "title": "Python SDK",
        "body": "# Generate speech and wait for result\nresult = client.voice.generate(\n    text=\"Hello, world! This is a test.\",\n    voice_id=123,\n    speed=1.0\n)\nprint(result[\"output_url\"])\n\n# Async: submit then poll\njob = client.voice.speak(\n    text=\"Hello world\",\n    voice_id=123,\n    speed=1.0\n)\nstatus = client.voice.get_job(job[\"id\"])\nresult = client.voice.wait_for_completion(job[\"id\"], timeout=300)\n\n# List all available voices\nvoices = client.voice.list()\nfor v in voices:\n    print(f\"{v['id']}: {v['name']}\")\n\n# Clone a voice (needs ~5 sec audio sample)\nnew_voice = client.voice.create(\n    name=\"My Voice Clone\",\n    audio_file=\"./sample.mp3\",\n    description=\"Cloned from recording\"\n)\n\n# Get/delete voice\nvoice = client.voice.get(voice_id=123)\nclient.voice.delete(voice_id=123)"
      },
      {
        "title": "cURL (Raw HTTP — most reliable)",
        "body": "# List all voices\ncurl \"https://api.audiopod.ai/api/v1/voice/voice-profiles\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Generate speech (FORM DATA, not JSON!)\ncurl -X POST \"https://api.audiopod.ai/api/v1/voice/voices/{VOICE_UUID}/generate\" \\\n  -H \"Authorization: Bearer $AUDIOPOD_API_KEY\" \\\n  -d \"input_text=Hello world, this is a test\" \\\n  -d \"audio_format=mp3\" \\\n  -d \"speed=1.0\"\n\n# Poll job status\ncurl \"https://api.audiopod.ai/api/v1/voice/tts-jobs/{JOB_ID}/status\" \\\n  -H \"Authorization: Bearer $AUDIOPOD_API_KEY\"\n\n# SDK-style endpoints (alternative)\n# Generate via SDK endpoint\ncurl -X POST \"https://api.audiopod.ai/api/v1/voice/tts/generate\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"text\":\"Hello world\",\"voice_id\":123,\"speed\":1.0}'\n\n# Poll via SDK endpoint\ncurl \"https://api.audiopod.ai/api/v1/voice/tts/status/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List voices (SDK endpoint)\ncurl \"https://api.audiopod.ai/api/v1/voice/voices\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Clone a voice\ncurl -X POST \"https://api.audiopod.ai/api/v1/voice/voices\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"name=My Voice\" \\\n  -F \"file=@sample.mp3\" \\\n  -F \"description=Cloned voice\"\n\n# Delete voice\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/voice/voices/VOICE_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\""
      },
      {
        "title": "Generate Parameters",
        "body": "FieldRequiredDescriptioninput_textyesText to speak (max 5000 chars). Use input_text for raw HTTP, text for SDKaudio_formatnomp3, wav, ogg (default: mp3)speedno0.25 - 4.0 (default: 1.0)languagenoISO code, auto-detected if omitted"
      },
      {
        "title": "Response Format",
        "body": "// Generate response\n{\"job_id\": 12345, \"status\": \"pending\", \"credits_reserved\": 25}\n\n// Status response (completed)\n{\"status\": \"completed\", \"output_url\": \"https://r2-url/generated.mp3\"}"
      },
      {
        "title": "Important Notes",
        "body": "Raw HTTP generate endpoint uses form data, not JSON. Field is input_text not text\nSDK endpoint (/api/v1/voice/tts/generate) uses JSON with field text\nOutput files may be WAV disguised as .mp3 — convert with ffmpeg -i output.mp3 -c:a aac real.m4a\n~55 credits per generation, wallet-based billing"
      },
      {
        "title": "Speaker Separation",
        "body": "Separate audio by speaker with automatic diarization."
      },
      {
        "title": "Python SDK",
        "body": "# Diarize and wait for result\nresult = client.speaker.identify(\n    file=\"./meeting.mp3\",\n    num_speakers=3,  # optional hint for accuracy\n    timeout=600\n)\nfor segment in result[\"segments\"]:\n    print(f\"Speaker {segment['speaker']}: {segment['text']} [{segment['start']:.1f}s - {segment['end']:.1f}s]\")\n\n# From URL\nresult = client.speaker.identify(\n    url=\"https://youtube.com/watch?v=VIDEO_ID\",\n    num_speakers=2\n)\n\n# Async: submit then poll\njob = client.speaker.diarize(\n    file=\"./meeting.mp3\",\n    num_speakers=3\n)\nresult = client.speaker.wait_for_completion(job[\"id\"], timeout=600)\n\n# Job management\njobs = client.speaker.list(skip=0, limit=50, status=\"COMPLETED\")\njob = client.speaker.get(job_id=123)\nclient.speaker.delete(job_id=123)"
      },
      {
        "title": "cURL",
        "body": "# Diarize from file\ncurl -X POST \"https://api.audiopod.ai/api/v1/speaker/diarize\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"file=@meeting.mp3\" \\\n  -F \"num_speakers=3\"\n\n# Diarize from URL\ncurl -X POST \"https://api.audiopod.ai/api/v1/speaker/diarize\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"url=https://youtube.com/watch?v=VIDEO_ID\" \\\n  -F \"num_speakers=2\"\n\n# Check job status\ncurl \"https://api.audiopod.ai/api/v1/speaker/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List jobs\ncurl \"https://api.audiopod.ai/api/v1/speaker/jobs?skip=0&limit=50\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Delete job\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/speaker/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\""
      },
      {
        "title": "Speech to Text (Transcription)",
        "body": "Transcribe audio/video with speaker diarization, word-level timestamps, and multiple output formats."
      },
      {
        "title": "Python SDK",
        "body": "# Transcribe URL and wait\nresult = client.transcription.transcribe(\n    url=\"https://youtube.com/watch?v=VIDEO_ID\",\n    speaker_diarization=True,\n    min_speakers=2,\n    max_speakers=5,\n    timeout=600\n)\nprint(f\"Language: {result['detected_language']}\")\nfor seg in result[\"segments\"]:\n    print(f\"[{seg['start']:.1f}s] {seg.get('speaker','?')}: {seg['text']}\")\n\n# Batch: multiple URLs at once\nresult = client.transcription.transcribe(\n    urls=[\"https://youtube.com/watch?v=ID1\", \"https://youtube.com/watch?v=ID2\"],\n    speaker_diarization=True\n)\n\n# Upload local file\njob = client.transcription.upload(\n    file_path=\"./recording.mp3\",\n    language=\"en\",\n    speaker_diarization=True\n)\nresult = client.transcription.wait_for_completion(job[\"id\"], timeout=600)\n\n# Async: submit then poll\njob = client.transcription.create(\n    url=\"https://youtube.com/watch?v=ID\",\n    language=\"en\",\n    speaker_diarization=True,\n    word_timestamps=True,\n    min_speakers=2,\n    max_speakers=4\n)\nresult = client.transcription.wait_for_completion(job[\"id\"], timeout=600)\n\n# Get transcript in different formats\ntranscript_json = client.transcription.get_transcript(job_id=123, format=\"json\")\ntranscript_srt = client.transcription.get_transcript(job_id=123, format=\"srt\")\ntranscript_vtt = client.transcription.get_transcript(job_id=123, format=\"vtt\")\ntranscript_txt = client.transcription.get_transcript(job_id=123, format=\"txt\")\n\n# Job management\njobs = client.transcription.list(skip=0, limit=50, status=\"COMPLETED\")\njob = client.transcription.get(job_id=123)\nclient.transcription.delete(job_id=123)"
      },
      {
        "title": "cURL",
        "body": "# Transcribe from URL\ncurl -X POST \"https://api.audiopod.ai/api/v1/transcribe/transcribe\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\":\"https://youtube.com/watch?v=ID\",\"enable_speaker_diarization\":true,\"word_timestamps\":true}'\n\n# Transcribe multiple URLs\ncurl -X POST \"https://api.audiopod.ai/api/v1/transcribe/transcribe\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"urls\":[\"URL1\",\"URL2\"],\"enable_speaker_diarization\":true}'\n\n# Upload file for transcription\ncurl -X POST \"https://api.audiopod.ai/api/v1/transcribe/transcribe-upload\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"files=@recording.mp3\" \\\n  -F \"language=en\" \\\n  -F \"enable_speaker_diarization=true\"\n\n# Get job status\ncurl \"https://api.audiopod.ai/api/v1/transcribe/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Get transcript in specific format (json, srt, vtt, txt)\ncurl \"https://api.audiopod.ai/api/v1/transcribe/jobs/JOB_ID/transcript?format=srt\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List jobs\ncurl \"https://api.audiopod.ai/api/v1/transcribe/jobs?offset=0&limit=50\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Delete job\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/transcribe/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\""
      },
      {
        "title": "Parameters",
        "body": "FieldRequiredDescriptionurl / urlsyes (or file)URL(s) to transcribe (YouTube, SoundCloud, direct links)languagenoISO 639-1 code (auto-detected if omitted)enable_speaker_diarizationnoEnable speaker identification (default: false)min_speakers / max_speakersnoSpeaker count hints for better diarizationword_timestampsnoEnable word-level timestamps (default: true)"
      },
      {
        "title": "Output Formats",
        "body": "json — Full structured output with segments, timestamps, speakers\nsrt — SubRip subtitle format\nvtt — WebVTT subtitle format\ntxt — Plain text transcript"
      },
      {
        "title": "Noise Reduction",
        "body": "Remove background noise from audio/video files."
      },
      {
        "title": "Python SDK",
        "body": "# Denoise and wait for result\nresult = client.denoiser.denoise(file=\"./noisy-audio.mp3\", timeout=600)\nprint(f\"Clean audio: {result['output_url']}\")\n\n# From URL\nresult = client.denoiser.denoise(url=\"https://example.com/noisy.mp3\")\n\n# Async: submit then poll\njob = client.denoiser.create(file=\"./noisy-audio.mp3\")\nresult = client.denoiser.wait_for_completion(job[\"id\"], timeout=600)\n\n# From URL (async)\njob = client.denoiser.create(url=\"https://example.com/noisy.mp3\")\n\n# Job management\njobs = client.denoiser.list(skip=0, limit=50, status=\"COMPLETED\")\njob = client.denoiser.get(job_id=123)\nclient.denoiser.delete(job_id=123)"
      },
      {
        "title": "cURL",
        "body": "# Denoise from file\ncurl -X POST \"https://api.audiopod.ai/api/v1/denoiser/denoise\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"file=@noisy-audio.mp3\"\n\n# Denoise from URL\ncurl -X POST \"https://api.audiopod.ai/api/v1/denoiser/denoise\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"url=https://example.com/noisy.mp3\"\n\n# Check job status\ncurl \"https://api.audiopod.ai/api/v1/denoiser/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List jobs\ncurl \"https://api.audiopod.ai/api/v1/denoiser/jobs?skip=0&limit=50\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Delete job\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/denoiser/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\""
      },
      {
        "title": "Wallet & Billing",
        "body": "Check balance, estimate costs, and view usage history."
      },
      {
        "title": "Python SDK",
        "body": "# Get current balance\nbalance = client.wallet.get_balance()\nprint(f\"Balance: ${balance['balance_usd']}\")\n\n# Check if balance is sufficient for an operation\ncheck = client.wallet.check_balance(\n    service_type=\"stem_extraction\",\n    duration_seconds=180\n)\nprint(f\"Sufficient: {check['sufficient']}\")\n\n# Estimate cost before running\nestimate = client.wallet.estimate_cost(\n    service_type=\"transcription\",\n    duration_seconds=300\n)\nprint(f\"Cost: ${estimate['cost_usd']}\")\n\n# Get pricing for all services\npricing = client.wallet.get_pricing()\n\n# View usage history\nusage = client.wallet.get_usage(page=1, limit=50)"
      },
      {
        "title": "cURL",
        "body": "# Get balance\ncurl \"https://api.audiopod.ai/api/v1/api-wallet/balance\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Check balance sufficiency\ncurl -X POST \"https://api.audiopod.ai/api/v1/api-wallet/check-balance\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"service_type\":\"stem_extraction\",\"duration_seconds\":180}'\n\n# Estimate cost\ncurl -X POST \"https://api.audiopod.ai/api/v1/api-wallet/estimate-cost\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"service_type\":\"transcription\",\"duration_seconds\":300}'\n\n# Get pricing\ncurl \"https://api.audiopod.ai/api/v1/api-wallet/pricing\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Usage history\ncurl \"https://api.audiopod.ai/api/v1/api-wallet/usage?page=1&limit=50\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\""
      },
      {
        "title": "API Endpoint Summary",
        "body": "ServiceEndpointMethodMusic/api/v1/music/{task}POSTMusic jobs/api/v1/music/jobs/{id}GET/DELETEMusic presets/api/v1/music/presetsGETStems/api/v1/stem-extraction/api/extractPOST (multipart)Stems status/api/v1/stem-extraction/status/{id}GETStems modes/api/v1/stem-extraction/modesGETStems jobs/api/v1/stem-extraction/jobsGETTTS generate/api/v1/voice/voices/{uuid}/generatePOST (form data)TTS generate (SDK)/api/v1/voice/tts/generatePOST (JSON)TTS status/api/v1/voice/tts-jobs/{id}/statusGETTTS status (SDK)/api/v1/voice/tts/status/{id}GETVoice list/api/v1/voice/voice-profilesGETVoice list (SDK)/api/v1/voice/voicesGETSpeaker/api/v1/speaker/diarizePOST (multipart)Speaker jobs/api/v1/speaker/jobs/{id}GET/DELETETranscribe URL/api/v1/transcribe/transcribePOST (JSON)Transcribe upload/api/v1/transcribe/transcribe-uploadPOST (multipart)Transcript output/api/v1/transcribe/jobs/{id}/transcript?format=GETTranscribe jobs/api/v1/transcribe/jobsGETDenoise/api/v1/denoiser/denoisePOST (multipart)Denoise jobs/api/v1/denoiser/jobs/{id}GET/DELETEWallet balance/api/v1/api-wallet/balanceGETWallet pricing/api/v1/api-wallet/pricingGETWallet usage/api/v1/api-wallet/usageGET"
      },
      {
        "title": "Auth Headers",
        "body": "Two auth styles work:\n\nX-API-Key: ap_... — works for most endpoints\nAuthorization: Bearer ap_... — works for TTS generate/status"
      },
      {
        "title": "Known Issues",
        "body": "SDK method signatures may differ from raw API — when in doubt, use cURL examples\nTTS output stored on Cloudflare R2, download via output_url in job status\nTTS output files may be WAV disguised as .mp3 — convert with ffmpeg before sending via WhatsApp"
      }
    ],
    "body": "AudioPod AI\n\nFull audio processing API: music generation, stem separation, TTS, noise reduction, transcription, speaker separation, wallet management.\n\nSetup\npip install audiopod  # Python\nnpm install audiopod  # Node.js\n\n\nAuth: set AUDIOPOD_API_KEY env var or pass to client constructor.\n\nGetting an API Key\nSign up at https://audiopod.ai/auth/signup (free, no credit card required)\nGo to https://www.audiopod.ai/dashboard/account/api-keys\nClick \"Create API Key\" and copy the key (starts with ap_)\nAdd funds to your wallet at https://www.audiopod.ai/dashboard/account/wallet (pay-as-you-go, no subscription)\nfrom audiopod import AudioPod\nclient = AudioPod()  # uses AUDIOPOD_API_KEY env var\n# or: client = AudioPod(api_key=\"ap_...\")\n\nAI Music Generation\n\nGenerate songs, rap, instrumentals, samples, and vocals from text prompts.\n\nTasks: text2music (song with vocals), text2rap (rap), prompt2instrumental (instrumental), lyric2vocals (vocals only), text2samples (loops/samples), audio2audio (style transfer), songbloom\n\nPython SDK\n# Generate a full song with lyrics\nresult = client.music.song(\n    prompt=\"Upbeat pop, synth, drums, 120 bpm, female vocals, radio-ready\",\n    lyrics=\"Verse 1:\\nWalking down the street on a sunny day\\n\\nChorus:\\nWe're on fire tonight!\",\n    duration=60\n)\nprint(result[\"output_url\"])\n\n# Generate rap\nresult = client.music.rap(\n    prompt=\"Lo-Fi Hip Hop, 100 BPM, male rap, melancholy, keyboard chords\",\n    lyrics=\"Verse 1:\\nStarted from the bottom, now we climbing...\",\n    duration=60\n)\n\n# Generate instrumental (no lyrics needed)\nresult = client.music.instrumental(\n    prompt=\"Atmospheric ambient soundscape, uplifting, driving mood\",\n    duration=30\n)\n\n# Generic generate with explicit task\nresult = client.music.generate(\n    prompt=\"Electronic dance music, high energy\",\n    task=\"text2samples\",  # any task type\n    duration=30\n)\n\n# Async: submit then poll\njob = client.music.create(\n    prompt=\"Chill lofi beat\", \n    duration=30, \n    task=\"prompt2instrumental\"\n)\nresult = client.music.wait_for_completion(job[\"id\"], timeout=600)\n\n# Get available genre presets\npresets = client.music.get_presets()\n\n# List/manage jobs\njobs = client.music.list(skip=0, limit=50)\njob = client.music.get(job_id=123)\nclient.music.delete(job_id=123)\n\ncURL\n# Song with lyrics\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/text2music\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\":\"upbeat pop, synth, 120bpm, female vocals\", \"lyrics\":\"Walking down the street...\", \"audio_duration\":60}'\n\n# Rap\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/text2rap\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\":\"Lo-Fi Hip Hop, male rap, 100 BPM\", \"lyrics\":\"Started from the bottom...\", \"audio_duration\":60}'\n\n# Instrumental\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/prompt2instrumental\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\":\"ambient soundscape, uplifting\", \"audio_duration\":30}'\n\n# Samples/loops\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/text2samples\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\":\"drum loop, sad mood\", \"audio_duration\":15}'\n\n# Vocals only\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/lyric2vocals\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\":\"clean vocals, happy\", \"lyrics\":\"Eternal chorus of unity...\", \"audio_duration\":30}'\n\n# Check job status / get result\ncurl \"https://api.audiopod.ai/api/v1/music/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Get genre presets\ncurl \"https://api.audiopod.ai/api/v1/music/presets\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List jobs\ncurl \"https://api.audiopod.ai/api/v1/music/jobs?skip=0&limit=50\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Delete job\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/music/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\nParameters\nField\tRequired\tDescription\nprompt\tyes\tStyle/genre description\nlyrics\tfor song/rap/vocals\tSong lyrics with verse/chorus structure\naudio_duration\tno\tDuration in seconds (default: 30)\ngenre_preset\tno\tGenre preset name (from presets endpoint)\ndisplay_name\tno\tTrack display name\nStem Separation\n\nSplit audio into individual instrument/vocal tracks.\n\nModes\nMode\tStems\tOutput\tUse Case\nsingle\t1\tSpecified stem only\tVocal isolation, drum extraction\ntwo\t2\tvocals + instrumental\tKaraoke tracks\nfour\t4\tvocals, drums, bass, other\tStandard remixing (default)\nsix\t6\t+ guitar, piano\tFull instrument separation\nproducer\t8\t+ kick, snare, hihat\tBeat production\nstudio\t12\t+ cymbals, sub_bass, synth\tProfessional mixing\nmastering\t16\tMaximum detail\tForensic analysis\n\nSingle stem options: vocals, drums, bass, guitar, piano, other\n\nPython SDK\n# Sync: extract and wait for result\nresult = client.stems.separate(\n    url=\"https://youtube.com/watch?v=VIDEO_ID\",\n    mode=\"six\",\n    timeout=600\n)\nfor stem, url in result[\"download_urls\"].items():\n    print(f\"{stem}: {url}\")\n\n# From local file\nresult = client.stems.separate(file=\"/path/to/song.mp3\", mode=\"four\")\n\n# Single stem extraction\nresult = client.stems.separate(\n    url=\"https://youtube.com/watch?v=ID\",\n    mode=\"single\",\n    stem=\"vocals\"\n)\n\n# Async: submit then poll\njob = client.stems.extract(url=\"https://youtube.com/watch?v=ID\", mode=\"six\")\nprint(f\"Job ID: {job['id']}\")\nstatus = client.stems.status(job[\"id\"])\n# or wait:\nresult = client.stems.wait_for_completion(job[\"id\"], timeout=600)\n\n# List available modes\nmodes = client.stems.modes()\n\n# Job management\njobs = client.stems.list(skip=0, limit=50, status=\"COMPLETED\")\njob = client.stems.get(job_id=1234)\nclient.stems.delete(job_id=1234)\n\ncURL\n# Extract from URL\ncurl -X POST \"https://api.audiopod.ai/api/v1/stem-extraction/api/extract\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"url=https://youtube.com/watch?v=VIDEO_ID\" \\\n  -F \"mode=six\"\n\n# Extract from file\ncurl -X POST \"https://api.audiopod.ai/api/v1/stem-extraction/api/extract\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"file=@/path/to/song.mp3\" \\\n  -F \"mode=four\"\n\n# Single stem\ncurl -X POST \"https://api.audiopod.ai/api/v1/stem-extraction/api/extract\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"url=URL\" \\\n  -F \"mode=single\" \\\n  -F \"stem=vocals\"\n\n# Check job status\ncurl \"https://api.audiopod.ai/api/v1/stem-extraction/status/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List available modes\ncurl \"https://api.audiopod.ai/api/v1/stem-extraction/modes\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List jobs (filter by status: PENDING, PROCESSING, COMPLETED, FAILED)\ncurl \"https://api.audiopod.ai/api/v1/stem-extraction/jobs?skip=0&limit=50&status=COMPLETED\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Get specific job\ncurl \"https://api.audiopod.ai/api/v1/stem-extraction/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Delete job\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/stem-extraction/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\nResponse Format\n{\n  \"id\": 1234,\n  \"status\": \"COMPLETED\",\n  \"download_urls\": {\n    \"vocals\": \"https://...\",\n    \"drums\": \"https://...\",\n    \"bass\": \"https://...\",\n    \"other\": \"https://...\"\n  },\n  \"quality_scores\": {\n    \"vocals\": 0.95,\n    \"drums\": 0.88\n  }\n}\n\nText to Speech\n\nGenerate speech from text with 50+ voices in 60+ languages. Supports voice cloning.\n\nVoice Types\n50+ production-ready voices — multilingual, supporting 60+ languages with auto-detection\nCustom clones — clone any voice with ~5 seconds of audio sample\nPython SDK\n# Generate speech and wait for result\nresult = client.voice.generate(\n    text=\"Hello, world! This is a test.\",\n    voice_id=123,\n    speed=1.0\n)\nprint(result[\"output_url\"])\n\n# Async: submit then poll\njob = client.voice.speak(\n    text=\"Hello world\",\n    voice_id=123,\n    speed=1.0\n)\nstatus = client.voice.get_job(job[\"id\"])\nresult = client.voice.wait_for_completion(job[\"id\"], timeout=300)\n\n# List all available voices\nvoices = client.voice.list()\nfor v in voices:\n    print(f\"{v['id']}: {v['name']}\")\n\n# Clone a voice (needs ~5 sec audio sample)\nnew_voice = client.voice.create(\n    name=\"My Voice Clone\",\n    audio_file=\"./sample.mp3\",\n    description=\"Cloned from recording\"\n)\n\n# Get/delete voice\nvoice = client.voice.get(voice_id=123)\nclient.voice.delete(voice_id=123)\n\ncURL (Raw HTTP — most reliable)\n# List all voices\ncurl \"https://api.audiopod.ai/api/v1/voice/voice-profiles\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Generate speech (FORM DATA, not JSON!)\ncurl -X POST \"https://api.audiopod.ai/api/v1/voice/voices/{VOICE_UUID}/generate\" \\\n  -H \"Authorization: Bearer $AUDIOPOD_API_KEY\" \\\n  -d \"input_text=Hello world, this is a test\" \\\n  -d \"audio_format=mp3\" \\\n  -d \"speed=1.0\"\n\n# Poll job status\ncurl \"https://api.audiopod.ai/api/v1/voice/tts-jobs/{JOB_ID}/status\" \\\n  -H \"Authorization: Bearer $AUDIOPOD_API_KEY\"\n\n# SDK-style endpoints (alternative)\n# Generate via SDK endpoint\ncurl -X POST \"https://api.audiopod.ai/api/v1/voice/tts/generate\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"text\":\"Hello world\",\"voice_id\":123,\"speed\":1.0}'\n\n# Poll via SDK endpoint\ncurl \"https://api.audiopod.ai/api/v1/voice/tts/status/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List voices (SDK endpoint)\ncurl \"https://api.audiopod.ai/api/v1/voice/voices\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Clone a voice\ncurl -X POST \"https://api.audiopod.ai/api/v1/voice/voices\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"name=My Voice\" \\\n  -F \"file=@sample.mp3\" \\\n  -F \"description=Cloned voice\"\n\n# Delete voice\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/voice/voices/VOICE_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\nGenerate Parameters\nField\tRequired\tDescription\ninput_text\tyes\tText to speak (max 5000 chars). Use input_text for raw HTTP, text for SDK\naudio_format\tno\tmp3, wav, ogg (default: mp3)\nspeed\tno\t0.25 - 4.0 (default: 1.0)\nlanguage\tno\tISO code, auto-detected if omitted\nResponse Format\n// Generate response\n{\"job_id\": 12345, \"status\": \"pending\", \"credits_reserved\": 25}\n\n// Status response (completed)\n{\"status\": \"completed\", \"output_url\": \"https://r2-url/generated.mp3\"}\n\nImportant Notes\nRaw HTTP generate endpoint uses form data, not JSON. Field is input_text not text\nSDK endpoint (/api/v1/voice/tts/generate) uses JSON with field text\nOutput files may be WAV disguised as .mp3 — convert with ffmpeg -i output.mp3 -c:a aac real.m4a\n~55 credits per generation, wallet-based billing\nSpeaker Separation\n\nSeparate audio by speaker with automatic diarization.\n\nPython SDK\n# Diarize and wait for result\nresult = client.speaker.identify(\n    file=\"./meeting.mp3\",\n    num_speakers=3,  # optional hint for accuracy\n    timeout=600\n)\nfor segment in result[\"segments\"]:\n    print(f\"Speaker {segment['speaker']}: {segment['text']} [{segment['start']:.1f}s - {segment['end']:.1f}s]\")\n\n# From URL\nresult = client.speaker.identify(\n    url=\"https://youtube.com/watch?v=VIDEO_ID\",\n    num_speakers=2\n)\n\n# Async: submit then poll\njob = client.speaker.diarize(\n    file=\"./meeting.mp3\",\n    num_speakers=3\n)\nresult = client.speaker.wait_for_completion(job[\"id\"], timeout=600)\n\n# Job management\njobs = client.speaker.list(skip=0, limit=50, status=\"COMPLETED\")\njob = client.speaker.get(job_id=123)\nclient.speaker.delete(job_id=123)\n\ncURL\n# Diarize from file\ncurl -X POST \"https://api.audiopod.ai/api/v1/speaker/diarize\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"file=@meeting.mp3\" \\\n  -F \"num_speakers=3\"\n\n# Diarize from URL\ncurl -X POST \"https://api.audiopod.ai/api/v1/speaker/diarize\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"url=https://youtube.com/watch?v=VIDEO_ID\" \\\n  -F \"num_speakers=2\"\n\n# Check job status\ncurl \"https://api.audiopod.ai/api/v1/speaker/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List jobs\ncurl \"https://api.audiopod.ai/api/v1/speaker/jobs?skip=0&limit=50\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Delete job\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/speaker/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\nSpeech to Text (Transcription)\n\nTranscribe audio/video with speaker diarization, word-level timestamps, and multiple output formats.\n\nPython SDK\n# Transcribe URL and wait\nresult = client.transcription.transcribe(\n    url=\"https://youtube.com/watch?v=VIDEO_ID\",\n    speaker_diarization=True,\n    min_speakers=2,\n    max_speakers=5,\n    timeout=600\n)\nprint(f\"Language: {result['detected_language']}\")\nfor seg in result[\"segments\"]:\n    print(f\"[{seg['start']:.1f}s] {seg.get('speaker','?')}: {seg['text']}\")\n\n# Batch: multiple URLs at once\nresult = client.transcription.transcribe(\n    urls=[\"https://youtube.com/watch?v=ID1\", \"https://youtube.com/watch?v=ID2\"],\n    speaker_diarization=True\n)\n\n# Upload local file\njob = client.transcription.upload(\n    file_path=\"./recording.mp3\",\n    language=\"en\",\n    speaker_diarization=True\n)\nresult = client.transcription.wait_for_completion(job[\"id\"], timeout=600)\n\n# Async: submit then poll\njob = client.transcription.create(\n    url=\"https://youtube.com/watch?v=ID\",\n    language=\"en\",\n    speaker_diarization=True,\n    word_timestamps=True,\n    min_speakers=2,\n    max_speakers=4\n)\nresult = client.transcription.wait_for_completion(job[\"id\"], timeout=600)\n\n# Get transcript in different formats\ntranscript_json = client.transcription.get_transcript(job_id=123, format=\"json\")\ntranscript_srt = client.transcription.get_transcript(job_id=123, format=\"srt\")\ntranscript_vtt = client.transcription.get_transcript(job_id=123, format=\"vtt\")\ntranscript_txt = client.transcription.get_transcript(job_id=123, format=\"txt\")\n\n# Job management\njobs = client.transcription.list(skip=0, limit=50, status=\"COMPLETED\")\njob = client.transcription.get(job_id=123)\nclient.transcription.delete(job_id=123)\n\ncURL\n# Transcribe from URL\ncurl -X POST \"https://api.audiopod.ai/api/v1/transcribe/transcribe\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\":\"https://youtube.com/watch?v=ID\",\"enable_speaker_diarization\":true,\"word_timestamps\":true}'\n\n# Transcribe multiple URLs\ncurl -X POST \"https://api.audiopod.ai/api/v1/transcribe/transcribe\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"urls\":[\"URL1\",\"URL2\"],\"enable_speaker_diarization\":true}'\n\n# Upload file for transcription\ncurl -X POST \"https://api.audiopod.ai/api/v1/transcribe/transcribe-upload\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"files=@recording.mp3\" \\\n  -F \"language=en\" \\\n  -F \"enable_speaker_diarization=true\"\n\n# Get job status\ncurl \"https://api.audiopod.ai/api/v1/transcribe/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Get transcript in specific format (json, srt, vtt, txt)\ncurl \"https://api.audiopod.ai/api/v1/transcribe/jobs/JOB_ID/transcript?format=srt\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List jobs\ncurl \"https://api.audiopod.ai/api/v1/transcribe/jobs?offset=0&limit=50\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Delete job\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/transcribe/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\nParameters\nField\tRequired\tDescription\nurl / urls\tyes (or file)\tURL(s) to transcribe (YouTube, SoundCloud, direct links)\nlanguage\tno\tISO 639-1 code (auto-detected if omitted)\nenable_speaker_diarization\tno\tEnable speaker identification (default: false)\nmin_speakers / max_speakers\tno\tSpeaker count hints for better diarization\nword_timestamps\tno\tEnable word-level timestamps (default: true)\nOutput Formats\njson — Full structured output with segments, timestamps, speakers\nsrt — SubRip subtitle format\nvtt — WebVTT subtitle format\ntxt — Plain text transcript\nNoise Reduction\n\nRemove background noise from audio/video files.\n\nPython SDK\n# Denoise and wait for result\nresult = client.denoiser.denoise(file=\"./noisy-audio.mp3\", timeout=600)\nprint(f\"Clean audio: {result['output_url']}\")\n\n# From URL\nresult = client.denoiser.denoise(url=\"https://example.com/noisy.mp3\")\n\n# Async: submit then poll\njob = client.denoiser.create(file=\"./noisy-audio.mp3\")\nresult = client.denoiser.wait_for_completion(job[\"id\"], timeout=600)\n\n# From URL (async)\njob = client.denoiser.create(url=\"https://example.com/noisy.mp3\")\n\n# Job management\njobs = client.denoiser.list(skip=0, limit=50, status=\"COMPLETED\")\njob = client.denoiser.get(job_id=123)\nclient.denoiser.delete(job_id=123)\n\ncURL\n# Denoise from file\ncurl -X POST \"https://api.audiopod.ai/api/v1/denoiser/denoise\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"file=@noisy-audio.mp3\"\n\n# Denoise from URL\ncurl -X POST \"https://api.audiopod.ai/api/v1/denoiser/denoise\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -F \"url=https://example.com/noisy.mp3\"\n\n# Check job status\ncurl \"https://api.audiopod.ai/api/v1/denoiser/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# List jobs\ncurl \"https://api.audiopod.ai/api/v1/denoiser/jobs?skip=0&limit=50\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Delete job\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/denoiser/jobs/JOB_ID\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\nWallet & Billing\n\nCheck balance, estimate costs, and view usage history.\n\nPython SDK\n# Get current balance\nbalance = client.wallet.get_balance()\nprint(f\"Balance: ${balance['balance_usd']}\")\n\n# Check if balance is sufficient for an operation\ncheck = client.wallet.check_balance(\n    service_type=\"stem_extraction\",\n    duration_seconds=180\n)\nprint(f\"Sufficient: {check['sufficient']}\")\n\n# Estimate cost before running\nestimate = client.wallet.estimate_cost(\n    service_type=\"transcription\",\n    duration_seconds=300\n)\nprint(f\"Cost: ${estimate['cost_usd']}\")\n\n# Get pricing for all services\npricing = client.wallet.get_pricing()\n\n# View usage history\nusage = client.wallet.get_usage(page=1, limit=50)\n\ncURL\n# Get balance\ncurl \"https://api.audiopod.ai/api/v1/api-wallet/balance\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Check balance sufficiency\ncurl -X POST \"https://api.audiopod.ai/api/v1/api-wallet/check-balance\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"service_type\":\"stem_extraction\",\"duration_seconds\":180}'\n\n# Estimate cost\ncurl -X POST \"https://api.audiopod.ai/api/v1/api-wallet/estimate-cost\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"service_type\":\"transcription\",\"duration_seconds\":300}'\n\n# Get pricing\ncurl \"https://api.audiopod.ai/api/v1/api-wallet/pricing\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\n# Usage history\ncurl \"https://api.audiopod.ai/api/v1/api-wallet/usage?page=1&limit=50\" \\\n  -H \"X-API-Key: $AUDIOPOD_API_KEY\"\n\nAPI Endpoint Summary\nService\tEndpoint\tMethod\nMusic\t/api/v1/music/{task}\tPOST\nMusic jobs\t/api/v1/music/jobs/{id}\tGET/DELETE\nMusic presets\t/api/v1/music/presets\tGET\nStems\t/api/v1/stem-extraction/api/extract\tPOST (multipart)\nStems status\t/api/v1/stem-extraction/status/{id}\tGET\nStems modes\t/api/v1/stem-extraction/modes\tGET\nStems jobs\t/api/v1/stem-extraction/jobs\tGET\nTTS generate\t/api/v1/voice/voices/{uuid}/generate\tPOST (form data)\nTTS generate (SDK)\t/api/v1/voice/tts/generate\tPOST (JSON)\nTTS status\t/api/v1/voice/tts-jobs/{id}/status\tGET\nTTS status (SDK)\t/api/v1/voice/tts/status/{id}\tGET\nVoice list\t/api/v1/voice/voice-profiles\tGET\nVoice list (SDK)\t/api/v1/voice/voices\tGET\nSpeaker\t/api/v1/speaker/diarize\tPOST (multipart)\nSpeaker jobs\t/api/v1/speaker/jobs/{id}\tGET/DELETE\nTranscribe URL\t/api/v1/transcribe/transcribe\tPOST (JSON)\nTranscribe upload\t/api/v1/transcribe/transcribe-upload\tPOST (multipart)\nTranscript output\t/api/v1/transcribe/jobs/{id}/transcript?format=\tGET\nTranscribe jobs\t/api/v1/transcribe/jobs\tGET\nDenoise\t/api/v1/denoiser/denoise\tPOST (multipart)\nDenoise jobs\t/api/v1/denoiser/jobs/{id}\tGET/DELETE\nWallet balance\t/api/v1/api-wallet/balance\tGET\nWallet pricing\t/api/v1/api-wallet/pricing\tGET\nWallet usage\t/api/v1/api-wallet/usage\tGET\nAuth Headers\n\nTwo auth styles work:\n\nX-API-Key: ap_... — works for most endpoints\nAuthorization: Bearer ap_... — works for TTS generate/status\nKnown Issues\nSDK method signatures may differ from raw API — when in doubt, use cURL examples\nTTS output stored on Cloudflare R2, download via output_url in job status\nTTS output files may be WAV disguised as .mp3 — convert with ffmpeg before sending via WhatsApp"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Rakesh1002/audiopod",
    "publisherUrl": "https://clawhub.ai/Rakesh1002/audiopod",
    "owner": "Rakesh1002",
    "version": "1.2.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/audiopod",
    "downloadUrl": "https://openagent3.xyz/downloads/audiopod",
    "agentUrl": "https://openagent3.xyz/skills/audiopod/agent",
    "manifestUrl": "https://openagent3.xyz/skills/audiopod/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/audiopod/agent.md"
  }
}