Live translation feature #12
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
I've implemented a backend for doing live translation that's based on Hero Voice and the Hero Voice provider. It's ready to implement into the app with the following notes:
The input language will be auto-detected by the voice provider and then Hero Voice will request translations to the other target languages via LLM calls using OpenRouter.
For our target languages, I found that Mistral v4 small has good performance in terms of both speed and accuracy. It's an open model made in Europe as well, so that can be nice for our narrative here in terms of sovereignty. This is a model we can host on our own infrastructure when we have the proper capacity.
One caveat for now is that this is depending on pauses from the speaker in order to segment the audio. This works pretty well for a live or real-time feeling, assuming that the speaker provides adequate pauses. However, if we feel it's not good enough, then I do have some ideas about how we can make it more responsive.
Added scope — live translation for presentations (on-stage)
Beyond the meetings/in-person recorder above, we also need live translation for presentations:
(Folded in from the conference-organiser action items, 2026-06-24. P0.)
Wired live translation into the cm50 Meetings recorder
The live-translation backend from this issue is now integrated into the Meetings → In-person recorder (
developmentbranch), as a hybrid live + offline-durable recorder.Live translation (thin client, browser → hero_voice directly)
hero_voice_weband sends aconfigframe withtranslate_to= the app's UI languages (en,es,fr); the server skips the detected source language automatically. Defaulttranslation_model=mistralai/mistral-small-2603.window.CM50_VOICE_WS_URL; default is the ebook's canonical path/hero_voice/rpc/api/voice/transcribe/ws(note: the shipped widget's hard-coded/hero_voice/rest/...path is stale).components.jswidget for this, because itscreateStreamingRecorderdoes not yet sendtranslate_to(and has no offline support). cm50 uses a small own client speaking the documented protocol.Offline durability (survives an internet cut)
meeting_recordendpoint (server only summarises — no redundant re-transcription).meeting_transcribeendpoint when connectivity returns.MeetingRecordinggainedsource_language+translations[].Deployment prerequisites (per this issue)
hero_voice+hero_voice_providerfrom theirdevelopmentbranches.parakeet-v2;parakeet-v3is a provider/model-config item, not yet referenced in code. The feature works today on v2 (source-lang auto-detect + Mistral translation); v3 will improve source ASR.Proposed follow-up (reusable): add the IndexedDB offline-durability layer (and
translate_topassthrough) into the hero_voice widget'scomponents.js, so other apps get offline recording + translation for free. Happy to open that PR next.One clarification: Parakeet v2 is English only and Parakeet v3 supports 25 European languages (with slightly worse English performance).