Choosing a low-cost voice API with function calling
The cheapest voice minute on this list cannot call a tool at all. The rest differ in who runs the function, whether the voice keeps talking while it runs, and what a caller's interruption cancels.
Tool support is several separate questions
"Supports function calling" usually means the model can emit a structured call. Someone still has to execute it, and the result has to get back into the conversation. Meanwhile the caller hears silence, filler, or a conversation that keeps going. When the caller interrupts, some work stops and some keeps running. A booking agent can fail at any of these points.
The table answers each question from the provider's own documentation. "Not documented" means we read the linked pages and found no statement either way. It does not mean the feature is missing.
| API / model | Tool schema | Who executes | Result returned by | Talks while a call is pending | What an interruption cancels | Published rate |
|---|---|---|---|---|---|---|
| gpt-realtime-2.1 | JSON Schema functions in session.tools or response.tools | Your application | function_call_output item, then response.create | The documented flow speaks again after you send response.create | With VAD, user speech cancels the in-progress response; your handler is yours to stop | Audio $32/M input, $0.40/M cached, $64/M output; text $4, $0.40, $24/M |
| gpt-live-1 | Delegated to a backend: Responses delegation or your own agent | Backend model; your application runs your function tools | Results to the backend, which GPT-Live then voices | Yes: GPT-Live can keep talking and explain the result when it arrives | Speech only; backend work keeps running until your application cancels it | $0.05/min, billed per second; backend usage extra |
| Gemini 3.1 Flash Live Preview | Function declarations in the session config | Your application | send_tool_response | No: listed as synchronous only, and synchronous calls block interaction | toolCallCancellation is in the Live API reference, sent when the client interrupts a server turn | Audio $3/M input (≈$0.005/min), $12/M output (≈$0.018/min) |
| Gemini 3.8 Live | Function declarations; Google's examples use gemini-3.8-live | Your application | send_tool_response | Not documented: the sync/async table lists only 3.1 Flash Live and 2.5 Flash Live | toolCallCancellation is in the Live API reference; per-model behavior not documented | Same audio rates as 3.1 Flash Live |
| Grok Voice Think Fast 2.0 | Custom functions, plus server-side web search, X search, collections and MCP | Your application for custom functions; xAI for server-side tools | function_call_output item, then response.create | Not documented | Not documented | $0.08/min; $0.004 per text input item, tool results exempt |
| Deepgram Voice Agent | Functions in agent settings | Your client, or Deepgram calling an endpoint you provide | FunctionCallResponse | Not documented | Calls already sent to you get FunctionCallCancelled when the user speaks again | Standard $0.075/min of WebSocket connection time |
| .wave Nemotron VoiceChat 11B | Not supported | None | None | None | None | $0.005/min introductory beta rate; 120-second sessions |
| Duplex Compute | Tool calling included | Not documented | Not documented | Not documented | Not documented | $0.01 per connected minute |
Gemini rates are from Google's pricing page, Grok's from xAI pricing and the model page, Deepgram's from Deepgram pricing. Duplex Compute is in early access; its API reference is not public yet.
Reading the rows
OpenAI Realtime: you run everything after the call
gpt-realtime-2.1 emits a function_call item with a call_id. Your code runs the function, adds a function_call_output with the same call_id, and sends response.create. The function calling walkthrough has the event JSON. Interrupting cancels the model's speech. A booking your handler already started is your problem to finish, cancel or supersede.
GPT-Live: the voice keeps going, the backend does the work
gpt-live-1 is a full-duplex voice model that hands reasoning and tools to a backend. OpenAI's guide says the application checks permissions, obtains confirmations, runs functions and saves task progress. The voice minute is $0.05. Backend tokens and tools are billed on top, so the minute rate is a floor.
Gemini Live: pin the model before you plan around async
Google's tool use page lists Gemini 3.1 Flash Live Preview as synchronous only and Gemini 2.5 Flash Live Preview as synchronous and asynchronous. Synchronous calls pause the conversation until results return. On 2.5, a function marked NON_BLOCKING runs while the conversation continues, and the response's scheduling field chooses INTERRUPT, WHEN_IDLE or SILENT. The same page uses gemini-3.8-live in its code samples but leaves it out of that table. Test 3.8 before you depend on non-blocking calls.
The Live API reference describes toolCallCancellation as a notice that earlier calls "should not have been executed", sent only when the client interrupts a server turn. If those calls had side effects, the reference says clients may attempt to undo them.
Grok Voice: server-side tools change the bill
xAI runs web search, X search, collections and MCP tools on its side. Custom functions follow the same three events as OpenAI: response.function_call_arguments.done, a function_call_output item, then response.create. With several calls in one turn, xAI says to return every output before one response.create. Sessions with default server_vad are billed for session duration. Server-side tool calls carry their own fees, such as $5 per 1,000 web searches.
Deepgram Voice Agent: early dispatch, explicit cancellation
Deepgram starts a reply before speech-to-text confirms the user finished. Function calls are not held by default, so a call can fire while the caller is still talking. If the caller keeps going, Deepgram sends FunctionCallCancelled and drops any late response. For anything you cannot undo, its docs recommend defer_until_eot: true. Of the APIs here, Deepgram documents interruption and tool cancellation most explicitly.
.wave Nemotron: cheapest minute, no tools
.wave hosts NVIDIA's Nemotron VoiceChat 11B at $0.005 per minute. Its limits section says custom instructions, text input and tools are not supported, and sessions stop at 120 seconds. The underlying model has a tool-call channel when you host it yourself; the Nemotron note separates the checkpoint from the hosted service.
Price the voice layer for one call
These APIs bill in different units, so a "per minute" column hides most of the difference. The table prices the voice layer of one 10-minute call in which the caller speaks for four minutes and the agent for four. It is arithmetic on published rates, not an invoice. Billing formulas for each model live in the voice agent pricing hub.
| API | Arithmetic | Voice layer, 10 minutes | Not included |
|---|---|---|---|
| gpt-realtime-2.1 | 4 min × 600 input tokens × $32/M + 4 min × 1,200 output tokens × $64/M | ≈$0.38 of new audio tokens | Earlier turns re-sent as input, caching, text, reasoning |
| gpt-live-1 | 10 × $0.05 | $0.50 | Backend model and tool usage |
| Gemini 3.8 Live | 10 min input × $0.005 + 4 min output × $0.018 | ≈$0.12 | Accumulated context billed each turn, transcription, search |
| Grok Voice Think Fast 2.0 | 10 × $0.08 | $0.80 | Text inputs, server-side tool calls |
| Deepgram Voice Agent Standard | 10 × $0.075 | $0.75 | Telephony, not stated as included |
| .wave Nemotron VoiceChat 11B | Not possible | Sessions end at 120 seconds; no tools | |
| Duplex Compute | 10 × $0.01 | $0.10 | Your own systems the tools call |
The Realtime token counts come from OpenAI's cost guide: one input audio token per 100 ms and one output token per 50 ms. Google's best practices state that every turn is charged for all tokens in the session context window, so long Gemini calls cost more per minute than the first minute does. A lower voice-session rate is not the same as a lower all-in cost per task.
Cost per successful task
A cheap minute that books the wrong table costs more than its minutes. Count total spend across every attempt, including retries and calls a human had to finish, and divide by tasks completed correctly. Correct means the application state is right: one reservation, seven people, the requested time.
A hypothetical example shows the shape. Take 100 three-minute calls at $0.05 per minute: $15.00 of voice time. If 90 succeed, the cost per success is $0.167. If 70 succeed, the same $15.00 works out to $0.214, before the cost of a human finishing the rest or undoing a double booking. The numbers are invented to show the formula; no provider was measured.
The behavior columns feed that denominator. A tool that fires while the caller is still correcting themselves, with no cancellation and no idempotency key, produces the double booking that never shows up in a per-minute comparison. OpenAI's voice agent evaluation guide checks tool calls and the resulting application state for this reason.
Which row fits
If you need tools today and want the provider to say exactly what an interruption cancels, Deepgram's documentation is the most explicit of these. If your agent already exists as a text backend, GPT-Live keeps it and adds a voice that talks while the work runs, at $0.05 per minute plus the backend. Gemini Live has the lowest token-priced audio here, with async behavior that depends on the exact model. If you are building a voice application with tools and the voice minute dominates your bill, Duplex Compute prices a full-duplex session with tool calling at $0.01 per connected minute. .wave's Nemotron beta suits short tests of full-duplex speech, not agents that act.
Related notes
- OpenAI Realtime function calling
- Voice agent pricing: calculator and billing formulas
- Gemini Live API pricing
- Nemotron VoiceChat tool calling
- Voice agent evaluation
Need tools without paying for a premium voice minute?
Duplex Compute is a full-duplex voice API with tool calling at $0.01 per connected minute. Tell us your expected voice hours, the tools your agent calls, and the provider you use now.
Request access