Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Use AudioPod AI's API for audio processing tasks including AI music generation (text-to-music, text-to-rap, instrumentals, samples, vocals), stem separation, text-to-speech, noise reduction, speech-to-text transcription, speaker separation, and media extraction. Use when the user needs to generate music/songs/rap from text, split a song into stems/vocals/instruments, generate speech from text, clean up noisy audio, transcribe audio/video, or extract audio from YouTube/URLs. Requires AUDIOPOD_API_KEY env var or pass api_key directly.
Use AudioPod AI's API for audio processing tasks including AI music generation (text-to-music, text-to-rap, instrumentals, samples, vocals), stem separation, text-to-speech, noise reduction, speech-to-text transcription, speaker separation, and media extraction. Use when the user needs to generate music/songs/rap from text, split a song into stems/vocals/instruments, generate speech from text, clean up noisy audio, transcribe audio/video, or extract audio from YouTube/URLs. Requires AUDIOPOD_API_KEY env var or pass api_key directly.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
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.
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.
Full audio processing API: music generation, stem separation, TTS, noise reduction, transcription, speaker separation, wallet management.
pip install audiopod # Python npm install audiopod # Node.js Auth: set AUDIOPOD_API_KEY env var or pass to client constructor.
Sign up at https://audiopod.ai/auth/signup (free, no credit card required) Go to https://www.audiopod.ai/dashboard/account/api-keys Click "Create API Key" and copy the key (starts with ap_) Add funds to your wallet at https://www.audiopod.ai/dashboard/account/wallet (pay-as-you-go, no subscription) from audiopod import AudioPod client = AudioPod() # uses AUDIOPOD_API_KEY env var # or: client = AudioPod(api_key="ap_...")
Generate songs, rap, instrumentals, samples, and vocals from text prompts. Tasks: text2music (song with vocals), text2rap (rap), prompt2instrumental (instrumental), lyric2vocals (vocals only), text2samples (loops/samples), audio2audio (style transfer), songbloom
# Generate a full song with lyrics result = client.music.song( prompt="Upbeat pop, synth, drums, 120 bpm, female vocals, radio-ready", lyrics="Verse 1:\nWalking down the street on a sunny day\n\nChorus:\nWe're on fire tonight!", duration=60 ) print(result["output_url"]) # Generate rap result = client.music.rap( prompt="Lo-Fi Hip Hop, 100 BPM, male rap, melancholy, keyboard chords", lyrics="Verse 1:\nStarted from the bottom, now we climbing...", duration=60 ) # Generate instrumental (no lyrics needed) result = client.music.instrumental( prompt="Atmospheric ambient soundscape, uplifting, driving mood", duration=30 ) # Generic generate with explicit task result = client.music.generate( prompt="Electronic dance music, high energy", task="text2samples", # any task type duration=30 ) # Async: submit then poll job = client.music.create( prompt="Chill lofi beat", duration=30, task="prompt2instrumental" ) result = client.music.wait_for_completion(job["id"], timeout=600) # Get available genre presets presets = client.music.get_presets() # List/manage jobs jobs = client.music.list(skip=0, limit=50) job = client.music.get(job_id=123) client.music.delete(job_id=123)
# Song with lyrics curl -X POST "https://api.audiopod.ai/api/v1/music/text2music" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt":"upbeat pop, synth, 120bpm, female vocals", "lyrics":"Walking down the street...", "audio_duration":60}' # Rap curl -X POST "https://api.audiopod.ai/api/v1/music/text2rap" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt":"Lo-Fi Hip Hop, male rap, 100 BPM", "lyrics":"Started from the bottom...", "audio_duration":60}' # Instrumental curl -X POST "https://api.audiopod.ai/api/v1/music/prompt2instrumental" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt":"ambient soundscape, uplifting", "audio_duration":30}' # Samples/loops curl -X POST "https://api.audiopod.ai/api/v1/music/text2samples" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt":"drum loop, sad mood", "audio_duration":15}' # Vocals only curl -X POST "https://api.audiopod.ai/api/v1/music/lyric2vocals" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt":"clean vocals, happy", "lyrics":"Eternal chorus of unity...", "audio_duration":30}' # Check job status / get result curl "https://api.audiopod.ai/api/v1/music/jobs/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Get genre presets curl "https://api.audiopod.ai/api/v1/music/presets" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # List jobs curl "https://api.audiopod.ai/api/v1/music/jobs?skip=0&limit=50" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Delete job curl -X DELETE "https://api.audiopod.ai/api/v1/music/jobs/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY"
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
Split audio into individual instrument/vocal tracks.
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 Single stem options: vocals, drums, bass, guitar, piano, other
# Sync: extract and wait for result result = client.stems.separate( url="https://youtube.com/watch?v=VIDEO_ID", mode="six", timeout=600 ) for stem, url in result["download_urls"].items(): print(f"{stem}: {url}") # From local file result = client.stems.separate(file="/path/to/song.mp3", mode="four") # Single stem extraction result = client.stems.separate( url="https://youtube.com/watch?v=ID", mode="single", stem="vocals" ) # Async: submit then poll job = client.stems.extract(url="https://youtube.com/watch?v=ID", mode="six") print(f"Job ID: {job['id']}") status = client.stems.status(job["id"]) # or wait: result = client.stems.wait_for_completion(job["id"], timeout=600) # List available modes modes = client.stems.modes() # Job management jobs = client.stems.list(skip=0, limit=50, status="COMPLETED") job = client.stems.get(job_id=1234) client.stems.delete(job_id=1234)
# Extract from URL curl -X POST "https://api.audiopod.ai/api/v1/stem-extraction/api/extract" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -F "url=https://youtube.com/watch?v=VIDEO_ID" \ -F "mode=six" # Extract from file curl -X POST "https://api.audiopod.ai/api/v1/stem-extraction/api/extract" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -F "file=@/path/to/song.mp3" \ -F "mode=four" # Single stem curl -X POST "https://api.audiopod.ai/api/v1/stem-extraction/api/extract" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -F "url=URL" \ -F "mode=single" \ -F "stem=vocals" # Check job status curl "https://api.audiopod.ai/api/v1/stem-extraction/status/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # List available modes curl "https://api.audiopod.ai/api/v1/stem-extraction/modes" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # List jobs (filter by status: PENDING, PROCESSING, COMPLETED, FAILED) curl "https://api.audiopod.ai/api/v1/stem-extraction/jobs?skip=0&limit=50&status=COMPLETED" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Get specific job curl "https://api.audiopod.ai/api/v1/stem-extraction/jobs/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Delete job curl -X DELETE "https://api.audiopod.ai/api/v1/stem-extraction/jobs/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY"
{ "id": 1234, "status": "COMPLETED", "download_urls": { "vocals": "https://...", "drums": "https://...", "bass": "https://...", "other": "https://..." }, "quality_scores": { "vocals": 0.95, "drums": 0.88 } }
Generate speech from text with 50+ voices in 60+ languages. Supports voice cloning.
50+ production-ready voices โ multilingual, supporting 60+ languages with auto-detection Custom clones โ clone any voice with ~5 seconds of audio sample
# Generate speech and wait for result result = client.voice.generate( text="Hello, world! This is a test.", voice_id=123, speed=1.0 ) print(result["output_url"]) # Async: submit then poll job = client.voice.speak( text="Hello world", voice_id=123, speed=1.0 ) status = client.voice.get_job(job["id"]) result = client.voice.wait_for_completion(job["id"], timeout=300) # List all available voices voices = client.voice.list() for v in voices: print(f"{v['id']}: {v['name']}") # Clone a voice (needs ~5 sec audio sample) new_voice = client.voice.create( name="My Voice Clone", audio_file="./sample.mp3", description="Cloned from recording" ) # Get/delete voice voice = client.voice.get(voice_id=123) client.voice.delete(voice_id=123)
# List all voices curl "https://api.audiopod.ai/api/v1/voice/voice-profiles" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Generate speech (FORM DATA, not JSON!) curl -X POST "https://api.audiopod.ai/api/v1/voice/voices/{VOICE_UUID}/generate" \ -H "Authorization: Bearer $AUDIOPOD_API_KEY" \ -d "input_text=Hello world, this is a test" \ -d "audio_format=mp3" \ -d "speed=1.0" # Poll job status curl "https://api.audiopod.ai/api/v1/voice/tts-jobs/{JOB_ID}/status" \ -H "Authorization: Bearer $AUDIOPOD_API_KEY" # SDK-style endpoints (alternative) # Generate via SDK endpoint curl -X POST "https://api.audiopod.ai/api/v1/voice/tts/generate" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"text":"Hello world","voice_id":123,"speed":1.0}' # Poll via SDK endpoint curl "https://api.audiopod.ai/api/v1/voice/tts/status/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # List voices (SDK endpoint) curl "https://api.audiopod.ai/api/v1/voice/voices" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Clone a voice curl -X POST "https://api.audiopod.ai/api/v1/voice/voices" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -F "name=My Voice" \ -F "file=@sample.mp3" \ -F "description=Cloned voice" # Delete voice curl -X DELETE "https://api.audiopod.ai/api/v1/voice/voices/VOICE_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY"
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
// Generate response {"job_id": 12345, "status": "pending", "credits_reserved": 25} // Status response (completed) {"status": "completed", "output_url": "https://r2-url/generated.mp3"}
Raw HTTP generate endpoint uses form data, not JSON. Field is input_text not text SDK endpoint (/api/v1/voice/tts/generate) uses JSON with field text Output files may be WAV disguised as .mp3 โ convert with ffmpeg -i output.mp3 -c:a aac real.m4a ~55 credits per generation, wallet-based billing
Separate audio by speaker with automatic diarization.
# Diarize and wait for result result = client.speaker.identify( file="./meeting.mp3", num_speakers=3, # optional hint for accuracy timeout=600 ) for segment in result["segments"]: print(f"Speaker {segment['speaker']}: {segment['text']} [{segment['start']:.1f}s - {segment['end']:.1f}s]") # From URL result = client.speaker.identify( url="https://youtube.com/watch?v=VIDEO_ID", num_speakers=2 ) # Async: submit then poll job = client.speaker.diarize( file="./meeting.mp3", num_speakers=3 ) result = client.speaker.wait_for_completion(job["id"], timeout=600) # Job management jobs = client.speaker.list(skip=0, limit=50, status="COMPLETED") job = client.speaker.get(job_id=123) client.speaker.delete(job_id=123)
# Diarize from file curl -X POST "https://api.audiopod.ai/api/v1/speaker/diarize" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -F "file=@meeting.mp3" \ -F "num_speakers=3" # Diarize from URL curl -X POST "https://api.audiopod.ai/api/v1/speaker/diarize" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -F "url=https://youtube.com/watch?v=VIDEO_ID" \ -F "num_speakers=2" # Check job status curl "https://api.audiopod.ai/api/v1/speaker/jobs/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # List jobs curl "https://api.audiopod.ai/api/v1/speaker/jobs?skip=0&limit=50" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Delete job curl -X DELETE "https://api.audiopod.ai/api/v1/speaker/jobs/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY"
Transcribe audio/video with speaker diarization, word-level timestamps, and multiple output formats.
# Transcribe URL and wait result = client.transcription.transcribe( url="https://youtube.com/watch?v=VIDEO_ID", speaker_diarization=True, min_speakers=2, max_speakers=5, timeout=600 ) print(f"Language: {result['detected_language']}") for seg in result["segments"]: print(f"[{seg['start']:.1f}s] {seg.get('speaker','?')}: {seg['text']}") # Batch: multiple URLs at once result = client.transcription.transcribe( urls=["https://youtube.com/watch?v=ID1", "https://youtube.com/watch?v=ID2"], speaker_diarization=True ) # Upload local file job = client.transcription.upload( file_path="./recording.mp3", language="en", speaker_diarization=True ) result = client.transcription.wait_for_completion(job["id"], timeout=600) # Async: submit then poll job = client.transcription.create( url="https://youtube.com/watch?v=ID", language="en", speaker_diarization=True, word_timestamps=True, min_speakers=2, max_speakers=4 ) result = client.transcription.wait_for_completion(job["id"], timeout=600) # Get transcript in different formats transcript_json = client.transcription.get_transcript(job_id=123, format="json") transcript_srt = client.transcription.get_transcript(job_id=123, format="srt") transcript_vtt = client.transcription.get_transcript(job_id=123, format="vtt") transcript_txt = client.transcription.get_transcript(job_id=123, format="txt") # Job management jobs = client.transcription.list(skip=0, limit=50, status="COMPLETED") job = client.transcription.get(job_id=123) client.transcription.delete(job_id=123)
# Transcribe from URL curl -X POST "https://api.audiopod.ai/api/v1/transcribe/transcribe" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"url":"https://youtube.com/watch?v=ID","enable_speaker_diarization":true,"word_timestamps":true}' # Transcribe multiple URLs curl -X POST "https://api.audiopod.ai/api/v1/transcribe/transcribe" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"urls":["URL1","URL2"],"enable_speaker_diarization":true}' # Upload file for transcription curl -X POST "https://api.audiopod.ai/api/v1/transcribe/transcribe-upload" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -F "files=@recording.mp3" \ -F "language=en" \ -F "enable_speaker_diarization=true" # Get job status curl "https://api.audiopod.ai/api/v1/transcribe/jobs/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Get transcript in specific format (json, srt, vtt, txt) curl "https://api.audiopod.ai/api/v1/transcribe/jobs/JOB_ID/transcript?format=srt" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # List jobs curl "https://api.audiopod.ai/api/v1/transcribe/jobs?offset=0&limit=50" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Delete job curl -X DELETE "https://api.audiopod.ai/api/v1/transcribe/jobs/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY"
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)
json โ Full structured output with segments, timestamps, speakers srt โ SubRip subtitle format vtt โ WebVTT subtitle format txt โ Plain text transcript
Remove background noise from audio/video files.
# Denoise and wait for result result = client.denoiser.denoise(file="./noisy-audio.mp3", timeout=600) print(f"Clean audio: {result['output_url']}") # From URL result = client.denoiser.denoise(url="https://example.com/noisy.mp3") # Async: submit then poll job = client.denoiser.create(file="./noisy-audio.mp3") result = client.denoiser.wait_for_completion(job["id"], timeout=600) # From URL (async) job = client.denoiser.create(url="https://example.com/noisy.mp3") # Job management jobs = client.denoiser.list(skip=0, limit=50, status="COMPLETED") job = client.denoiser.get(job_id=123) client.denoiser.delete(job_id=123)
# Denoise from file curl -X POST "https://api.audiopod.ai/api/v1/denoiser/denoise" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -F "file=@noisy-audio.mp3" # Denoise from URL curl -X POST "https://api.audiopod.ai/api/v1/denoiser/denoise" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -F "url=https://example.com/noisy.mp3" # Check job status curl "https://api.audiopod.ai/api/v1/denoiser/jobs/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # List jobs curl "https://api.audiopod.ai/api/v1/denoiser/jobs?skip=0&limit=50" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Delete job curl -X DELETE "https://api.audiopod.ai/api/v1/denoiser/jobs/JOB_ID" \ -H "X-API-Key: $AUDIOPOD_API_KEY"
Check balance, estimate costs, and view usage history.
# Get current balance balance = client.wallet.get_balance() print(f"Balance: ${balance['balance_usd']}") # Check if balance is sufficient for an operation check = client.wallet.check_balance( service_type="stem_extraction", duration_seconds=180 ) print(f"Sufficient: {check['sufficient']}") # Estimate cost before running estimate = client.wallet.estimate_cost( service_type="transcription", duration_seconds=300 ) print(f"Cost: ${estimate['cost_usd']}") # Get pricing for all services pricing = client.wallet.get_pricing() # View usage history usage = client.wallet.get_usage(page=1, limit=50)
# Get balance curl "https://api.audiopod.ai/api/v1/api-wallet/balance" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Check balance sufficiency curl -X POST "https://api.audiopod.ai/api/v1/api-wallet/check-balance" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"service_type":"stem_extraction","duration_seconds":180}' # Estimate cost curl -X POST "https://api.audiopod.ai/api/v1/api-wallet/estimate-cost" \ -H "X-API-Key: $AUDIOPOD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"service_type":"transcription","duration_seconds":300}' # Get pricing curl "https://api.audiopod.ai/api/v1/api-wallet/pricing" \ -H "X-API-Key: $AUDIOPOD_API_KEY" # Usage history curl "https://api.audiopod.ai/api/v1/api-wallet/usage?page=1&limit=50" \ -H "X-API-Key: $AUDIOPOD_API_KEY"
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
Two auth styles work: X-API-Key: ap_... โ works for most endpoints Authorization: Bearer ap_... โ works for TTS generate/status
SDK method signatures may differ from raw API โ when in doubt, use cURL examples TTS output stored on Cloudflare R2, download via output_url in job status TTS output files may be WAV disguised as .mp3 โ convert with ffmpeg before sending via WhatsApp
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.