# Someone sent a voice note instead of writing

> Three minutes of speech, and your client cannot hear it. Short audio is not queued: the transcription comes back inside the same call.

Canonical HTML version: https://mcpbelt.com/problems/transcribe-a-voice-note

## The problem

Somebody recorded three minutes on their phone rather than typing four lines. It arrives as an `.m4a` in a chat, and it contains an address, a date and a change of plan, which is to say everything the next step depends on.

Your agent cannot open it. Not because three minutes is a lot, but because audio is not something most clients can put in front of a model at all, and the file is the only place the information exists. Nobody wrote it down. That is the whole point of a voice note.

This is a small problem that blocks a large one. The task is not transcription, it is booking the thing or answering the person, and it is stopped at the first step by three minutes of speech.

## Why it fails locally

The client does not listen. Whatever is holding the conversation reads text, and a file it cannot decode is a file it cannot reason about: there is no partial answer here, no degraded mode, just a gap where the content was.

Three minutes of talking is also not three minutes of clean dictation. It is speech: false starts, a sentence abandoned halfway and restarted, background noise from wherever the person was walking, and proper nouns. Names of people, streets and companies are the part that fails first and matters most, because a wrong name is not a typo, it is a wrong answer that reads as a right one. A small local model gets the easy sentences and mangles exactly those tokens.

And running a speech model on your own machine is real time or worse on a laptop, so the cheapest case by price becomes one of the slower ones by wall clock, inside a tool call that has to answer.

## The code

Short audio is not queued. `listen` transcribes it and returns the text in the same response, with no handle to poll.

```
upload(filename="note.m4a", content_type="audio/mp4")
  -> key, upload_url

curl -T note.m4a "<upload_url>"

listen(key="<key>")
  -> handle, engine, cost_eur, chars, structure
  -> text            # the whole transcription, inline

# longer than a few minutes, the same call answers:
#   -> handle, status: running, estimated_minutes
#   and result(handle="<handle>") serves it once ready
```

## What it costs

This is the cheapest thing here. `listen` is priced per minute of audio, 0.005 EUR in `balanced` mode, so a three-minute note costs about 0.015 EUR. `exact` is 0.008 EUR per minute and is worth it when the recording is noisy or the names matter.

The 0.10 EUR of trial credit covers a lot of voice notes before you have paid anything. Duration is measured from the file rather than estimated from its weight, and a duration declared in the file's header that disagrees with its size is not taken at face value, so a three-minute note is charged as three minutes.

The same note sent twice is charged once: files are recognised by their content, not their name, and the second call returns the first result for nothing. If the transcription fails, nothing is charged at all.

## What this does not do

- Under a few estimated minutes the text comes back inline. Above that the job is queued and you get a handle with `status: running` instead, which is the same tool behaving correctly, not a different one.
- Speakers are separated here too, and on a one-person note that means a single `Speaker A`. Nothing identifies who that person is.
- You get the transcription, not a reading of it. No summary, no translation, no tone.
- Language is detected automatically. Pass `language="it"` when you already know it and the recording is poor: it removes a guess the engine would otherwise make.
