Real-time AI music detection over WebSocket. Per-window vocal-AI and instrumental-AI results are emitted progressively as audio arrives, followed by a final clip-level summary.
WSS
/
api
/
velma-2-ai-music-detection-streaming
Real-time AI music detection over WebSocket. The client streams audio and receives per-window vocal-AI and instrumental-AI results as they become available, followed by a final clip-level summary on completion.
Container formats - sample_rate and num_channels are ignored if supplied (the headers already carry this metadata):mp3, wav, flac, m4a, mp4, ogg, opus, webm, aac, aiff, wma, amr, and au, plus 66 others
Per-window result - emitted for each completed 4-second window, in order
{"type": "done", ...}
Stream complete - clip-level verdict plus instrumental AI detection
{"type": "error", "error": "..."}
An error occurred - connection will close
Vocal AI and instrumental AI are both scored independently on each 4-second window as audio arrives and reported in window messages - a window can carry both scores, one, or neither, depending on how much of each content type it contains. The window-level instrumental score is computed from a single short window, so it can be less accurate than the clip-level score in the final done message, which is computed from the full accumulated audio.
Percentage of the window containing vocal content (0-100)
vocal_ai_probability
float or null
Probability the window contains AI-generated vocals (0-1). null if the window doesn’t have enough vocal content to score, was too short to analyse, or no content was found to classify
vocal_ai_confidence
float or null
Confidence in vocal_ai_probability (0-1); null under the same conditions as that field
instrumental_percentage
float
Percentage of the window containing instrumental music content (0-100)
instrumental_ai_probability
float or null
Probability the window contains AI-generated instrumental content (0-1), from a single-window analysis (lower accuracy than the done message’s clip-level score). null if the window is mostly silence, instrumental-AI detection is unavailable, or the window’s audio could not be analysed
instrumental_ai_confidence
float or null
Confidence in instrumental_ai_probability (0-1); null under the same conditions as that field
silence_percentage
float
Percentage of the window containing neither vocal nor instrumental content (0-100)
vocal_ai_probability/vocal_ai_confidence and instrumental_ai_probability/instrumental_ai_confidence are gated and scored independently, so a window can carry both pairs, one, or neither.
Total duration of the streamed audio in milliseconds
window_count
integer
Total number of windows analysed during the session
primary_verdict
string
Clip-level classification: "ai-vocal-music", "ai-instrumental", or "not-ai-music"
vocal_percentage
float
Average percentage of audio with vocal content, across all windows (0-100)
vocal_ai_percentage
float
Percentage of the full clip duration classified as AI-generated vocals (0-100), recomputed at end-of-stream. May differ from what the live per-window messages suggested
vocal_ai_confidence
float
Average confidence across frames classified as AI-generated vocals, from the end-of-stream recompute (0-1); 0 if none were found
instrumental_percentage
float
Average percentage of audio with instrumental content, across all windows (0-100)
instrumental_ai_percentage
float
AI detection score for the clip’s instrumental content (0-100), computed once at end-of-stream from the full accumulated audio - more reliable than the live per-window instrumental_ai_probability values
instrumental_ai_confidence
float
Confidence in the instrumental AI assessment for the full clip (0-1)
silence_percentage
float
Average percentage of audio with neither vocal nor instrumental content (0-100)
{"docsConfig":{"theme":"sequoia","$schema":"https://mintlify.com/docs.json","name":"Modulate","description":"Build with the modulate.ai models — real-time transcription, deepfake detection, and PII/PHI redaction at scale.","colors":{"primary":"#285FEB","light":"#5B82F0","dark":"#285FEB"},"logo":{"light":"https://mintcdn.com/modulateai/0NHKM9zXEnghoEfZ/images/wordmark-navy.svg?fit=max\u0026auto=format\u0026n=0NHKM9zXEnghoEfZ\u0026q=85\u0026s=7ee7a19111bb0154aa2e6934ebd29607","dark":"https://mintcdn.com/modulateai/0NHKM9zXEnghoEfZ/images/wordmark-white.svg?fit=max\u0026auto=format\u0026n=0NHKM9zXEnghoEfZ\u0026q=85\u0026s=98ae552c2cd0d6bf2268f8374825c88a","href":"https://modulate.ai"},"favicon":"https://mintcdn.com/modulateai/0NHKM9zXEnghoEfZ/images/favicon.svg?fit=max\u0026auto=format\u0026n=0NHKM9zXEnghoEfZ\u0026q=85\u0026s=d8e2a95af577097e3287379354855376","appearance":{"default":"system"},"navbar":{"links":[{"href":"https://platform.modulate.ai/signin","label":"Sign in"}],"primary":{"type":"button","label":"Start building free","href":"https://platform.modulate.ai/signup-request"}},"footer":{"socials":{"website":"https://modulate.ai"},"links":[{"header":"Product","items":[{"label":"Modulate","href":"https://modulate.ai"},{"label":"Velma Preview","href":"https://preview.modulate.ai"}]},{"header":"Support","items":[{"label":"Email support","href":"mailto:support@modulate.ai"},{"label":"Privacy policy","href":"https://www.modulate.ai/privacy-policy"},{"label":"Report a vulnerability","href":"/security"}]}]},"integrations":{"ga4":{"measurementId":"G-0WV1JKWMB3"}},"contextual":{"options":["copy","view","assistant","chatgpt","claude","perplexity"],"display":"header"},"markdown":{"schema":true},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"modulateai","hasAudioNarration":false,"actualSubdomain":"modulateai","customDomains":["docs.modulate.ai"],"gitSource":{"type":"gitlab","owner":"modulate","repo":"modulate-user-docs","projectId":81929608,"deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae8b8d621d86b83cef2b55b","collectionId":"edb8ba97-3e05-4ed6-950a-9032b207844d","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae8b8d621d86b83cef2b55b"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae8b8d621d86b83cef2b55b","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"API Reference","count":31},{"language":"default","tag":"Velma","count":17},{"language":"default","tag":"Get Started","count":16},{"language":"default","tag":"By capability","count":10},{"language":"default","tag":"Speech-to-text Transcription","count":7},{"language":"default","tag":"Detection packages","count":7},{"language":"default","tag":"Benchmarks","count":6},{"language":"default","tag":"Support","count":4},{"language":"default","tag":"Behaviors","count":4},{"language":"default","tag":"AI Music Detection","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@modulate.ai","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/ai-music-detection/streaming","slug":"/api-reference/ai-music-detection/streaming","pageMetadata":{"title":"AI Music Detection Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_ai_music_detection_streaming.yaml streaming-detection","description":"Real-time AI music detection over WebSocket. Per-window vocal-AI and instrumental-AI results are emitted progressively as audio arrives, followed by a final clip-level summary.","href":"/api-reference/ai-music-detection/streaming"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Real-time AI music detection over WebSocket. Per-window vocal-AI and instrumental-AI results are emitted progressively as audio arrives, followed by a final clip-level summary.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,CodeBlock,Heading,Note,Table}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Real-time AI music detection over WebSocket. The client streams audio and receives per-window vocal-AI and instrumental-AI results as they become available, followed by a final clip-level summary on completion.`}),`\n`,_jsx(Heading,{level:`2`,id:`endpoint`,children:`Endpoint`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`wss://platform.modulate.ai/api/velma-2-ai-music-detection-streaming`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`authentication`,children:`Authentication`}),`\n`,_jsx(_components.p,{children:`Pass your API key as a query parameter on the connection URL:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`wss://.../velma-2-ai-music-detection-streaming?api_key=YOUR_API_KEY\u0026audio_format=mp3`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`connection-parameters`,children:`Connection parameters`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Parameter`}),_jsx(_components.th,{children:`Required`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`api_key`})}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`Your API key`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`audio_format`})}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`Audio format - see supported formats below`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sample_rate`})}),_jsx(_components.td,{children:`Raw PCM only`}),_jsx(_components.td,{children:`Sample rate in Hz`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`num_channels`})}),_jsx(_components.td,{children:`Raw PCM only`}),_jsx(_components.td,{children:`Number of channels (1-8)`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`supported-audio-formats`,children:`Supported audio formats`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Container formats`}),` - `,_jsx(_components.code,{children:`sample_rate`}),` and `,_jsx(_components.code,{children:`num_channels`}),` are ignored if supplied (the headers already carry this metadata):`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`mp3`}),`, `,_jsx(_components.code,{children:`wav`}),`, `,_jsx(_components.code,{children:`flac`}),`, `,_jsx(_components.code,{children:`m4a`}),`, `,_jsx(_components.code,{children:`mp4`}),`, `,_jsx(_components.code,{children:`ogg`}),`, `,_jsx(_components.code,{children:`opus`}),`, `,_jsx(_components.code,{children:`webm`}),`, `,_jsx(_components.code,{children:`aac`}),`, `,_jsx(_components.code,{children:`aiff`}),`, `,_jsx(_components.code,{children:`wma`}),`, `,_jsx(_components.code,{children:`amr`}),`, and `,_jsx(_components.code,{children:`au`}),`, plus 66 others`]}),`\n`,_jsx(Accordion,{title:`All 79 accepted container values`,id:`all-79-accepted-container-values`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`3g2`}),`, `,_jsx(_components.code,{children:`3ga`}),`, `,_jsx(_components.code,{children:`3gp`}),`, `,_jsx(_components.code,{children:`3gpp`}),`, `,_jsx(_components.code,{children:`8svx`}),`, `,_jsx(_components.code,{children:`aa3`}),`, `,_jsx(_components.code,{children:`aac`}),`, `,_jsx(_components.code,{children:`ac3`}),`, `,_jsx(_components.code,{children:`act`}),`, `,_jsx(_components.code,{children:`adts`}),`, `,_jsx(_components.code,{children:`aif`}),`, `,_jsx(_components.code,{children:`aifc`}),`, `,_jsx(_components.code,{children:`aiff`}),`,\n`,_jsx(_components.code,{children:`amb`}),`, `,_jsx(_components.code,{children:`amr`}),`, `,_jsx(_components.code,{children:`asf`}),`, `,_jsx(_components.code,{children:`at3`}),`, `,_jsx(_components.code,{children:`au`}),`, `,_jsx(_components.code,{children:`avr`}),`, `,_jsx(_components.code,{children:`awb`}),`, `,_jsx(_components.code,{children:`bwf`}),`, `,_jsx(_components.code,{children:`c2`}),`, `,_jsx(_components.code,{children:`caf`}),`, `,_jsx(_components.code,{children:`dss`}),`, `,_jsx(_components.code,{children:`dts`}),`, `,_jsx(_components.code,{children:`dtshd`}),`,\n`,_jsx(_components.code,{children:`eac3`}),`, `,_jsx(_components.code,{children:`ec3`}),`, `,_jsx(_components.code,{children:`f4a`}),`, `,_jsx(_components.code,{children:`f4b`}),`, `,_jsx(_components.code,{children:`flac`}),`, `,_jsx(_components.code,{children:`gsm`}),`, `,_jsx(_components.code,{children:`iff`}),`, `,_jsx(_components.code,{children:`m2a`}),`, `,_jsx(_components.code,{children:`m2ts`}),`, `,_jsx(_components.code,{children:`m4a`}),`, `,_jsx(_components.code,{children:`m4b`}),`, `,_jsx(_components.code,{children:`m4r`}),`, `,_jsx(_components.code,{children:`m4v`}),`,\n`,_jsx(_components.code,{children:`mka`}),`, `,_jsx(_components.code,{children:`mkv`}),`, `,_jsx(_components.code,{children:`mlp`}),`, `,_jsx(_components.code,{children:`mp+`}),`, `,_jsx(_components.code,{children:`mp1`}),`, `,_jsx(_components.code,{children:`mp2`}),`, `,_jsx(_components.code,{children:`mp3`}),`, `,_jsx(_components.code,{children:`mp4`}),`, `,_jsx(_components.code,{children:`mpa`}),`, `,_jsx(_components.code,{children:`mpc`}),`, `,_jsx(_components.code,{children:`mpga`}),`, `,_jsx(_components.code,{children:`mpp`}),`, `,_jsx(_components.code,{children:`mts`}),`,\n`,_jsx(_components.code,{children:`oga`}),`, `,_jsx(_components.code,{children:`ogg`}),`, `,_jsx(_components.code,{children:`ogx`}),`, `,_jsx(_components.code,{children:`oma`}),`, `,_jsx(_components.code,{children:`omg`}),`, `,_jsx(_components.code,{children:`opus`}),`, `,_jsx(_components.code,{children:`paf`}),`, `,_jsx(_components.code,{children:`pvf`}),`, `,_jsx(_components.code,{children:`qcp`}),`, `,_jsx(_components.code,{children:`ra`}),`, `,_jsx(_components.code,{children:`rf64`}),`, `,_jsx(_components.code,{children:`rm`}),`, `,_jsx(_components.code,{children:`rmvb`}),`,\n`,_jsx(_components.code,{children:`snd`}),`, `,_jsx(_components.code,{children:`svx`}),`, `,_jsx(_components.code,{children:`thd`}),`, `,_jsx(_components.code,{children:`ts`}),`, `,_jsx(_components.code,{children:`tta`}),`, `,_jsx(_components.code,{children:`voc`}),`, `,_jsx(_components.code,{children:`vqf`}),`, `,_jsx(_components.code,{children:`w64`}),`, `,_jsx(_components.code,{children:`wav`}),`, `,_jsx(_components.code,{children:`wave`}),`, `,_jsx(_components.code,{children:`weba`}),`, `,_jsx(_components.code,{children:`webm`}),`, `,_jsx(_components.code,{children:`wma`}),`,\n`,_jsx(_components.code,{children:`wmv`})]})}),`\n`,_jsxs(_components.p,{children:[`The MP4-family values (`,_jsx(_components.code,{children:`mp4`}),`, `,_jsx(_components.code,{children:`m4a`}),`, `,_jsx(_components.code,{children:`m4b`}),`, `,_jsx(_components.code,{children:`m4r`}),`, `,_jsx(_components.code,{children:`m4v`}),`, `,_jsx(_components.code,{children:`3gp`}),`, `,_jsx(_components.code,{children:`3gpp`}),`, `,_jsx(_components.code,{children:`3ga`}),`, `,_jsx(_components.code,{children:`3g2`}),`, `,_jsx(_components.code,{children:`f4a`}),`, `,_jsx(_components.code,{children:`f4b`}),`) must be sent in a streamable layout; otherwise the connection ends with an audio-processing error.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Raw PCM formats`}),` - `,_jsx(_components.code,{children:`sample_rate`}),` and `,_jsx(_components.code,{children:`num_channels`}),` are required:`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`s8`}),`, `,_jsx(_components.code,{children:`s16le`}),`, `,_jsx(_components.code,{children:`s16be`}),`, `,_jsx(_components.code,{children:`s24le`}),`, `,_jsx(_components.code,{children:`s24be`}),`, `,_jsx(_components.code,{children:`s32le`}),`, `,_jsx(_components.code,{children:`s32be`}),`, `,_jsx(_components.code,{children:`u8`}),`, `,_jsx(_components.code,{children:`u16le`}),`, `,_jsx(_components.code,{children:`u16be`}),`, `,_jsx(_components.code,{children:`u24le`}),`, `,_jsx(_components.code,{children:`u24be`}),`, `,_jsx(_components.code,{children:`u32le`}),`, `,_jsx(_components.code,{children:`u32be`}),`, `,_jsx(_components.code,{children:`f32le`}),`, `,_jsx(_components.code,{children:`f32be`}),`, `,_jsx(_components.code,{children:`f64le`}),`, `,_jsx(_components.code,{children:`f64be`}),`, `,_jsx(_components.code,{children:`mulaw`}),`, `,_jsx(_components.code,{children:`alaw`}),`, `,_jsx(_components.code,{children:`g722`}),`, `,_jsx(_components.code,{children:`vox`})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`g722`}),` and `,_jsx(_components.code,{children:`vox`}),` are mono-only: `,_jsx(_components.code,{children:`num_channels`}),` must be `,_jsx(_components.code,{children:`1`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Valid sample rates:`}),` 8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000`]}),`\n`,_jsx(Heading,{level:`2`,id:`protocol`,children:`Protocol`}),`\n`,_jsx(Heading,{level:`3`,id:`client->-server`,children:`Client -> server`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Message`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Binary frame`}),_jsx(_components.td,{children:`Chunk of audio bytes in the declared format (any size)`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Empty text frame `,_jsx(_components.code,{children:`\"\"`})]}),_jsx(_components.td,{children:`Signals end of stream`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`server->-client`,children:`Server -> client`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Message`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`{\"type\": \"window\", \"window\": {...}}`})}),_jsx(_components.td,{children:`Per-window result - emitted for each completed 4-second window, in order`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`{\"type\": \"done\", ...}`})}),_jsx(_components.td,{children:`Stream complete - clip-level verdict plus instrumental AI detection`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`{\"type\": \"error\", \"error\": \"...\"}`})}),_jsx(_components.td,{children:`An error occurred - connection will close`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Vocal AI and instrumental AI are both scored independently on each 4-second window as audio arrives and reported in `,_jsx(_components.code,{children:`window`}),` messages - a window can carry both scores, one, or neither, depending on how much of each content type it contains. The window-level instrumental score is computed from a single short window, so it can be less accurate than the clip-level score in the final `,_jsx(_components.code,{children:`done`}),` message, which is computed from the full accumulated audio.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`window-object`,children:`Window object`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`start_time_ms`})}),_jsx(_components.td,{children:`integer`}),_jsx(_components.td,{children:`Window start time in milliseconds`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`end_time_ms`})}),_jsx(_components.td,{children:`integer`}),_jsx(_components.td,{children:`Window end time in milliseconds`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vocal_percentage`})}),_jsx(_components.td,{children:`float`}),_jsx(_components.td,{children:`Percentage of the window containing vocal content (0-100)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vocal_ai_probability`})}),_jsxs(_components.td,{children:[`float or `,_jsx(_components.code,{children:`null`})]}),_jsxs(_components.td,{children:[`Probability the window contains AI-generated vocals (0-1). `,_jsx(_components.code,{children:`null`}),` if the window doesn’t have enough vocal content to score, was too short to analyse, or no content was found to classify`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vocal_ai_confidence`})}),_jsxs(_components.td,{children:[`float or `,_jsx(_components.code,{children:`null`})]}),_jsxs(_components.td,{children:[`Confidence in `,_jsx(_components.code,{children:`vocal_ai_probability`}),` (0-1); `,_jsx(_components.code,{children:`null`}),` under the same conditions as that field`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`instrumental_percentage`})}),_jsx(_components.td,{children:`float`}),_jsx(_components.td,{children:`Percentage of the window containing instrumental music content (0-100)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`instrumental_ai_probability`})}),_jsxs(_components.td,{children:[`float or `,_jsx(_components.code,{children:`null`})]}),_jsxs(_components.td,{children:[`Probability the window contains AI-generated instrumental content (0-1), from a single-window analysis (lower accuracy than the `,_jsx(_components.code,{children:`done`}),` message’s clip-level score). `,_jsx(_components.code,{children:`null`}),` if the window is mostly silence, instrumental-AI detection is unavailable, or the window’s audio could not be analysed`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`instrumental_ai_confidence`})}),_jsxs(_components.td,{children:[`float or `,_jsx(_components.code,{children:`null`})]}),_jsxs(_components.td,{children:[`Confidence in `,_jsx(_components.code,{children:`instrumental_ai_probability`}),` (0-1); `,_jsx(_components.code,{children:`null`}),` under the same conditions as that field`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`silence_percentage`})}),_jsx(_components.td,{children:`float`}),_jsx(_components.td,{children:`Percentage of the window containing neither vocal nor instrumental content (0-100)`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`vocal_ai_probability`}),`/`,_jsx(_components.code,{children:`vocal_ai_confidence`}),` and `,_jsx(_components.code,{children:`instrumental_ai_probability`}),`/`,_jsx(_components.code,{children:`instrumental_ai_confidence`}),` are gated and scored independently, so a window can carry both pairs, one, or neither.`]}),`\n`,_jsx(Heading,{level:`3`,id:`done-object`,children:`Done object`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`duration_ms`})}),_jsx(_components.td,{children:`integer`}),_jsx(_components.td,{children:`Total duration of the streamed audio in milliseconds`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`window_count`})}),_jsx(_components.td,{children:`integer`}),_jsx(_components.td,{children:`Total number of windows analysed during the session`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`primary_verdict`})}),_jsx(_components.td,{children:`string`}),_jsxs(_components.td,{children:[`Clip-level classification: `,_jsx(_components.code,{children:`\"ai-vocal-music\"`}),`, `,_jsx(_components.code,{children:`\"ai-instrumental\"`}),`, or `,_jsx(_components.code,{children:`\"not-ai-music\"`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vocal_percentage`})}),_jsx(_components.td,{children:`float`}),_jsx(_components.td,{children:`Average percentage of audio with vocal content, across all windows (0-100)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vocal_ai_percentage`})}),_jsx(_components.td,{children:`float`}),_jsx(_components.td,{children:`Percentage of the full clip duration classified as AI-generated vocals (0-100), recomputed at end-of-stream. May differ from what the live per-window messages suggested`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vocal_ai_confidence`})}),_jsx(_components.td,{children:`float`}),_jsxs(_components.td,{children:[`Average confidence across frames classified as AI-generated vocals, from the end-of-stream recompute (0-1); `,_jsx(_components.code,{children:`0`}),` if none were found`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`instrumental_percentage`})}),_jsx(_components.td,{children:`float`}),_jsx(_components.td,{children:`Average percentage of audio with instrumental content, across all windows (0-100)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`instrumental_ai_percentage`})}),_jsx(_components.td,{children:`float`}),_jsxs(_components.td,{children:[`AI detection score for the clip’s instrumental content (0-100), computed once at end-of-stream from the full accumulated audio - more reliable than the live per-window `,_jsx(_components.code,{children:`instrumental_ai_probability`}),` values`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`instrumental_ai_confidence`})}),_jsx(_components.td,{children:`float`}),_jsx(_components.td,{children:`Confidence in the instrumental AI assessment for the full clip (0-1)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`silence_percentage`})}),_jsx(_components.td,{children:`float`}),_jsx(_components.td,{children:`Average percentage of audio with neither vocal nor instrumental content (0-100)`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`websocket-close-codes`,children:`WebSocket close codes`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Code`}),_jsx(_components.th,{children:`Meaning`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1000`})}),_jsxs(_components.td,{children:[`Normal closure after the `,_jsx(_components.code,{children:`done`}),` message, or after the connection completes`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1003`})}),_jsxs(_components.td,{children:[`Invalid or missing query parameters (unknown format, bad sample rate, missing `,_jsx(_components.code,{children:`audio_format`}),`)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1011`})}),_jsx(_components.td,{children:`Internal server error, or processing ended before completion`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4001`})}),_jsxs(_components.td,{children:[`The `,_jsx(_components.code,{children:`api_key`}),` query parameter is missing or invalid`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4002`})}),_jsxs(_components.td,{children:[`Audio could not be decoded, or does not match the declared raw `,_jsx(_components.code,{children:`audio_format`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4003`})}),_jsx(_components.td,{children:`The request is not permitted`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4004`})}),_jsx(_components.td,{children:`The API key does not have access to this model`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4029`})}),_jsx(_components.td,{children:`The request could not be completed due to insufficient credits`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4030`})}),_jsx(_components.td,{children:`Concurrent request limit reached`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4031`})}),_jsx(_components.td,{children:`Monthly usage limit reached`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`An `,_jsx(_components.code,{children:`error`}),` message is sent before the connection closes for every case above except `,_jsx(_components.code,{children:`1000`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`rate-limits`,children:`Rate limits`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Concurrent connection limits apply per model`}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"AI Music Detection Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_ai_music_detection_streaming.yaml streaming-detection","description":"Real-time AI music detection over WebSocket. Per-window vocal-AI and instrumental-AI results are emitted progressively as audio arrives, followed by a final clip-level summary.","href":"/api-reference/ai-music-detection/streaming"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Endpoint","slug":"endpoint","depth":2,"children":[]},{"title":"Authentication","slug":"authentication","depth":2,"children":[]},{"title":"Connection parameters","slug":"connection-parameters","depth":2,"children":[]},{"title":"Supported audio formats","slug":"supported-audio-formats","depth":2,"children":[]},{"title":"Protocol","slug":"protocol","depth":2,"children":[{"title":"Client -> server","slug":"client->-server","depth":3,"children":[]},{"title":"Server -> client","slug":"server->-client","depth":3,"children":[]},{"title":"Window object","slug":"window-object","depth":3,"children":[]},{"title":"Done object","slug":"done-object","depth":3,"children":[]}]},{"title":"WebSocket close codes","slug":"websocket-close-codes","depth":2,"children":[]},{"title":"Rate limits","slug":"rate-limits","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/modulateai/6f43a4827c59f292/hubspot.js","/_mintlify/custom/modulateai/0bb96afd82713278/swan.js","/_mintlify/custom/modulateai/476f212ab71e7bd6/hubspot-forms.js","/_mintlify/custom/modulateai/06d8e9ccae2eea7a/detection-package-download.js"],"apiReferenceData":{"channel":{"id":"streaming-detection","title":"Streaming-detection","description":"## WebSocket Close Codes\n- `1000`: Normal closure after the `done` message, or after the\n connection completes.\n- `1003`: Invalid or missing query parameters (unknown `audio_format`,\n invalid `sample_rate` or `num_channels`, a raw format missing\n `sample_rate`/`num_channels`, `sample_rate`/`num_channels` supplied\n without `audio_format`, or `audio_format` omitted). An `error` message\n is sent before the close.\n- `4002`: The audio could not be decoded, or does not match the\n declared raw `audio_format`. An `error` message is sent before the\n close.\n- `1011`: Internal server error, or processing ended before completion.\n An `error` message is sent before the close; when processing ends\n without a `done` message, the `error` message is\n \"Unable to complete the request. Please try again.\"\n- `4001`: The `api_key` query parameter is missing or invalid. An\n `error` message is sent before the close.\n- `4003`: The request is not permitted. An `error` message is sent\n before the close.\n- `4004`: The API key does not have access to this model. An `error`\n message is sent before the close.\n- `4029`: The request could not be completed due to insufficient credits.\n An `error` message is sent before the close.\n- `4030`: Concurrent request limit reached. An `error` message is sent\n before the close.\n- `4031`: Monthly usage limit reached. An `error` message is sent before\n the close.\n","servers":[{"id":"production","protocol":"wss","host":"platform.modulate.ai","bindings":[],"variables":[]}],"address":"/api/velma-2-ai-music-detection-streaming","parameters":[],"bindings":[{"protocol":"ws","version":"latest","value":{"query":{"type":"object","required":["api_key","audio_format"],"properties":{"api_key":{"type":"string","description":"API key used for authentication and usage tracking."},"audio_format":{"type":"string","description":"Audio encoding format. Required for all connections. Raw formats\n(headerless samples) also require `sample_rate` and\n`num_channels`; container formats carry that metadata in the\nstream, so those parameters are ignored if supplied. The MP4-family\nvalues (`mp4`, `m4a`, `m4b`, `m4r`, `m4v`, `3gp`, `3gpp`,\n`3ga`, `3g2`, `f4a`, `f4b`) must be sent in a streamable\nlayout; otherwise the connection ends with an\naudio-processing error.\nThe raw `g722` and `vox` formats are mono-only (`num_channels`\nmust be `1`).\n","enum":["s8","s16le","s16be","s24le","s24be","s32le","s32be","u8","u16le","u16be","u24le","u24be","u32le","u32be","f32le","f32be","f64le","f64be","mulaw","alaw","g722","vox","3g2","3ga","3gp","3gpp","8svx","aa3","aac","ac3","act","adts","aif","aifc","aiff","amb","amr","asf","at3","au","avr","awb","bwf","c2","caf","dss","dts","dtshd","eac3","ec3","f4a","f4b","flac","gsm","iff","m2a","m2ts","m4a","m4b","m4r","m4v","mka","mkv","mlp","mp+","mp1","mp2","mp3","mp4","mpa","mpc","mpga","mpp","mts","oga","ogg","ogx","oma","omg","opus","paf","pvf","qcp","ra","rf64","rm","rmvb","snd","svx","thd","ts","tta","voc","vqf","w64","wav","wave","weba","webm","wma","wmv"],"examples":["s16le","f32le","mulaw","webm"]},"sample_rate":{"type":"integer","description":"Sample rate in Hz. **Required** when `audio_format` is a raw\nformat. Not required and ignored for container formats. Must\nnot be specified without `audio_format`.\n","enum":[8000,11025,16000,22050,32000,44100,48000,96000],"examples":[16000,48000]},"num_channels":{"type":"integer","description":"Number of audio channels. **Required** when `audio_format` is\na raw format. Must be between 1 and 8. Not required and\nignored for container formats. Must not be specified without\n`audio_format`.\n","minimum":1,"maximum":8,"examples":[1,2]}}}},"schemaProperties":[{"name":"query","type":"object","required":false,"properties":[{"name":"api_key","type":"string","description":"API key used for authentication and usage tracking.","required":true},{"name":"audio_format","type":"string","description":"Audio encoding format. Required for all connections. Raw formats\n(headerless samples) also require `sample_rate` and\n`num_channels`; container formats carry that metadata in the\nstream, so those parameters are ignored if supplied. The MP4-family\nvalues (`mp4`, `m4a`, `m4b`, `m4r`, `m4v`, `3gp`, `3gpp`,\n`3ga`, `3g2`, `f4a`, `f4b`) must be sent in a streamable\nlayout; otherwise the connection ends with an\naudio-processing error.\nThe raw `g722` and `vox` formats are mono-only (`num_channels`\nmust be `1`).\n","enumValues":["s8","s16le","s16be","s24le","s24be","s32le","s32be","u8","u16le","u16be","u24le","u24be","u32le","u32be","f32le","f32be","f64le","f64be","mulaw","alaw","g722","vox","3g2","3ga","3gp","3gpp","8svx","aa3","aac","ac3","act","adts","aif","aifc","aiff","amb","amr","asf","at3","au","avr","awb","bwf","c2","caf","dss","dts","dtshd","eac3","ec3","f4a","f4b","flac","gsm","iff","m2a","m2ts","m4a","m4b","m4r","m4v","mka","mkv","mlp","mp+","mp1","mp2","mp3","mp4","mpa","mpc","mpga","mpp","mts","oga","ogg","ogx","oma","omg","opus","paf","pvf","qcp","ra","rf64","rm","rmvb","snd","svx","thd","ts","tta","voc","vqf","w64","wav","wave","weba","webm","wma","wmv"],"examples":["s16le","f32le","mulaw","webm"],"required":true},{"name":"sample_rate","type":"integer","description":"Sample rate in Hz. **Required** when `audio_format` is a raw\nformat. Not required and ignored for container formats. Must\nnot be specified without `audio_format`.\n","enumValues":[8000,11025,16000,22050,32000,44100,48000,96000],"examples":[16000,48000],"required":false},{"name":"num_channels","type":"integer","description":"Number of audio channels. **Required** when `audio_format` is\na raw format. Must be between 1 and 8. Not required and\nignored for container formats. Must not be specified without\n`audio_format`.\n","examples":[1,2],"required":false}]}]}],"operations":[{"id":"sendAudio","title":"Send audio","description":"Stream audio data to the server.","type":"send","messages":[{"id":"audioData","contentType":"application/octet-stream","payload":[{"type":"string","format":"binary","description":"A binary frame containing audio samples.","x-parser-schema-id":"\u003canonymous-schema-1>","name":"Audio Data"}],"headers":[],"jsonPayloadSchema":{"type":"string","format":"binary","description":"Audio data in the format declared by the `audio_format` query\nparameter. For raw formats this is headerless samples; for\ncontainer formats this is the encoded byte stream. Frames may\nbe any size; the server buffers internally.\n","x-parser-schema-id":"\u003canonymous-schema-1>"},"title":"Audio Data","description":"A binary frame containing audio samples.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"audioData"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"signalEnd","title":"Signal end","description":"Signal end of audio stream.","type":"send","messages":[{"id":"endOfStream","contentType":"text/plain","payload":[{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>","name":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio."}],"headers":[],"jsonPayloadSchema":{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>"},"title":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"endOfStream"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"receiveWindowResult","title":"Receive window result","description":"Receive a per-window detection result.","type":"receive","messages":[{"id":"windowResult","contentType":"application/json","payload":[{"name":"Window Result","description":"A single 4-second window detection result.","type":"object","properties":[{"name":"type","type":"string","description":"window","required":true},{"name":"window","type":"object","required":true,"properties":[{"name":"start_time_ms","type":"integer","description":"Window start time in the audio stream, in milliseconds.","examples":[0],"required":true},{"name":"end_time_ms","type":"integer","description":"Window end time in the audio stream, in milliseconds.","examples":[4000],"required":true},{"name":"vocal_percentage","type":"number","description":"Percentage of this window that contains vocal content.\n","examples":[87.5],"required":true},{"name":"vocal_ai_probability","type":["number","null"],"description":"Probability that this window contains AI-generated vocals. `null` if the window does not have enough vocal content to score, was too short to analyse, or no content was found to classify - independent of `instrumental_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.97],"required":true},{"name":"vocal_ai_confidence","type":["number","null"],"description":"Confidence in `vocal_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.97],"required":true},{"name":"instrumental_percentage","type":"number","description":"Percentage of this window that contains instrumental music content.\n","examples":[64.3],"required":true},{"name":"instrumental_ai_probability","type":["number","null"],"description":"Probability that this window contains AI-generated instrumental content, from a single-window analysis (lower accuracy than the `done` message's clip-level instrumental score). `null` if the window is mostly silence, instrumental-AI detection is unavailable, or the window's audio could not be analysed - independent of `vocal_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.42],"required":true},{"name":"instrumental_ai_confidence","type":["number","null"],"description":"Confidence in `instrumental_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.16],"required":true},{"name":"silence_percentage","type":"number","description":"Percentage of this window that contains neither vocal nor instrumental content.\n","examples":[3.5],"required":true}]}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","window"],"properties":{"type":{"type":"string","const":"window","x-parser-schema-id":"\u003canonymous-schema-3>"},"window":{"type":"object","required":["start_time_ms","end_time_ms","vocal_percentage","vocal_ai_probability","vocal_ai_confidence","instrumental_percentage","instrumental_ai_probability","instrumental_ai_confidence","silence_percentage"],"properties":{"start_time_ms":{"type":"integer","minimum":0,"description":"Window start time in the audio stream, in milliseconds.","examples":[0],"x-parser-schema-id":"\u003canonymous-schema-4>"},"end_time_ms":{"type":"integer","minimum":0,"description":"Window end time in the audio stream, in milliseconds.","examples":[4000],"x-parser-schema-id":"\u003canonymous-schema-5>"},"vocal_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Percentage of this window that contains vocal content.\n","examples":[87.5],"x-parser-schema-id":"\u003canonymous-schema-6>"},"vocal_ai_probability":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Probability that this window contains AI-generated vocals. `null` if the window does not have enough vocal content to score, was too short to analyse, or no content was found to classify - independent of `instrumental_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.97],"x-parser-schema-id":"\u003canonymous-schema-7>"},"vocal_ai_confidence":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Confidence in `vocal_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.97],"x-parser-schema-id":"\u003canonymous-schema-8>"},"instrumental_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Percentage of this window that contains instrumental music content.\n","examples":[64.3],"x-parser-schema-id":"\u003canonymous-schema-9>"},"instrumental_ai_probability":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Probability that this window contains AI-generated instrumental content, from a single-window analysis (lower accuracy than the `done` message's clip-level instrumental score). `null` if the window is mostly silence, instrumental-AI detection is unavailable, or the window's audio could not be analysed - independent of `vocal_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.42],"x-parser-schema-id":"\u003canonymous-schema-10>"},"instrumental_ai_confidence":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Confidence in `instrumental_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.16],"x-parser-schema-id":"\u003canonymous-schema-11>"},"silence_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Percentage of this window that contains neither vocal nor instrumental content.\n","examples":[3.5],"x-parser-schema-id":"\u003canonymous-schema-12>"}},"x-parser-schema-id":"WindowResult"}},"x-parser-schema-id":"WindowResultMessage"},"title":"Window Result","description":"A single 4-second window detection result.","example":"{\n \"type\": \"\u003cstring>\",\n \"window\": {\n \"start_time_ms\": 123,\n \"end_time_ms\": 123,\n \"vocal_percentage\": 123,\n \"instrumental_percentage\": 123,\n \"silence_percentage\": 123\n }\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"windowResult"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"receiveDone","title":"Receive done","description":"Receive the final clip-level summary when analysis is complete.","type":"receive","messages":[{"id":"done","contentType":"application/json","payload":[{"name":"Done","description":"Analysis complete - final clip-level verdict has been computed.","type":"object","properties":[{"name":"type","type":"string","description":"done","required":true},{"name":"duration_ms","type":"integer","description":"Total duration of the streamed audio in milliseconds.","examples":[89280],"required":true},{"name":"window_count","type":"integer","description":"Total number of windows analysed during the session.","examples":[22],"required":true},{"name":"primary_verdict","type":"string","description":"Clip-level classification:\n- `ai-vocal-music` - AI-generated music with a detected synthetic\n voice.\n- `ai-instrumental` - AI-generated instrumental music with no\n detectable synthetic voice.\n- `not-ai-music` - the clip does not appear to contain\n AI-generated music.\n","enumValues":["ai-vocal-music","ai-instrumental","not-ai-music"],"examples":["ai-vocal-music"],"required":true},{"name":"vocal_percentage","type":"number","description":"Average percentage of the audio that contains vocal content, across all windows.\n","examples":[87.5],"required":true},{"name":"vocal_ai_percentage","type":"number","description":"Clip-level AI-vocal score, on a 0-100 scale: percentage of the full clip duration classified as AI-generated vocals, recomputed at end-of-stream. May differ from what the live per-window messages suggested.\n","examples":[56.5],"required":true},{"name":"vocal_ai_confidence","type":"number","description":"Average confidence across separated-audio frames classified as AI-generated vocals, from the end-of-stream recompute. `0` if no such frame was found.\n","examples":[0.96],"required":true},{"name":"instrumental_percentage","type":"number","description":"Average percentage of the audio that contains instrumental music content, across all windows.\n","examples":[64.3],"required":true},{"name":"instrumental_ai_percentage","type":"number","description":"Clip-level AI-instrumental score, on a 0-100 scale, computed once at end-of-stream from the full accumulated audio - a larger amount of context than any single live window gets, so this is more reliable than the per-window `instrumental_ai_probability` values seen during streaming.\n","examples":[42],"required":true},{"name":"instrumental_ai_confidence","type":"number","description":"Confidence in the instrumental AI assessment for the full clip.\n","examples":[0.95],"required":true},{"name":"silence_percentage","type":"number","description":"Average percentage of the audio that contains neither vocal nor instrumental content, across all windows.\n","examples":[3.51],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","duration_ms","window_count","primary_verdict","vocal_percentage","vocal_ai_percentage","vocal_ai_confidence","instrumental_percentage","instrumental_ai_percentage","instrumental_ai_confidence","silence_percentage"],"properties":{"type":{"type":"string","const":"done","x-parser-schema-id":"\u003canonymous-schema-13>"},"duration_ms":{"type":"integer","minimum":0,"description":"Total duration of the streamed audio in milliseconds.","examples":[89280],"x-parser-schema-id":"\u003canonymous-schema-14>"},"window_count":{"type":"integer","minimum":0,"description":"Total number of windows analysed during the session.","examples":[22],"x-parser-schema-id":"\u003canonymous-schema-15>"},"primary_verdict":{"type":"string","enum":["ai-vocal-music","ai-instrumental","not-ai-music"],"description":"Clip-level classification:\n- `ai-vocal-music` - AI-generated music with a detected synthetic\n voice.\n- `ai-instrumental` - AI-generated instrumental music with no\n detectable synthetic voice.\n- `not-ai-music` - the clip does not appear to contain\n AI-generated music.\n","examples":["ai-vocal-music"],"x-parser-schema-id":"\u003canonymous-schema-16>"},"vocal_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Average percentage of the audio that contains vocal content, across all windows.\n","examples":[87.5],"x-parser-schema-id":"\u003canonymous-schema-17>"},"vocal_ai_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Clip-level AI-vocal score, on a 0-100 scale: percentage of the full clip duration classified as AI-generated vocals, recomputed at end-of-stream. May differ from what the live per-window messages suggested.\n","examples":[56.5],"x-parser-schema-id":"\u003canonymous-schema-18>"},"vocal_ai_confidence":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Average confidence across separated-audio frames classified as AI-generated vocals, from the end-of-stream recompute. `0` if no such frame was found.\n","examples":[0.96],"x-parser-schema-id":"\u003canonymous-schema-19>"},"instrumental_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Average percentage of the audio that contains instrumental music content, across all windows.\n","examples":[64.3],"x-parser-schema-id":"\u003canonymous-schema-20>"},"instrumental_ai_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Clip-level AI-instrumental score, on a 0-100 scale, computed once at end-of-stream from the full accumulated audio - a larger amount of context than any single live window gets, so this is more reliable than the per-window `instrumental_ai_probability` values seen during streaming.\n","examples":[42],"x-parser-schema-id":"\u003canonymous-schema-21>"},"instrumental_ai_confidence":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Confidence in the instrumental AI assessment for the full clip.\n","examples":[0.95],"x-parser-schema-id":"\u003canonymous-schema-22>"},"silence_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Average percentage of the audio that contains neither vocal nor instrumental content, across all windows.\n","examples":[3.51],"x-parser-schema-id":"\u003canonymous-schema-23>"}},"x-parser-schema-id":"DoneMessage"},"title":"Done","description":"Analysis complete - final clip-level verdict has been computed.","example":"{\n \"type\": \"\u003cstring>\",\n \"duration_ms\": 123,\n \"window_count\": 123,\n \"primary_verdict\": \"\u003cstring>\",\n \"vocal_percentage\": 123,\n \"vocal_ai_percentage\": 123,\n \"vocal_ai_confidence\": 123,\n \"instrumental_percentage\": 123,\n \"instrumental_ai_percentage\": 123,\n \"instrumental_ai_confidence\": 123,\n \"silence_percentage\": 123\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"done"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"receiveError","title":"Receive error","description":"Receive an error notification.","type":"receive","messages":[{"id":"error","contentType":"application/json","payload":[{"name":"Error","description":"An error occurred during connection or analysis.","type":"object","properties":[{"name":"type","type":"string","description":"error","required":true},{"name":"error","type":"string","description":"Human-readable error description.","examples":["Internal server error","Unable to complete the request. Please try again.","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","error"],"properties":{"type":{"type":"string","const":"error","x-parser-schema-id":"\u003canonymous-schema-24>"},"error":{"type":"string","description":"Human-readable error description.","examples":["Internal server error","Unable to complete the request. Please try again.","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"x-parser-schema-id":"\u003canonymous-schema-25>"}},"x-parser-schema-id":"ErrorResponse"},"title":"Error","description":"An error occurred during connection or analysis.","example":"{\n \"type\": \"\u003cstring>\",\n \"error\": \"\u003cstring>\"\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"error"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]}],"sendOperations":[{"id":"receiveWindowResult","title":"Receive window result","description":"Receive a per-window detection result.","type":"receive","messages":[{"id":"windowResult","contentType":"application/json","payload":[{"name":"Window Result","description":"A single 4-second window detection result.","type":"object","properties":[{"name":"type","type":"string","description":"window","required":true},{"name":"window","type":"object","required":true,"properties":[{"name":"start_time_ms","type":"integer","description":"Window start time in the audio stream, in milliseconds.","examples":[0],"required":true},{"name":"end_time_ms","type":"integer","description":"Window end time in the audio stream, in milliseconds.","examples":[4000],"required":true},{"name":"vocal_percentage","type":"number","description":"Percentage of this window that contains vocal content.\n","examples":[87.5],"required":true},{"name":"vocal_ai_probability","type":["number","null"],"description":"Probability that this window contains AI-generated vocals. `null` if the window does not have enough vocal content to score, was too short to analyse, or no content was found to classify - independent of `instrumental_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.97],"required":true},{"name":"vocal_ai_confidence","type":["number","null"],"description":"Confidence in `vocal_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.97],"required":true},{"name":"instrumental_percentage","type":"number","description":"Percentage of this window that contains instrumental music content.\n","examples":[64.3],"required":true},{"name":"instrumental_ai_probability","type":["number","null"],"description":"Probability that this window contains AI-generated instrumental content, from a single-window analysis (lower accuracy than the `done` message's clip-level instrumental score). `null` if the window is mostly silence, instrumental-AI detection is unavailable, or the window's audio could not be analysed - independent of `vocal_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.42],"required":true},{"name":"instrumental_ai_confidence","type":["number","null"],"description":"Confidence in `instrumental_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.16],"required":true},{"name":"silence_percentage","type":"number","description":"Percentage of this window that contains neither vocal nor instrumental content.\n","examples":[3.5],"required":true}]}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","window"],"properties":{"type":{"type":"string","const":"window","x-parser-schema-id":"\u003canonymous-schema-3>"},"window":{"type":"object","required":["start_time_ms","end_time_ms","vocal_percentage","vocal_ai_probability","vocal_ai_confidence","instrumental_percentage","instrumental_ai_probability","instrumental_ai_confidence","silence_percentage"],"properties":{"start_time_ms":{"type":"integer","minimum":0,"description":"Window start time in the audio stream, in milliseconds.","examples":[0],"x-parser-schema-id":"\u003canonymous-schema-4>"},"end_time_ms":{"type":"integer","minimum":0,"description":"Window end time in the audio stream, in milliseconds.","examples":[4000],"x-parser-schema-id":"\u003canonymous-schema-5>"},"vocal_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Percentage of this window that contains vocal content.\n","examples":[87.5],"x-parser-schema-id":"\u003canonymous-schema-6>"},"vocal_ai_probability":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Probability that this window contains AI-generated vocals. `null` if the window does not have enough vocal content to score, was too short to analyse, or no content was found to classify - independent of `instrumental_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.97],"x-parser-schema-id":"\u003canonymous-schema-7>"},"vocal_ai_confidence":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Confidence in `vocal_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.97],"x-parser-schema-id":"\u003canonymous-schema-8>"},"instrumental_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Percentage of this window that contains instrumental music content.\n","examples":[64.3],"x-parser-schema-id":"\u003canonymous-schema-9>"},"instrumental_ai_probability":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Probability that this window contains AI-generated instrumental content, from a single-window analysis (lower accuracy than the `done` message's clip-level instrumental score). `null` if the window is mostly silence, instrumental-AI detection is unavailable, or the window's audio could not be analysed - independent of `vocal_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.42],"x-parser-schema-id":"\u003canonymous-schema-10>"},"instrumental_ai_confidence":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Confidence in `instrumental_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.16],"x-parser-schema-id":"\u003canonymous-schema-11>"},"silence_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Percentage of this window that contains neither vocal nor instrumental content.\n","examples":[3.5],"x-parser-schema-id":"\u003canonymous-schema-12>"}},"x-parser-schema-id":"WindowResult"}},"x-parser-schema-id":"WindowResultMessage"},"title":"Window Result","description":"A single 4-second window detection result.","example":"{\n \"type\": \"\u003cstring>\",\n \"window\": {\n \"start_time_ms\": 123,\n \"end_time_ms\": 123,\n \"vocal_percentage\": 123,\n \"instrumental_percentage\": 123,\n \"silence_percentage\": 123\n }\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"windowResult"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"receiveDone","title":"Receive done","description":"Receive the final clip-level summary when analysis is complete.","type":"receive","messages":[{"id":"done","contentType":"application/json","payload":[{"name":"Done","description":"Analysis complete - final clip-level verdict has been computed.","type":"object","properties":[{"name":"type","type":"string","description":"done","required":true},{"name":"duration_ms","type":"integer","description":"Total duration of the streamed audio in milliseconds.","examples":[89280],"required":true},{"name":"window_count","type":"integer","description":"Total number of windows analysed during the session.","examples":[22],"required":true},{"name":"primary_verdict","type":"string","description":"Clip-level classification:\n- `ai-vocal-music` - AI-generated music with a detected synthetic\n voice.\n- `ai-instrumental` - AI-generated instrumental music with no\n detectable synthetic voice.\n- `not-ai-music` - the clip does not appear to contain\n AI-generated music.\n","enumValues":["ai-vocal-music","ai-instrumental","not-ai-music"],"examples":["ai-vocal-music"],"required":true},{"name":"vocal_percentage","type":"number","description":"Average percentage of the audio that contains vocal content, across all windows.\n","examples":[87.5],"required":true},{"name":"vocal_ai_percentage","type":"number","description":"Clip-level AI-vocal score, on a 0-100 scale: percentage of the full clip duration classified as AI-generated vocals, recomputed at end-of-stream. May differ from what the live per-window messages suggested.\n","examples":[56.5],"required":true},{"name":"vocal_ai_confidence","type":"number","description":"Average confidence across separated-audio frames classified as AI-generated vocals, from the end-of-stream recompute. `0` if no such frame was found.\n","examples":[0.96],"required":true},{"name":"instrumental_percentage","type":"number","description":"Average percentage of the audio that contains instrumental music content, across all windows.\n","examples":[64.3],"required":true},{"name":"instrumental_ai_percentage","type":"number","description":"Clip-level AI-instrumental score, on a 0-100 scale, computed once at end-of-stream from the full accumulated audio - a larger amount of context than any single live window gets, so this is more reliable than the per-window `instrumental_ai_probability` values seen during streaming.\n","examples":[42],"required":true},{"name":"instrumental_ai_confidence","type":"number","description":"Confidence in the instrumental AI assessment for the full clip.\n","examples":[0.95],"required":true},{"name":"silence_percentage","type":"number","description":"Average percentage of the audio that contains neither vocal nor instrumental content, across all windows.\n","examples":[3.51],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","duration_ms","window_count","primary_verdict","vocal_percentage","vocal_ai_percentage","vocal_ai_confidence","instrumental_percentage","instrumental_ai_percentage","instrumental_ai_confidence","silence_percentage"],"properties":{"type":{"type":"string","const":"done","x-parser-schema-id":"\u003canonymous-schema-13>"},"duration_ms":{"type":"integer","minimum":0,"description":"Total duration of the streamed audio in milliseconds.","examples":[89280],"x-parser-schema-id":"\u003canonymous-schema-14>"},"window_count":{"type":"integer","minimum":0,"description":"Total number of windows analysed during the session.","examples":[22],"x-parser-schema-id":"\u003canonymous-schema-15>"},"primary_verdict":{"type":"string","enum":["ai-vocal-music","ai-instrumental","not-ai-music"],"description":"Clip-level classification:\n- `ai-vocal-music` - AI-generated music with a detected synthetic\n voice.\n- `ai-instrumental` - AI-generated instrumental music with no\n detectable synthetic voice.\n- `not-ai-music` - the clip does not appear to contain\n AI-generated music.\n","examples":["ai-vocal-music"],"x-parser-schema-id":"\u003canonymous-schema-16>"},"vocal_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Average percentage of the audio that contains vocal content, across all windows.\n","examples":[87.5],"x-parser-schema-id":"\u003canonymous-schema-17>"},"vocal_ai_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Clip-level AI-vocal score, on a 0-100 scale: percentage of the full clip duration classified as AI-generated vocals, recomputed at end-of-stream. May differ from what the live per-window messages suggested.\n","examples":[56.5],"x-parser-schema-id":"\u003canonymous-schema-18>"},"vocal_ai_confidence":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Average confidence across separated-audio frames classified as AI-generated vocals, from the end-of-stream recompute. `0` if no such frame was found.\n","examples":[0.96],"x-parser-schema-id":"\u003canonymous-schema-19>"},"instrumental_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Average percentage of the audio that contains instrumental music content, across all windows.\n","examples":[64.3],"x-parser-schema-id":"\u003canonymous-schema-20>"},"instrumental_ai_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Clip-level AI-instrumental score, on a 0-100 scale, computed once at end-of-stream from the full accumulated audio - a larger amount of context than any single live window gets, so this is more reliable than the per-window `instrumental_ai_probability` values seen during streaming.\n","examples":[42],"x-parser-schema-id":"\u003canonymous-schema-21>"},"instrumental_ai_confidence":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Confidence in the instrumental AI assessment for the full clip.\n","examples":[0.95],"x-parser-schema-id":"\u003canonymous-schema-22>"},"silence_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Average percentage of the audio that contains neither vocal nor instrumental content, across all windows.\n","examples":[3.51],"x-parser-schema-id":"\u003canonymous-schema-23>"}},"x-parser-schema-id":"DoneMessage"},"title":"Done","description":"Analysis complete - final clip-level verdict has been computed.","example":"{\n \"type\": \"\u003cstring>\",\n \"duration_ms\": 123,\n \"window_count\": 123,\n \"primary_verdict\": \"\u003cstring>\",\n \"vocal_percentage\": 123,\n \"vocal_ai_percentage\": 123,\n \"vocal_ai_confidence\": 123,\n \"instrumental_percentage\": 123,\n \"instrumental_ai_percentage\": 123,\n \"instrumental_ai_confidence\": 123,\n \"silence_percentage\": 123\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"done"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"receiveError","title":"Receive error","description":"Receive an error notification.","type":"receive","messages":[{"id":"error","contentType":"application/json","payload":[{"name":"Error","description":"An error occurred during connection or analysis.","type":"object","properties":[{"name":"type","type":"string","description":"error","required":true},{"name":"error","type":"string","description":"Human-readable error description.","examples":["Internal server error","Unable to complete the request. Please try again.","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","error"],"properties":{"type":{"type":"string","const":"error","x-parser-schema-id":"\u003canonymous-schema-24>"},"error":{"type":"string","description":"Human-readable error description.","examples":["Internal server error","Unable to complete the request. Please try again.","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"x-parser-schema-id":"\u003canonymous-schema-25>"}},"x-parser-schema-id":"ErrorResponse"},"title":"Error","description":"An error occurred during connection or analysis.","example":"{\n \"type\": \"\u003cstring>\",\n \"error\": \"\u003cstring>\"\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"error"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]}],"receiveOperations":[{"id":"sendAudio","title":"Send audio","description":"Stream audio data to the server.","type":"send","messages":[{"id":"audioData","contentType":"application/octet-stream","payload":[{"type":"string","format":"binary","description":"A binary frame containing audio samples.","x-parser-schema-id":"\u003canonymous-schema-1>","name":"Audio Data"}],"headers":[],"jsonPayloadSchema":{"type":"string","format":"binary","description":"Audio data in the format declared by the `audio_format` query\nparameter. For raw formats this is headerless samples; for\ncontainer formats this is the encoded byte stream. Frames may\nbe any size; the server buffers internally.\n","x-parser-schema-id":"\u003canonymous-schema-1>"},"title":"Audio Data","description":"A binary frame containing audio samples.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"audioData"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"signalEnd","title":"Signal end","description":"Signal end of audio stream.","type":"send","messages":[{"id":"endOfStream","contentType":"text/plain","payload":[{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>","name":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio."}],"headers":[],"jsonPayloadSchema":{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>"},"title":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"endOfStream"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]}],"sendMessages":[{"id":"windowResult","contentType":"application/json","payload":[{"name":"Window Result","description":"A single 4-second window detection result.","type":"object","properties":[{"name":"type","type":"string","description":"window","required":true},{"name":"window","type":"object","required":true,"properties":[{"name":"start_time_ms","type":"integer","description":"Window start time in the audio stream, in milliseconds.","examples":[0],"required":true},{"name":"end_time_ms","type":"integer","description":"Window end time in the audio stream, in milliseconds.","examples":[4000],"required":true},{"name":"vocal_percentage","type":"number","description":"Percentage of this window that contains vocal content.\n","examples":[87.5],"required":true},{"name":"vocal_ai_probability","type":["number","null"],"description":"Probability that this window contains AI-generated vocals. `null` if the window does not have enough vocal content to score, was too short to analyse, or no content was found to classify - independent of `instrumental_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.97],"required":true},{"name":"vocal_ai_confidence","type":["number","null"],"description":"Confidence in `vocal_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.97],"required":true},{"name":"instrumental_percentage","type":"number","description":"Percentage of this window that contains instrumental music content.\n","examples":[64.3],"required":true},{"name":"instrumental_ai_probability","type":["number","null"],"description":"Probability that this window contains AI-generated instrumental content, from a single-window analysis (lower accuracy than the `done` message's clip-level instrumental score). `null` if the window is mostly silence, instrumental-AI detection is unavailable, or the window's audio could not be analysed - independent of `vocal_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.42],"required":true},{"name":"instrumental_ai_confidence","type":["number","null"],"description":"Confidence in `instrumental_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.16],"required":true},{"name":"silence_percentage","type":"number","description":"Percentage of this window that contains neither vocal nor instrumental content.\n","examples":[3.5],"required":true}]}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","window"],"properties":{"type":{"type":"string","const":"window","x-parser-schema-id":"\u003canonymous-schema-3>"},"window":{"type":"object","required":["start_time_ms","end_time_ms","vocal_percentage","vocal_ai_probability","vocal_ai_confidence","instrumental_percentage","instrumental_ai_probability","instrumental_ai_confidence","silence_percentage"],"properties":{"start_time_ms":{"type":"integer","minimum":0,"description":"Window start time in the audio stream, in milliseconds.","examples":[0],"x-parser-schema-id":"\u003canonymous-schema-4>"},"end_time_ms":{"type":"integer","minimum":0,"description":"Window end time in the audio stream, in milliseconds.","examples":[4000],"x-parser-schema-id":"\u003canonymous-schema-5>"},"vocal_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Percentage of this window that contains vocal content.\n","examples":[87.5],"x-parser-schema-id":"\u003canonymous-schema-6>"},"vocal_ai_probability":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Probability that this window contains AI-generated vocals. `null` if the window does not have enough vocal content to score, was too short to analyse, or no content was found to classify - independent of `instrumental_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.97],"x-parser-schema-id":"\u003canonymous-schema-7>"},"vocal_ai_confidence":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Confidence in `vocal_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.97],"x-parser-schema-id":"\u003canonymous-schema-8>"},"instrumental_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Percentage of this window that contains instrumental music content.\n","examples":[64.3],"x-parser-schema-id":"\u003canonymous-schema-9>"},"instrumental_ai_probability":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Probability that this window contains AI-generated instrumental content, from a single-window analysis (lower accuracy than the `done` message's clip-level instrumental score). `null` if the window is mostly silence, instrumental-AI detection is unavailable, or the window's audio could not be analysed - independent of `vocal_ai_probability`, so a window can carry both, one, or neither.\n","examples":[0.42],"x-parser-schema-id":"\u003canonymous-schema-10>"},"instrumental_ai_confidence":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Confidence in `instrumental_ai_probability`. `null` under the same conditions as that field.\n","examples":[0.16],"x-parser-schema-id":"\u003canonymous-schema-11>"},"silence_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Percentage of this window that contains neither vocal nor instrumental content.\n","examples":[3.5],"x-parser-schema-id":"\u003canonymous-schema-12>"}},"x-parser-schema-id":"WindowResult"}},"x-parser-schema-id":"WindowResultMessage"},"title":"Window Result","description":"A single 4-second window detection result.","example":"{\n \"type\": \"\u003cstring>\",\n \"window\": {\n \"start_time_ms\": 123,\n \"end_time_ms\": 123,\n \"vocal_percentage\": 123,\n \"instrumental_percentage\": 123,\n \"silence_percentage\": 123\n }\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"windowResult"}]},{"id":"done","contentType":"application/json","payload":[{"name":"Done","description":"Analysis complete - final clip-level verdict has been computed.","type":"object","properties":[{"name":"type","type":"string","description":"done","required":true},{"name":"duration_ms","type":"integer","description":"Total duration of the streamed audio in milliseconds.","examples":[89280],"required":true},{"name":"window_count","type":"integer","description":"Total number of windows analysed during the session.","examples":[22],"required":true},{"name":"primary_verdict","type":"string","description":"Clip-level classification:\n- `ai-vocal-music` - AI-generated music with a detected synthetic\n voice.\n- `ai-instrumental` - AI-generated instrumental music with no\n detectable synthetic voice.\n- `not-ai-music` - the clip does not appear to contain\n AI-generated music.\n","enumValues":["ai-vocal-music","ai-instrumental","not-ai-music"],"examples":["ai-vocal-music"],"required":true},{"name":"vocal_percentage","type":"number","description":"Average percentage of the audio that contains vocal content, across all windows.\n","examples":[87.5],"required":true},{"name":"vocal_ai_percentage","type":"number","description":"Clip-level AI-vocal score, on a 0-100 scale: percentage of the full clip duration classified as AI-generated vocals, recomputed at end-of-stream. May differ from what the live per-window messages suggested.\n","examples":[56.5],"required":true},{"name":"vocal_ai_confidence","type":"number","description":"Average confidence across separated-audio frames classified as AI-generated vocals, from the end-of-stream recompute. `0` if no such frame was found.\n","examples":[0.96],"required":true},{"name":"instrumental_percentage","type":"number","description":"Average percentage of the audio that contains instrumental music content, across all windows.\n","examples":[64.3],"required":true},{"name":"instrumental_ai_percentage","type":"number","description":"Clip-level AI-instrumental score, on a 0-100 scale, computed once at end-of-stream from the full accumulated audio - a larger amount of context than any single live window gets, so this is more reliable than the per-window `instrumental_ai_probability` values seen during streaming.\n","examples":[42],"required":true},{"name":"instrumental_ai_confidence","type":"number","description":"Confidence in the instrumental AI assessment for the full clip.\n","examples":[0.95],"required":true},{"name":"silence_percentage","type":"number","description":"Average percentage of the audio that contains neither vocal nor instrumental content, across all windows.\n","examples":[3.51],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","duration_ms","window_count","primary_verdict","vocal_percentage","vocal_ai_percentage","vocal_ai_confidence","instrumental_percentage","instrumental_ai_percentage","instrumental_ai_confidence","silence_percentage"],"properties":{"type":{"type":"string","const":"done","x-parser-schema-id":"\u003canonymous-schema-13>"},"duration_ms":{"type":"integer","minimum":0,"description":"Total duration of the streamed audio in milliseconds.","examples":[89280],"x-parser-schema-id":"\u003canonymous-schema-14>"},"window_count":{"type":"integer","minimum":0,"description":"Total number of windows analysed during the session.","examples":[22],"x-parser-schema-id":"\u003canonymous-schema-15>"},"primary_verdict":{"type":"string","enum":["ai-vocal-music","ai-instrumental","not-ai-music"],"description":"Clip-level classification:\n- `ai-vocal-music` - AI-generated music with a detected synthetic\n voice.\n- `ai-instrumental` - AI-generated instrumental music with no\n detectable synthetic voice.\n- `not-ai-music` - the clip does not appear to contain\n AI-generated music.\n","examples":["ai-vocal-music"],"x-parser-schema-id":"\u003canonymous-schema-16>"},"vocal_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Average percentage of the audio that contains vocal content, across all windows.\n","examples":[87.5],"x-parser-schema-id":"\u003canonymous-schema-17>"},"vocal_ai_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Clip-level AI-vocal score, on a 0-100 scale: percentage of the full clip duration classified as AI-generated vocals, recomputed at end-of-stream. May differ from what the live per-window messages suggested.\n","examples":[56.5],"x-parser-schema-id":"\u003canonymous-schema-18>"},"vocal_ai_confidence":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Average confidence across separated-audio frames classified as AI-generated vocals, from the end-of-stream recompute. `0` if no such frame was found.\n","examples":[0.96],"x-parser-schema-id":"\u003canonymous-schema-19>"},"instrumental_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Average percentage of the audio that contains instrumental music content, across all windows.\n","examples":[64.3],"x-parser-schema-id":"\u003canonymous-schema-20>"},"instrumental_ai_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Clip-level AI-instrumental score, on a 0-100 scale, computed once at end-of-stream from the full accumulated audio - a larger amount of context than any single live window gets, so this is more reliable than the per-window `instrumental_ai_probability` values seen during streaming.\n","examples":[42],"x-parser-schema-id":"\u003canonymous-schema-21>"},"instrumental_ai_confidence":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Confidence in the instrumental AI assessment for the full clip.\n","examples":[0.95],"x-parser-schema-id":"\u003canonymous-schema-22>"},"silence_percentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Average percentage of the audio that contains neither vocal nor instrumental content, across all windows.\n","examples":[3.51],"x-parser-schema-id":"\u003canonymous-schema-23>"}},"x-parser-schema-id":"DoneMessage"},"title":"Done","description":"Analysis complete - final clip-level verdict has been computed.","example":"{\n \"type\": \"\u003cstring>\",\n \"duration_ms\": 123,\n \"window_count\": 123,\n \"primary_verdict\": \"\u003cstring>\",\n \"vocal_percentage\": 123,\n \"vocal_ai_percentage\": 123,\n \"vocal_ai_confidence\": 123,\n \"instrumental_percentage\": 123,\n \"instrumental_ai_percentage\": 123,\n \"instrumental_ai_confidence\": 123,\n \"silence_percentage\": 123\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"done"}]},{"id":"error","contentType":"application/json","payload":[{"name":"Error","description":"An error occurred during connection or analysis.","type":"object","properties":[{"name":"type","type":"string","description":"error","required":true},{"name":"error","type":"string","description":"Human-readable error description.","examples":["Internal server error","Unable to complete the request. Please try again.","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","error"],"properties":{"type":{"type":"string","const":"error","x-parser-schema-id":"\u003canonymous-schema-24>"},"error":{"type":"string","description":"Human-readable error description.","examples":["Internal server error","Unable to complete the request. Please try again.","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"x-parser-schema-id":"\u003canonymous-schema-25>"}},"x-parser-schema-id":"ErrorResponse"},"title":"Error","description":"An error occurred during connection or analysis.","example":"{\n \"type\": \"\u003cstring>\",\n \"error\": \"\u003cstring>\"\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"error"}]}],"receiveMessages":[{"id":"audioData","contentType":"application/octet-stream","payload":[{"type":"string","format":"binary","description":"A binary frame containing audio samples.","x-parser-schema-id":"\u003canonymous-schema-1>","name":"Audio Data"}],"headers":[],"jsonPayloadSchema":{"type":"string","format":"binary","description":"Audio data in the format declared by the `audio_format` query\nparameter. For raw formats this is headerless samples; for\ncontainer formats this is the encoded byte stream. Frames may\nbe any size; the server buffers internally.\n","x-parser-schema-id":"\u003canonymous-schema-1>"},"title":"Audio Data","description":"A binary frame containing audio samples.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"audioData"}]},{"id":"endOfStream","contentType":"text/plain","payload":[{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>","name":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio."}],"headers":[],"jsonPayloadSchema":{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>"},"title":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"endOfStream"}]}],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}],"securitySchemes":[]},"channelId":"streaming-detection","metadata":{"id":9521,"subdomain":"modulateai","eTag":"\"250df0ce7b37cbb5978aaccef1366124\"","originalFileLocation":"api/velma_2_ai_music_detection_streaming.yaml","uuid":"40a9e13e-587d-43af-b590-a1129ea60eff","source":"LOCAL_FILE","createdAt":"2026-06-17T17:34:00.689Z","updatedAt":"2026-09-14T18:26:04.816Z","deletedAt":null,"retiredAt":null,"retiredByDeploymentHistoryId":null}},"subdomain":"modulateai","siteName":"Modulate","title":"AI Music Detection Streaming - Modulate","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-14T20:21:06.066Z","originalFileLocation":"api-reference/ai-music-detection/streaming.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Real-time AI music detection over WebSocket. Per-window vocal-AI and instrumental-AI results are emitted progressively as audio arrives, followed by a final clip-level summary.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Modulate\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"AI Music Detection Streaming - Modulate\">\u003cmeta data-mint-head property=\"og:description\" content=\"Real-time AI music detection over WebSocket. Per-window vocal-AI and instrumental-AI results are emitted progressively as audio arrives, followed by a final clip-level summary.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Modulate\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.modulate.ai/api-reference/ai-music-detection/streaming\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://modulateai.mintlify.app/_mintlify/api/og/v2?division=AI+Music+Detection\u0026amp;title=AI+Music+Detection+Streaming\u0026amp;description=Real-time+AI+music+detection+over+WebSocket.+Per-window+vocal-AI+and+instrumental-AI+results+are+emitted+progressively+as+audio+arrives%2C+followed+by+a+final+cli\u0026amp;theme=5b1c5018c22e2de339bbf72b\u0026amp;signature=7e11cb14c0aa1b77ffa935fc1839557808b88e797e636c7bff44266937f0f796\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"AI Music Detection Streaming - Modulate\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Real-time AI music detection over WebSocket. Per-window vocal-AI and instrumental-AI results are emitted progressively as audio arrives, followed by a final clip-level summary.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://modulateai.mintlify.app/_mintlify/api/og/v2?division=AI+Music+Detection\u0026amp;title=AI+Music+Detection+Streaming\u0026amp;description=Real-time+AI+music+detection+over+WebSocket.+Per-window+vocal-AI+and+instrumental-AI+results+are+emitted+progressively+as+audio+arrives%2C+followed+by+a+final+cli\u0026amp;theme=5b1c5018c22e2de339bbf72b\u0026amp;signature=7e11cb14c0aa1b77ffa935fc1839557808b88e797e636c7bff44266937f0f796\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Modulate\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#285FEB\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.modulate.ai/api-reference/ai-music-detection/streaming\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/ai-music-detection/streaming.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.modulate.ai/#organization\",\"name\":\"Modulate\",\"url\":\"https://docs.modulate.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/modulateai/0NHKM9zXEnghoEfZ/images/wordmark-navy.svg?fit=max\u0026auto=format\u0026n=0NHKM9zXEnghoEfZ\u0026q=85\u0026s=7ee7a19111bb0154aa2e6934ebd29607\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.modulate.ai#website\",\"name\":\"Modulate\",\"url\":\"https://docs.modulate.ai\",\"publisher\":{\"@id\":\"https://docs.modulate.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.modulate.ai/api-reference/ai-music-detection/streaming#webpage\",\"url\":\"https://docs.modulate.ai/api-reference/ai-music-detection/streaming\",\"name\":\"AI Music Detection Streaming\",\"description\":\"Real-time AI music detection over WebSocket. Per-window vocal-AI and instrumental-AI results are emitted progressively as audio arrives, followed by a final clip-level summary.\",\"dateModified\":\"2026-09-14T20:21:06.066Z\",\"isPartOf\":{\"@id\":\"https://docs.modulate.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.modulate.ai/api-reference/ai-music-detection/streaming#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.modulate.ai/api-reference/ai-music-detection/streaming#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"AI Music Detection\",\"item\":\"https://docs.modulate.ai/api-reference/ai-music-detection/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AI Music Detection Streaming\",\"item\":\"https://docs.modulate.ai/api-reference/ai-music-detection/streaming\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.modulate.ai/api-reference/ai-music-detection/streaming#apireference\",\"headline\":\"AI Music Detection Streaming\",\"name\":\"AI Music Detection Streaming\",\"description\":\"Real-time AI music detection over WebSocket. Per-window vocal-AI and instrumental-AI results are emitted progressively as audio arrives, followed by a final clip-level summary.\",\"url\":\"https://docs.modulate.ai/api-reference/ai-music-detection/streaming\",\"mainEntityOfPage\":{\"@id\":\"https://docs.modulate.ai/api-reference/ai-music-detection/streaming#webpage\"},\"dateModified\":\"2026-09-14T20:21:06.066Z\",\"publisher\":{\"@id\":\"https://docs.modulate.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.modulate.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Modulate\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Modulate","nav":{"global":null,"tabs":[{"tab":"Get Started","pages":[{"title":"Get Started","href":""}]},{"tab":"Velma","pages":[{"title":"Velma","href":"/velma/overview"}]},{"tab":"API Reference","groups":[{"group":"Velma","icon":"comments","pages":[{"title":"Velma","sidebarTitle":"Overview","href":"/api-reference/velma/overview"},{"title":"Velma Batch","sidebarTitle":"Batch","openapi":"api/velma_2_batch.yaml POST /api/velma-2-batch","href":"/api-reference/velma/batch"},{"title":"List behavior presets","sidebarTitle":"Behavior presets","openapi":"api/velma_2_batch.yaml GET /api/velma-2-batch/list-presets","href":"/api-reference/velma/presets"},{"title":"Velma Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_streaming.yaml velma2Streaming","href":"/api-reference/velma/streaming"}]},{"group":"Speech-to-text Transcription","icon":"microphone","pages":[{"title":"Speech-to-text Transcription","sidebarTitle":"Overview","href":"/api-reference/stt/overview"},{"title":"Speech-to-Text Transcription Batch Multilingual","sidebarTitle":"Batch Multilingual","openapi":"api/velma_2_stt_batch.yaml POST /api/velma-2-stt-batch","href":"/api-reference/stt/batch"},{"title":"Speech-to-Text Transcription Streaming Multilingual","sidebarTitle":"Streaming Multilingual","asyncapi":"api/velma_2_stt_streaming.yaml velma2SttStreaming","href":"/api-reference/stt/streaming"},{"title":"Speech-to-Text Transcription Batch English VFast","sidebarTitle":"Batch English VFast","openapi":"api/velma_2_stt_batch_english_vfast.yaml POST /api/velma-2-stt-batch-english-vfast","href":"/api-reference/stt/batch-english-vfast"},{"title":"Speech-to-Text Streaming English","sidebarTitle":"Streaming English","asyncapi":"api/velma_2_stt_streaming_english_v2.yaml velma2SttStreamingEnglishV2","href":"/api-reference/stt/streaming-vfast"},{"title":"Multilingual Fast Transcription Batch","sidebarTitle":"Batch Multilingual VFast","openapi":"api/velma_2_stt_batch_multilingual_vfast.yaml POST /api/velma-2-stt-batch-multilingual-vfast","href":"/api-reference/stt/batch-multilingual-vfast"},{"title":"Multilingual Fast Transcription Streaming","sidebarTitle":"Streaming (Multilingual Fast)","asyncapi":"api/stt_streaming_multilingual_vfast.yaml velma2SttStreamingMultilingualVfast","href":"/api-reference/stt/streaming-multilingual-vfast"}]},{"group":"Deepfake Detection","icon":"shield-halved","pages":[{"title":"Deepfake Detection","sidebarTitle":"Overview","href":"/api-reference/svd/overview"},{"title":"Deepfake Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_synthetic_voice_detection_batch.yaml POST /api/velma-2-synthetic-voice-detection-batch","href":"/api-reference/svd/batch"},{"title":"Deepfake Detection Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_synthetic_voice_detection_streaming.yaml streaming-detection","href":"/api-reference/svd/streaming"}]},{"group":"Emotion Detection","icon":"face-smile","pages":[{"title":"Emotion Detection","sidebarTitle":"Overview","href":"/api-reference/emotion/overview"},{"title":"Emotion Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_emotion_batch.yaml POST /api/velma-2-emotion-batch","href":"/api-reference/emotion/batch"}]},{"group":"Accent Detection","icon":"globe","pages":[{"title":"Accent Detection","sidebarTitle":"Overview","href":"/api-reference/accent/overview"},{"title":"Accent Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_accent_batch.yaml POST /api/velma-2-accent-batch","href":"/api-reference/accent/batch"}]},{"group":"PII/PHI Redaction","icon":"eye-slash","pages":[{"title":"PII/PHI Redaction","sidebarTitle":"Overview","href":"/api-reference/redaction/overview"},{"title":"PII/PHI Redaction Batch","sidebarTitle":"Batch","openapi":"api/velma_2_pii_phi_redaction_batch.yaml POST /api/velma-2-pii-phi-redaction-batch","href":"/api-reference/redaction/batch"},{"title":"PII/PHI Redaction Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_pii_phi_redaction_streaming.yaml velma2PiiPhiRedactionStreaming","href":"/api-reference/redaction/streaming"}]},{"group":"Music Detection","icon":"music","pages":[{"title":"Music Detection","sidebarTitle":"Overview","href":"/api-reference/music-detection/overview"},{"title":"Music Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_music_detection_batch.yaml POST /api/velma-2-music-detection-batch","href":"/api-reference/music-detection/batch"},{"title":"Music Detection Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_music_detection_streaming.yaml streaming-detection","href":"/api-reference/music-detection/streaming"}]},{"group":"AI Music Detection","icon":"robot","pages":[{"title":"AI Music Detection","sidebarTitle":"Overview","href":"/api-reference/ai-music-detection/overview"},{"title":"AI Music Detection Batch","sidebarTitle":"Batch","description":"Detect AI-generated music in an audio file. Returns a clip-level verdict plus a per-window breakdown of vocal and instrumental AI content.","openapi":"api/velma_2_ai_music_detection_batch.yaml POST /api/velma-2-ai-music-detection-batch","href":"/api-reference/ai-music-detection/batch"},{"title":"AI Music Detection Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_ai_music_detection_streaming.yaml streaming-detection","href":"/api-reference/ai-music-detection/streaming"}]},{"group":"Language Detection","icon":"language","pages":[{"title":"Language Detection","sidebarTitle":"Overview","description":"Language detection API — identify the spoken language of an audio file in a single synchronous HTTP POST.","href":"/api-reference/language-detection/overview"},{"title":"Language Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_language_detection_batch.yaml POST /api/velma-2-language-detection-batch","href":"/api-reference/language-detection/batch"}]},{"group":"Audio Event Detection","icon":"waveform-lines","pages":[{"title":"Audio Event Detection","sidebarTitle":"Overview","href":"/api-reference/audio-event-detection/overview"},{"title":"Audio Event Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_audio_event_classifier.yaml POST /api/velma-2-audio-event-classifier","href":"/api-reference/audio-event-detection/batch"}]}]},{"tab":"Benchmarks","pages":[{"title":"Benchmarks","href":"/benchmarks/overview"}]},{"tab":"Support","pages":[{"title":"Support","href":"/support"}]}]},"basePath":"","title":"AI Music Detection Streaming - Modulate","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["a4b48b4bee","a9bb46feb3","3b021dca80"],"chunks":["Page-DSYy6aK3.js","utils-ME8dDnLe.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","getPastedJson-u6QiPzNZ.js","icon-Bb-CBSxO.js","MethodPill-F7l5AI7V.js","DuplicateIcon-IiAXkdSg.js","createIcon-FliI8EBc.js","DynamicMarkdown-B62XqCSI.js","getApiPlaygroundDisplay-BnYQO2Ss.js","MessageExamples-DJblhcCE.js","CodeSnippet-RKKOc8c_.js","Markdown-BOgQCTwD.js","clsx-BIWXJmsZ.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DKZWslLH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-UDqbR6xh.js"]}