How to encode and decode audio for ORI-Realtime 1.5 — Opus, 24 kHz, mono.
ORI-Realtime speaks Opus at 24 kHz, mono, base64-encoded inside JSON events — in both directions. This differs from APIs that use raw PCM16; Opus keeps bandwidth ~10× lower, which matters for a full-duplex stream.
Input (input_audio_buffer.append)
Output (response.audio.delta)
Codec
Opus (streaming, self-delimited)
Opus (streaming, self-delimited)
Sample rate
24,000 Hz
24,000 Hz
Channels
1 (mono)
1 (mono)
Encoding
base64 string in the audio field
base64 string in the delta field
Resample before you encode. Most microphones capture at 16 kHz or 48 kHz. Opus will happily encode audio at the wrong rate and the API will accept it — but the model will hear noise and produce empty or confused replies. If the model keeps asking “are you there?”, check your sample rate first.
sphn is the streaming Opus codec the stack itself uses (pip install sphn). It maintains encoder/decoder state across chunks — create one writer and one reader per session and reuse them:
import sphn, base64import numpy as npwriter = sphn.OpusStreamWriter(24000) # one per sessionreader = sphn.OpusStreamReader(24000) # one per session# Encode: float32 PCM in [-1, 1] at 24 kHz → base64 Opus.# append_pcm returns the encoded bytes (may be empty while it buffers).def encode(pcm_f32: np.ndarray) -> str | None: data = writer.append_pcm(pcm_f32) return base64.b64encode(data).decode() if data else None# Decode: base64 Opus → float32 PCM at 24 kHz.# append_bytes returns the decoded samples (may be empty mid-packet).def decode(b64: str) -> np.ndarray: return reader.append_bytes(base64.b64decode(b64))
Resampling from a 16 kHz source:
from scipy.signal import resample_polypcm_24k = resample_poly(pcm_16k, up=3, down=2)
If your PCM is int16, normalize first: pcm_f32 = pcm_i16.astype(np.float32) / 32768.0.
Use an Opus binding such as @discordjs/opus (native, fast) or opusscript (pure JS/WASM). Configure the codec for 24,000 Hz, 1 channel, and frame sizes of 1920 samples (80 ms) or 480 samples (20 ms). Base64-encode each encoded packet into the audio field, and base64-decode each delta before feeding your decoder.
WebCodecs (Chrome/Edge): AudioEncoder/AudioDecoder with codec: "opus", sampleRate: 24000, numberOfChannels: 1. Capture the mic with getUserMedia + AudioWorklet, resample to 24 kHz in the worklet if the context runs at 48 kHz.
opus-recorder (wider support): WASM Opus encoder with a configurable encoderSampleRate: 24000.
For playback, decode into an AudioBuffer and schedule chunks back-to-back on a Web Audio AudioContext — keep a small jitter buffer (~100 ms) so word boundaries don’t click.
Send audio in 20–80 ms chunks at real-time pace. Don’t dump a whole file at once — the turn engine reads timing, not just content, to decide when you’ve finished speaking.
Keep sending silence between user utterances. A silent stream is how the engine knows the user is done; a stopped stream just looks like a stall.
Output audio is mastered slightly quieter than typical TTS APIs — apply client-side gain if you need to match other sources.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Waterr.ai","colors":{"primary":"#2563EB","light":"#60A5FA","dark":"#1D4ED8"},"logo":{"light":"https://mintcdn.com/waterr/BNJBdkg3zY1H6whp/logo/header-logo-light.png?fit=max\u0026auto=format\u0026n=BNJBdkg3zY1H6whp\u0026q=85\u0026s=d56ffed321f9f4cb446acc732ed80c98","dark":"https://mintcdn.com/waterr/BNJBdkg3zY1H6whp/logo/header-logo-dark.png?fit=max\u0026auto=format\u0026n=BNJBdkg3zY1H6whp\u0026q=85\u0026s=cdf2a974c5fc6e2dc9193b11d6ec9333","href":"https://waterr.ai"},"favicon":"https://mintcdn.com/waterr/BNJBdkg3zY1H6whp/favicon.png?fit=max\u0026auto=format\u0026n=BNJBdkg3zY1H6whp\u0026q=85\u0026s=32a4b61a9ab75ad93a0b27188033fba7","api":{"openapi":["openapi.yaml"],"playground":{"display":"interactive"}},"appearance":{"default":"light"},"background":{"color":{"dark":"#1A1A18"}},"navbar":{"links":[{"href":"https://waterr.ai","label":"Homepage"},{"icon":"github","href":"https://github.com/waterrai","label":"GitHub"}],"primary":{"type":"button","label":"Playground","href":"https://waterr.ai/auth"}},"footer":{"socials":{"x":"https://x.com/waterr_ai","linkedin":"https://www.linkedin.com/company/waterrai"}},"fonts":{"family":"Inter","weight":400,"source":"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800\u0026display=swap","format":"woff2"},"styling":{"latex":true},"navigation":{"global":{},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"waterr","hasAudioNarration":false,"actualSubdomain":"waterr","customDomains":["docs.waterr.ai"],"gitSource":{"type":"github","owner":"thinkharshh","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad3ad1e9d6722b31b0346b6","collectionId":"be67fcb1-c2fa-4a97-a080-7c4d12f57f6e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad3ad1e9d6722b31b0346b6"},"entitlements":{},"buildId":"6ad3ad1e9d6722b31b0346b6","clientVersion":"0.0.3964","searchFilterCounts":[{"language":"default","tag":"API Reference","count":105},{"language":"default","tag":"Help Center","count":33},{"language":"default","tag":"Capabilities","count":15},{"language":"default","tag":"Getting Started","count":11},{"language":"default","tag":"Tools","count":11},{"language":"default","tag":"Guardrails","count":10},{"language":"default","tag":"Meeting Skills","count":10},{"language":"default","tag":"Meetings","count":9},{"language":"default","tag":"Memory","count":9},{"language":"default","tag":"Avatars","count":7}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"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":"editor-v7-file-tree","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":"pause-universal-search-reconcile","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":"per-site-search-delta","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":"editor-private-page-search","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":"editor-nav-generations","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":"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":"editor-agent-model-picker","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":"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}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":":root{--plusone-font:\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n Roboto, \"Helvetica Neue\", Arial, sans-serif;--section-heading-color:#111827;--section-rule-color:rgba(17, 24, 39, 0.08)}:root.dark{--section-heading-color:#f3f4f6;--section-rule-color:rgba(255, 255, 255, 0.08)}body,button,html,input,select,textarea{font-family:var(--plusone-font)!important}#navigation-items .sidebar-group-header{gap:.625rem!important;margin-bottom:.5rem!important;color:var(--section-heading-color)!important}#navigation-items .sidebar-group-header .sidebar-title,#navigation-items .sidebar-group-header .sidebar-title *{font-size:.875rem!important;font-weight:600!important;line-height:1.25rem!important;letter-spacing:-.005em}#navigation-items .sidebar-group-header .sidebar-group-icon{width:1rem!important;height:1rem!important}#navigation-items>div+div{margin-top:1.25rem!important;padding-top:1.25rem;border-top:1px solid var(--section-rule-color)}"}],"page":{"pagePath":"models/ori-realtime/audio","slug":"/models/ori-realtime/audio","pageMetadata":{"title":"Audio format","description":"How to encode and decode audio for ORI-Realtime 1.5 — Opus, 24 kHz, mono.","href":"/models/ori-realtime/audio"},"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: \"How to encode and decode audio for ORI-Realtime 1.5 — Opus, 24 kHz, mono.\"\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={a:`a`,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},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`ORI-Realtime speaks `,_jsx(_components.strong,{children:`Opus at 24 kHz, mono`}),`, base64-encoded inside JSON events — in both directions. This differs from APIs that use raw PCM16; Opus keeps bandwidth ~10× lower, which matters for a full-duplex stream.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsxs(_components.th,{children:[`Input (`,_jsx(_components.code,{children:`input_audio_buffer.append`}),`)`]}),_jsxs(_components.th,{children:[`Output (`,_jsx(_components.code,{children:`response.audio.delta`}),`)`]})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Codec`}),_jsx(_components.td,{children:`Opus (streaming, self-delimited)`}),_jsx(_components.td,{children:`Opus (streaming, self-delimited)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Sample rate`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`24,000 Hz`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`24,000 Hz`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Channels`}),_jsx(_components.td,{children:`1 (mono)`}),_jsx(_components.td,{children:`1 (mono)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Encoding`}),_jsxs(_components.td,{children:[`base64 string in the `,_jsx(_components.code,{children:`audio`}),` field`]}),_jsxs(_components.td,{children:[`base64 string in the `,_jsx(_components.code,{children:`delta`}),` field`]})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Resample before you encode.`}),` Most microphones capture at 16 kHz or 48 kHz. Opus will happily encode audio at the wrong rate and the API will accept it — but the model will hear noise and produce empty or confused replies. If the model keeps asking “are you there?”, check your sample rate first.`]})}),`\n`,_jsxs(Heading,{level:`2`,id:`python-—-sphn`,children:[`Python — `,_jsx(_components.code,{children:`sphn`})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.a,{href:`https://pypi.org/project/sphn/`,children:_jsx(_components.code,{children:`sphn`})}),` is the streaming Opus codec the stack itself uses (`,_jsx(_components.code,{children:`pip install sphn`}),`). It maintains encoder/decoder state across chunks — create one writer and one reader per session and reuse them:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`16`,language:`python`,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:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`16`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sphn, base64`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` numpy `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` np`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`writer `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sphn.OpusStreamWriter(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`24000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# one per session`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`reader `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sphn.OpusStreamReader(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`24000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# one per session`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Encode: float32 PCM in [-1, 1] at 24 kHz → base64 Opus.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# append_pcm returns the encoded bytes (may be empty while it buffers).`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` encode`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`pcm_f32`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: np.ndarray) -> `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` data `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` writer.append_pcm(pcm_f32)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` base64.b64encode(data).decode() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` data `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`else`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Decode: base64 Opus → float32 PCM at 24 kHz.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# append_bytes returns the decoded samples (may be empty mid-packet).`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` decode`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`b64`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> np.ndarray:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` reader.append_bytes(base64.b64decode(b64))`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Resampling from a 16 kHz source:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`python`,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:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` scipy.signal `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` resample_poly`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`pcm_24k `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` resample_poly(pcm_16k, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`up`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`down`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`If your PCM is int16, normalize first: `,_jsx(_components.code,{children:`pcm_f32 = pcm_i16.astype(np.float32) / 32768.0`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`node-js`,children:`Node.js`}),`\n`,_jsxs(_components.p,{children:[`Use an Opus binding such as `,_jsx(_components.a,{href:`https://www.npmjs.com/package/@discordjs/opus`,children:_jsx(_components.code,{children:`@discordjs/opus`})}),` (native, fast) or `,_jsx(_components.a,{href:`https://www.npmjs.com/package/opusscript`,children:_jsx(_components.code,{children:`opusscript`})}),` (pure JS/WASM). Configure the codec for 24,000 Hz, 1 channel, and frame sizes of 1920 samples (80 ms) or 480 samples (20 ms). Base64-encode each encoded packet into the `,_jsx(_components.code,{children:`audio`}),` field, and base64-decode each `,_jsx(_components.code,{children:`delta`}),` before feeding your decoder.`]}),`\n`,_jsx(Heading,{level:`2`,id:`browser`,children:`Browser`}),`\n`,_jsx(_components.p,{children:`Two workable paths:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`WebCodecs`}),` (Chrome/Edge): `,_jsx(_components.code,{children:`AudioEncoder`}),`/`,_jsx(_components.code,{children:`AudioDecoder`}),` with `,_jsx(_components.code,{children:`codec: \"opus\"`}),`, `,_jsx(_components.code,{children:`sampleRate: 24000`}),`, `,_jsx(_components.code,{children:`numberOfChannels: 1`}),`. Capture the mic with `,_jsx(_components.code,{children:`getUserMedia`}),` + `,_jsx(_components.code,{children:`AudioWorklet`}),`, resample to 24 kHz in the worklet if the context runs at 48 kHz.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.a,{href:`https://github.com/chris-rudmin/opus-recorder`,children:`opus-recorder`})}),` (wider support): WASM Opus encoder with a configurable `,_jsx(_components.code,{children:`encoderSampleRate: 24000`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`For playback, decode into an `,_jsx(_components.code,{children:`AudioBuffer`}),` and schedule chunks back-to-back on a Web Audio `,_jsx(_components.code,{children:`AudioContext`}),` — keep a small jitter buffer (~100 ms) so word boundaries don’t click.`]}),`\n`,_jsx(Heading,{level:`2`,id:`chunking-and-pacing`,children:`Chunking and pacing`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Send audio in `,_jsx(_components.strong,{children:`20–80 ms chunks`}),` at real-time pace. Don’t dump a whole file at once — the turn engine reads timing, not just content, to decide when you’ve finished speaking.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Keep sending silence`}),` between user utterances. A silent stream is how the engine knows the user is done; a stopped stream just looks like a stall.`]}),`\n`,_jsx(_components.li,{children:`Output audio is mastered slightly quieter than typical TTS APIs — apply client-side gain if you need to match other sources.`}),`\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":"Audio format","description":"How to encode and decode audio for ORI-Realtime 1.5 — Opus, 24 kHz, mono.","href":"/models/ori-realtime/audio"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Python — sphn","slug":"python-—-sphn","depth":2,"children":[]},{"title":"Node.js","slug":"node-js","depth":2,"children":[]},{"title":"Browser","slug":"browser","depth":2,"children":[]},{"title":"Chunking and pacing","slug":"chunking-and-pacing","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"waterr","siteName":"Waterr.ai","title":"Audio format - Waterr.ai","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-08T18:22:29.056Z","originalFileLocation":"models/ori-realtime/audio.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=\"light\"}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=\"How to encode and decode audio for ORI-Realtime 1.5 — Opus, 24 kHz, mono.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Waterr.ai\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/waterr/JvejXbdPqRoVl46G/_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/waterr/JvejXbdPqRoVl46G/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/waterr/JvejXbdPqRoVl46G/_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/waterr/JvejXbdPqRoVl46G/_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/waterr/JvejXbdPqRoVl46G/_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/waterr/JvejXbdPqRoVl46G/_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/waterr/JvejXbdPqRoVl46G/_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/waterr/JvejXbdPqRoVl46G/_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/waterr/JvejXbdPqRoVl46G/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Audio format - Waterr.ai\">\u003cmeta data-mint-head property=\"og:description\" content=\"How to encode and decode audio for ORI-Realtime 1.5 — Opus, 24 kHz, mono.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Waterr.ai\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.waterr.ai/models/ori-realtime/audio\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://waterr.mintlify.app/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Audio+format\u0026amp;description=How+to+encode+and+decode+audio+for+ORI-Realtime+1.5+%E2%80%94+Opus%2C+24+kHz%2C+mono.\u0026amp;theme=35640f470f5aebf3ff485362\u0026amp;signature=ed898e9250ec92802cf71303ee7bd6338b33376fe83dba01f9722ff6632d3daf\">\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=\"Audio format - Waterr.ai\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How to encode and decode audio for ORI-Realtime 1.5 — Opus, 24 kHz, mono.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://waterr.mintlify.app/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Audio+format\u0026amp;description=How+to+encode+and+decode+audio+for+ORI-Realtime+1.5+%E2%80%94+Opus%2C+24+kHz%2C+mono.\u0026amp;theme=35640f470f5aebf3ff485362\u0026amp;signature=ed898e9250ec92802cf71303ee7bd6338b33376fe83dba01f9722ff6632d3daf\">\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/waterr/JvejXbdPqRoVl46G/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Waterr.ai\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2563EB\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.waterr.ai/models/ori-realtime/audio\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/models/ori-realtime/audio.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Waterr.ai\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Waterr.ai","nav":{"global":{},"tabs":[{"tab":"Help Center","icon":"life-ring","groups":[{"group":"Overview","icon":"compass","pages":[{"title":"Overview","icon":"house","mode":"wide","href":"/overview"},{"title":"Core Concepts","icon":"book-open","href":"/getting-started/core-concepts"}]},{"group":"Get Started","icon":"hammer","pages":[{"title":"Quickstart","icon":"rocket","href":"/getting-started/quickstart"},{"title":"Creating Scenarios","icon":"pen-to-square","href":"/getting-started/creating-scenarios"},{"title":"Understanding AI Personas","icon":"user","href":"/getting-started/personas"},{"title":"Send Agent","icon":"paper-plane","href":"/getting-started/send-agent"}]},{"group":"Capabilities","icon":"wand-magic-sparkles","pages":[{"title":"Vision","icon":"eye","href":"/capabilities/vision"},{"title":"Multi-Language","icon":"language","href":"/capabilities/multi-language"},{"title":"Deep Thinking","icon":"brain","href":"/capabilities/deep-thinking"},{"title":"Meeting Skills","icon":"puzzle-piece","href":"/capabilities/meeting-skills"},{"title":"Web Search","icon":"magnifying-glass","href":"/capabilities/web-search"},{"title":"Memory","icon":"database","href":"/capabilities/participant-memory"},{"title":"Knowledge Base","icon":"book","href":"/capabilities/knowledge-base"},{"title":"Present File","icon":"display","href":"/capabilities/present-file"},{"title":"Screen Apps","icon":"window-maximize","href":"/capabilities/screen-apps"},{"title":"In-Call Chat","icon":"comments","href":"/capabilities/in-call-chat"},{"title":"Multi-Agent","icon":"users","href":"/capabilities/multi-agent"},{"title":"Custom Functions","icon":"code","href":"/capabilities/custom-functions"},{"title":"Consent","icon":"file-signature","href":"/capabilities/consent"},{"title":"Social","icon":"address-card","href":"/capabilities/social"},{"title":"Notifications","icon":"bell","href":"/capabilities/notifications"}]},{"group":"Sharing with Others","icon":"share-nodes","pages":[{"title":"Share Links","icon":"link","href":"/sharing/links"},{"title":"Embed in Website","icon":"window-maximize","href":"/sharing/embed-in-website"},{"title":"Scheduling","icon":"calendar","href":"/sharing/scheduling"},{"title":"Booking Page","icon":"calendar-check","href":"/sharing/booking-page"}]},{"group":"Customization","icon":"sliders","pages":[{"title":"Meeting Script","icon":"scroll","href":"/customization/meeting-script"},{"title":"Personalization Tokens","icon":"user-tag","href":"/customization/personalization-tokens"},{"title":"Post-Meeting Evaluations","icon":"chart-simple","href":"/customization/post-meeting-evaluations"},{"title":"Participant Experience","icon":"user-gear","href":"/customization/participant-experience"},{"title":"White Label","icon":"palette","href":"/customization/white-label"}]},{"group":"Security","icon":"shield-halved","pages":[{"title":"Consent","icon":"user-check","href":"/security/consent"},{"title":"Data Encryption","icon":"lock","href":"/security/data-encryption"},{"title":"Privacy","icon":"user-shield","href":"/security/privacy"}]}]},{"tab":"API Reference","icon":"code","groups":[{"group":"Getting Started","icon":"flag","pages":[{"title":"Introduction","icon":"house","href":"/api-reference/introduction"},{"title":"Quick Start","icon":"rocket","href":"/api-reference/quickstart"},{"title":"Authentication","icon":"key","href":"/api-reference/authentication"},{"title":"Session Lifecycle","icon":"arrows-rotate","href":"/api-reference/session-lifecycle"},{"title":"Errors","icon":"triangle-exclamation","href":"/api-reference/errors"},{"title":"Rate limits","icon":"gauge","href":"/api-reference/rate-limits"},{"title":"Billing and credits","icon":"credit-card","href":"/api-reference/billing"},{"title":"Pagination","icon":"list","href":"/api-reference/pagination"},{"title":"Idempotency","icon":"fingerprint","href":"/api-reference/idempotency"},{"title":"Versioning","icon":"code-branch","href":"/api-reference/versioning"},{"title":"Changelog","icon":"clock-rotate-left","href":"/api-reference/changelog"}]},{"group":"Meetings","icon":"video","pages":[{"title":"Create a new meeting","openapi":"POST /meetings","href":"/api-reference/endpoint/post-meetings"},{"title":"Get a meeting by ID","openapi":"GET /meetings/{id}","href":"/api-reference/endpoint/get-meetings-id"},{"title":"Get all meetings","openapi":"GET /meetings","href":"/api-reference/endpoint/get-meetings"},{"title":"End a meeting","openapi":"PUT /meetings/{meetingId}/end","href":"/api-reference/endpoint/put-meetings-meetingid-end"},{"title":"Update a meeting","openapi":"PUT /meetings/{meetingId}","href":"/api-reference/endpoint/put-meetings-meetingid"},{"title":"Delete a meeting","openapi":"DELETE /meetings/{meetingId}","href":"/api-reference/endpoint/delete-meetings-meetingid"},{"title":"Submit post-call feedback","openapi":"POST /meetings/{meetingId}/feedback","href":"/api-reference/endpoint/post-meetings-meetingid-feedback"},{"title":"Read post-call feedback","openapi":"GET /meetings/{meetingId}/feedback","href":"/api-reference/endpoint/get-meetings-meetingid-feedback"},{"title":"Feedback catalogue","openapi":"GET /meetings/feedback/catalog","href":"/api-reference/endpoint/get-meetings-feedback-catalog"}]},{"group":"Personas","icon":"user","pages":[{"title":"Create a new persona","openapi":"POST /personas","href":"/api-reference/endpoint/post-personas"},{"title":"Get a persona by ID","openapi":"GET /personas/{id}","href":"/api-reference/endpoint/get-personas-id"},{"title":"Get all personas","openapi":"GET /personas","href":"/api-reference/endpoint/get-personas"},{"title":"Update a persona","openapi":"PUT /personas/{id}","href":"/api-reference/endpoint/put-personas-id"},{"title":"Delete a persona","openapi":"DELETE /personas/{id}","href":"/api-reference/endpoint/delete-personas-id"}]},{"group":"Scenarios","icon":"diagram-project","pages":[{"title":"Create a new scenario","openapi":"POST /scenarios","href":"/api-reference/endpoint/post-scenarios"},{"title":"Get all scenarios","openapi":"GET /scenarios","href":"/api-reference/endpoint/get-scenarios"},{"title":"Update a scenario","openapi":"PUT /scenarios/{id}","href":"/api-reference/endpoint/put-scenarios-id"},{"title":"Delete a scenario","openapi":"DELETE /scenarios/{id}","href":"/api-reference/endpoint/delete-scenarios-id"},{"title":"Export a scenario as JSON","openapi":"GET /scenarios/{id}/export","href":"/api-reference/endpoint/get-scenarios-id-export"},{"title":"Get all meetings for all scenarios of a user","openapi":"GET /scenarios/membership/{membershipId}/meetings","href":"/api-reference/endpoint/get-scenarios-membership-membershipid-meetings"}]},{"group":"Embed Scenario","icon":"window-maximize","pages":[{"title":"Embed API","icon":"window-maximize","href":"/api-reference/embed-tokens"},{"title":"Live Website Events","icon":"bolt","tag":"BETA","href":"/api-reference/live-website-events"},{"title":"Page Tools","icon":"arrow-pointer","tag":"BETA","href":"/api-reference/page-tools"}]},{"group":"Memory","icon":"database","pages":[{"title":"Memories","icon":"database","href":"/api-reference/memories"},{"title":"Add memories","openapi":"POST /memories","href":"/api-reference/endpoint/post-memories"},{"title":"List memories under a tag","openapi":"GET /memories","href":"/api-reference/endpoint/get-memories"},{"title":"List memory containers","openapi":"GET /memories/tags","href":"/api-reference/endpoint/get-memories-tags"},{"title":"Get a memory container","openapi":"GET /memories/tags/{tag}","href":"/api-reference/endpoint/get-memories-tags-tag"},{"title":"Get a memory","openapi":"GET /memories/{id}","href":"/api-reference/endpoint/get-memories-id"},{"title":"Update a memory","openapi":"PATCH /memories/{id}","href":"/api-reference/endpoint/patch-memories-id"},{"title":"Delete a memory","openapi":"DELETE /memories/{id}","href":"/api-reference/endpoint/delete-memories-id"},{"title":"Delete a memory container","openapi":"DELETE /memories/tags/{tag}","href":"/api-reference/endpoint/delete-memories-tags-tag"}]},{"group":"Post-Meeting Data","icon":"chart-line","pages":[{"title":"Get analysis by meeting ID","openapi":"GET /analyses/meeting/{meetingId}","href":"/api-reference/endpoint/get-analyses-meeting-meetingid"},{"title":"Get an analysis by ID","openapi":"GET /analyses/{id}","href":"/api-reference/endpoint/get-analyses-id"},{"title":"Trigger manual analysis for a meeting","openapi":"POST /analyses/trigger/{meetingId}","href":"/api-reference/endpoint/post-analyses-trigger-meetingid"},{"title":"Get transcripts by meeting ID","openapi":"GET /transcripts/meeting/{meetingId}","href":"/api-reference/endpoint/get-transcripts-meeting-meetingid"},{"title":"Get a transcript by ID","openapi":"GET /transcripts/{id}","href":"/api-reference/endpoint/get-transcripts-id"},{"title":"Get recording CloudFront URL with thumbnail by Daily meeting ID","openapi":"GET /recordings/url-with-thumbnail/{meetingId}","href":"/api-reference/endpoint/get-recordings-url-with-thumbnail-meetingid"},{"title":"Get recordings by meeting ID","openapi":"GET /recordings/meeting/{meetingId}","href":"/api-reference/endpoint/get-recordings-meeting-meetingid"}]},{"group":"Goals","icon":"bullseye","pages":[{"title":"Create a new goal","openapi":"POST /goals","href":"/api-reference/endpoint/post-goals"},{"title":"Get all goals","openapi":"GET /goals","href":"/api-reference/endpoint/get-goals"},{"title":"Update a goal","openapi":"PUT /goals/{id}","href":"/api-reference/endpoint/put-goals-id"},{"title":"Delete a goal","openapi":"DELETE /goals/{id}","href":"/api-reference/endpoint/delete-goals-id"}]},{"group":"Avatars","icon":"image","pages":[{"title":"Avatars","icon":"image","href":"/api-reference/avatars"},{"title":"List avatars","openapi":"GET /avatars","href":"/api-reference/endpoint/get-avatars"},{"title":"Get an avatar","openapi":"GET /avatars/{id}","href":"/api-reference/endpoint/get-avatars-id"},{"title":"Create an avatar","openapi":"POST /avatars","href":"/api-reference/endpoint/post-avatars"},{"title":"Delete an avatar","openapi":"DELETE /avatars/{id}","href":"/api-reference/endpoint/delete-avatars-id"},{"title":"Set a persona's avatar","openapi":"PUT /personas/{id}/avatar","href":"/api-reference/endpoint/put-personas-id-avatar"},{"title":"Clear a persona's avatar","openapi":"DELETE /personas/{id}/avatar","href":"/api-reference/endpoint/delete-personas-id-avatar"}]},{"group":"Voices","icon":"microphone","pages":[{"title":"List available voices","openapi":"GET /voices","href":"/api-reference/endpoint/get-voices"},{"title":"Voice attributions","icon":"scale-balanced","href":"/api-reference/voice-attributions"}]},{"group":"Tools","icon":"screwdriver-wrench","pages":[{"title":"Tools (Custom Functions)","icon":"code","href":"/api-reference/custom-functions"},{"title":"Screen Apps","icon":"app-window","href":"/api-reference/screen-apps"},{"title":"List tool definitions","openapi":"GET /custom-functions","href":"/api-reference/endpoint/get-custom-functions"},{"title":"Create a tool definition","openapi":"POST /custom-functions","href":"/api-reference/endpoint/post-custom-functions"},{"title":"Get a tool definition","openapi":"GET /custom-functions/{id}","href":"/api-reference/endpoint/get-custom-functions-id"},{"title":"Update a tool definition","openapi":"PATCH /custom-functions/{id}","href":"/api-reference/endpoint/patch-custom-functions-id"},{"title":"Delete a tool definition","openapi":"DELETE /custom-functions/{id}","href":"/api-reference/endpoint/delete-custom-functions-id"},{"title":"List tools attached to a scenario","openapi":"GET /scenarios/{scenarioId}/custom-functions","href":"/api-reference/endpoint/get-scenarios-scenarioid-custom-functions"},{"title":"Attach a tool to a scenario","openapi":"POST /scenarios/{scenarioId}/custom-functions/{id}/attach","href":"/api-reference/endpoint/post-scenarios-scenarioid-custom-functions-id-attach"},{"title":"Update a scenario-tool attachment","openapi":"PATCH /scenarios/{scenarioId}/custom-functions/{id}","href":"/api-reference/endpoint/patch-scenarios-scenarioid-custom-functions-id"},{"title":"Detach a tool from a scenario","openapi":"DELETE /scenarios/{scenarioId}/custom-functions/{id}","href":"/api-reference/endpoint/delete-scenarios-scenarioid-custom-functions-id"}]},{"group":"Guardrails","icon":"shield-halved","pages":[{"title":"Guardrails","icon":"shield-halved","href":"/api-reference/guardrails"},{"title":"List guardrails","openapi":"GET /guardrails","href":"/api-reference/endpoint/get-guardrails"},{"title":"Create a guardrail","openapi":"POST /guardrails","href":"/api-reference/endpoint/post-guardrails"},{"title":"Get a guardrail","openapi":"GET /guardrails/{id}","href":"/api-reference/endpoint/get-guardrails-id"},{"title":"Update a guardrail","openapi":"PATCH /guardrails/{id}","href":"/api-reference/endpoint/patch-guardrails-id"},{"title":"Delete a guardrail","openapi":"DELETE /guardrails/{id}","href":"/api-reference/endpoint/delete-guardrails-id"},{"title":"List guardrails attached to a scenario","openapi":"GET /scenarios/{scenarioId}/guardrails","href":"/api-reference/endpoint/get-scenarios-scenarioid-guardrails"},{"title":"Attach a guardrail to a scenario","openapi":"POST /scenarios/{scenarioId}/guardrails/{id}/attach","href":"/api-reference/endpoint/post-scenarios-scenarioid-guardrails-id-attach"},{"title":"Update a scenario-guardrail attachment","openapi":"PATCH /scenarios/{scenarioId}/guardrails/{id}","href":"/api-reference/endpoint/patch-scenarios-scenarioid-guardrails-id"},{"title":"Detach a guardrail from a scenario","openapi":"DELETE /scenarios/{scenarioId}/guardrails/{id}","href":"/api-reference/endpoint/delete-scenarios-scenarioid-guardrails-id"}]},{"group":"Meeting Skills","icon":"puzzle-piece","pages":[{"title":"Meeting Skills","icon":"puzzle-piece","href":"/api-reference/skills"},{"title":"List skills","openapi":"GET /skills","href":"/api-reference/endpoint/get-skills"},{"title":"Create a skill","openapi":"POST /skills","href":"/api-reference/endpoint/post-skills"},{"title":"Get a skill","openapi":"GET /skills/{id}","href":"/api-reference/endpoint/get-skills-id"},{"title":"Update a skill","openapi":"PATCH /skills/{id}","href":"/api-reference/endpoint/patch-skills-id"},{"title":"Delete a skill","openapi":"DELETE /skills/{id}","href":"/api-reference/endpoint/delete-skills-id"},{"title":"List skills attached to a scenario","openapi":"GET /scenarios/{scenarioId}/skills","href":"/api-reference/endpoint/get-scenarios-scenarioid-skills"},{"title":"Attach a skill to a scenario","openapi":"POST /scenarios/{scenarioId}/skills/{id}/attach","href":"/api-reference/endpoint/post-scenarios-scenarioid-skills-id-attach"},{"title":"Update a scenario-skill attachment","openapi":"PATCH /scenarios/{scenarioId}/skills/{id}","href":"/api-reference/endpoint/patch-scenarios-scenarioid-skills-id"},{"title":"Detach a skill from a scenario","openapi":"DELETE /scenarios/{scenarioId}/skills/{id}","href":"/api-reference/endpoint/delete-scenarios-scenarioid-skills-id"}]},{"group":"Users","icon":"users","pages":[{"title":"Get a user by ID","openapi":"GET /users/{userId}","href":"/api-reference/endpoint/get-users-userid"},{"title":"Update a user","openapi":"PUT /users/{userId}","href":"/api-reference/endpoint/put-users-userid"}]},{"group":"Guides","icon":"book-open","pages":[{"title":"Prompting Guide","icon":"lightbulb","href":"/api-reference/prompting-guide"},{"title":"Examples","icon":"flask","href":"/api-reference/examples"},{"title":"Observability \u0026 Tracing","icon":"chart-line","href":"/api-reference/observability"}]},{"group":"Integrations","icon":"plug","pages":[{"title":"Bring Your Own Agent","icon":"robot","href":"/api-reference/bring-your-own-agent"},{"title":"LangChain","icon":"link","href":"/api-reference/langchain"},{"title":"MCP Server","icon":"plug","href":"/api-reference/mcp"},{"title":"Webhooks","icon":"webhook","href":"/api-reference/webhooks"}]},{"group":"Agent Skills","icon":"robot","pages":[{"title":"Claude Code Skill","icon":"terminal","href":"/skills/claude-code"},{"title":"Codex Skill","icon":"code","href":"/skills/codex"}]}]}]},"title":"Audio format - Waterr.ai","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":[],"chunks":[]}