Skip to content

v2.0.6 — .opus voice notes, actually working this time

Choose a tag to compare

@lfnovo lfnovo released this 30 Jul 11:04
· 24 commits to main since this release
aed3618

Finishes the .opus fix that v2.0.5 only got halfway. If you upgraded to 2.0.5 for voice-message support, upgrade again — it did not actually work.

🐛 The fix

.opus audio still failed on 2.0.5, one step later in the pipeline (#69)

2.0.5 fixed file detection and segment containers, so the file finally reached the transcription provider. OpenAI then rejected it:

RuntimeError: OpenAI API error: Unsupported file format opus

Its accepted extensions for /v1/audio/transcriptions are flac, m4a, mp3, mp4, mpeg, mpga, oga, ogg, wav, webm. Ogg is on the list; opus is not. The container and codec were never the problem — only the name.

Confirmed by uploading the same bytes twice with the Content-Type held constant and only the filename changed:

Upload Result
filename=x.opus Invalid file format
filename=x.ogg transcribes

.opus is Opus-in-Ogg, so .ogg is not a disguise — it is the container's own name. Ogg-family audio is now presented to the provider under an accepted extension. For files short enough to skip splitting this goes through a symlink, so your original file is never renamed, copied or modified. Segments inherit the same mapping, which keeps their stream copy valid.

Verified end to end against the live OpenAI API on both paths that were broken — a short voice note and a 700-second file that exercises segmentation — including with stt_model = "gpt-transcribe", which was a double failure before 2.0.5.

⚠️ Breaking changes

None. No public exports, CLI flags, MCP tool signatures or config keys changed.

🙏 Thanks

To the reporter of #69, who found this, isolated it to the filename with a byte-identical cp to .ogg, and reopened the issue rather than letting a half-fix stand.


Full details in the CHANGELOG.

Install: pip install content-core==2.0.6
Extras: content-core[docling], [crawl4ai], [langchain]
Zero-install: uvx content-core extract <source>
MCP: uvx content-core mcp