<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Parley</title>
    <description>The latest articles on DEV Community by Parley (@parleyvoice).</description>
    <link>https://dev.to/parleyvoice</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4177947%2F84f17b1a-3721-436f-a748-b29a59bc94e0.png</url>
      <title>DEV Community: Parley</title>
      <link>https://dev.to/parleyvoice</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/parleyvoice"/>
    <language>en</language>
    <item>
      <title>How Real-Time Simultaneous Interpretation Works: Pipeline vs End-to-End Speech Models</title>
      <dc:creator>Parley</dc:creator>
      <pubDate>Mon, 26 Oct 2026 02:05:45 +0000</pubDate>
      <link>https://dev.to/parleyvoice/how-real-time-simultaneous-interpretation-works-pipeline-vs-end-to-end-speech-models-44ja</link>
      <guid>https://dev.to/parleyvoice/how-real-time-simultaneous-interpretation-works-pipeline-vs-end-to-end-speech-models-44ja</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; “Realtime voice translation” usually means one of two architectures. A &lt;strong&gt;three-stage pipeline&lt;/strong&gt; turns speech into text (ASR), translates the text (MT), then speaks the result (TTS). An &lt;strong&gt;end-to-end / speech-to-speech (S2S)&lt;/strong&gt; system maps speech toward speech more directly, with less (or no) intermediate text you can inspect. Latency, fidelity, language coverage, voice cloning, and cost all follow from that choice — not from marketing labels.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://parleyvoice.com/" rel="noopener noreferrer"&gt;Parley Voice&lt;/a&gt; (China: &lt;a href="https://parleyvoice.cn/" rel="noopener noreferrer"&gt;parleyvoice.cn&lt;/a&gt;) because I sit in international meetings, my spoken English is weak, and I wanted two-way spoken translation through Zoom, Google Meet and similar apps without asking the other side to install anything. Disclosure: I make Parley. This piece is the architecture trade-off I wish someone had written before I started shipping.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “three-stage” means (ASR → MT → TTS)
&lt;/h2&gt;

&lt;p&gt;Cascaded systems do three jobs in sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ASR&lt;/strong&gt; — turn source audio into text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MT&lt;/strong&gt; — translate that text into the target language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTS&lt;/strong&gt; — synthesize speech from the translated text (system voice or cloning).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Buffers and phrase-boundary logic sit between stages. That is why cascades often feel like sitting next to a human interpreter: they wait a beat for context, then emit a chunk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt; inspectable intermediate text (captions, logs, SRT); independent knobs for ASR / MT / TTS; familiar failure modes (“the transcript misheard the name”).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Costs:&lt;/strong&gt; stacked delay; error compounding (ASR miss → wrong MT → confident TTS); prosody loss unless cloning or style transfer is added.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “end-to-end / S2S” means
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;End-to-end&lt;/strong&gt; (often marketed as &lt;strong&gt;speech-to-speech&lt;/strong&gt; or &lt;strong&gt;S2S&lt;/strong&gt;) tries to go from source audio toward target audio with fewer hand-offs. Designs vary: a single model emitting translated speech or speech tokens; a shared latent space; or hybrids that peek at text internally without exposing a clean ASR→MT→TTS product surface.&lt;/p&gt;

&lt;p&gt;For buyers, the practical definition is: &lt;strong&gt;you hear translated speech, and you may or may not get a reliable intermediate transcript as a first-class feature.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt; fewer hand-offs can reduce stacked error and, in some demos, feel more continuous; prosody may transfer better when speech is modeled jointly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Costs:&lt;/strong&gt; harder to debug without a stable text stage; language matrices are often narrower than cascaded ASR/MT catalogs; caption quality is not guaranteed; you may lose independent cost/control over each stage.&lt;/p&gt;

&lt;p&gt;Neither architecture is “more simultaneous.” Simultaneous means overlapping in time with the speaker — &lt;strong&gt;not&lt;/strong&gt; zero delay. Both buffer audio for context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Latency, fidelity, languages, voice, and cost
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Latency
&lt;/h3&gt;

&lt;p&gt;Published figures are easy to misuse. On Parley’s live site (as of 2026-10-22), Qwen officially reports &lt;strong&gt;LAAL of about 2.3 s&lt;/strong&gt;, and Doubao reports &lt;strong&gt;speech output latency of about 2.53 s&lt;/strong&gt;. The site is explicit: &lt;strong&gt;these are different metrics — not a direct speed comparison or a guarantee of in-app latency.&lt;/strong&gt; Actual delay depends on the model, network, and audio devices. Provider demos are not Parley app recordings.&lt;/p&gt;

&lt;p&gt;Ask vendors: is the number model-only or full path (capture → cloud → playback)? Does silence while connected count toward billing? Did you measure on &lt;strong&gt;your&lt;/strong&gt; network before an important call?&lt;/p&gt;

&lt;h3&gt;
  
  
  Fidelity
&lt;/h3&gt;

&lt;p&gt;Cascades fail when ASR mishears; E2E fails when the joint model drifts. Mitigation is the same: pause on numbers and names, confirm commitments, keep captions as a second channel when available. For legal, safety, or contractual content, use a qualified human interpreter when the risk requires it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Language coverage
&lt;/h3&gt;

&lt;p&gt;Input recognition and &lt;strong&gt;spoken&lt;/strong&gt; output are not the same list. On Parley’s live &lt;a href="https://parleyvoice.com/languages" rel="noopener noreferrer"&gt;languages&lt;/a&gt; (&lt;a href="https://parleyvoice.cn/languages" rel="noopener noreferrer"&gt;China&lt;/a&gt;) page:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Spoken output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen (multilingual)&lt;/td&gt;
&lt;td&gt;60 languages&lt;/td&gt;
&lt;td&gt;29 languages (Cantonese is input-only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Doubao&lt;/td&gt;
&lt;td&gt;Chinese ↔ English&lt;/td&gt;
&lt;td&gt;Chinese ↔ English&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OpenAI and Gemini adapters are marked &lt;strong&gt;coming soon&lt;/strong&gt; on the live site — &lt;strong&gt;not&lt;/strong&gt; available in the app’s provider selector today.&lt;/p&gt;

&lt;p&gt;Cascaded stacks often win breadth by composing ASR/MT catalogs. E2E stacks often win continuity on fewer pairs. Check &lt;strong&gt;spoken&lt;/strong&gt; targets, not “supports 100 languages” headlines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Voice cloning
&lt;/h3&gt;

&lt;p&gt;Voice answers “what should the translation sound like?” — not which architecture is used. On Parley’s managed service, &lt;strong&gt;Qwen and Doubao currently support live voice cloning&lt;/strong&gt; at the displayed session rate: no advance sample or enrollment (per live FAQ / homepage). You can also pick a built-in voice. Likeness is not a guarantee of translation accuracy. Deeper note: &lt;a href="https://parleyvoice.com/blog/meeting-translation-in-your-own-voice" rel="noopener noreferrer"&gt;Meeting translation in your own voice&lt;/a&gt; (&lt;a href="https://parleyvoice.cn/blog/meeting-translation-in-your-own-voice" rel="noopener noreferrer"&gt;China&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost knobs
&lt;/h3&gt;

&lt;p&gt;As of the live &lt;a href="https://parleyvoice.com/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; (&lt;a href="https://parleyvoice.cn/pricing" rel="noopener noreferrer"&gt;China&lt;/a&gt;): managed Qwen &lt;strong&gt;$0.070 / minute&lt;/strong&gt;, managed Doubao &lt;strong&gt;$0.148 / minute&lt;/strong&gt;, no recurring Parley subscription for managed meeting use, billed by the millisecond once the connection is ready (silence included; stop the session to stop billing). Two directions share one session charge. A 60-minute Qwen session at list rates is &lt;strong&gt;$4.200&lt;/strong&gt;; Doubao is &lt;strong&gt;$8.880&lt;/strong&gt;. Temporary Preview offers can change what you pay for credit — check the live page. The homepage still states a &lt;strong&gt;$1 first top-up&lt;/strong&gt; is enough to try.&lt;/p&gt;

&lt;h2&gt;
  
  
  When each fits meetings vs venues
&lt;/h2&gt;

&lt;p&gt;This is different from choosing &lt;strong&gt;meeting voice vs captions vs venue mode&lt;/strong&gt; (&lt;a href="https://parleyvoice.com/blog/live-voice-vs-captions-vs-venue" rel="noopener noreferrer"&gt;Live voice, captions and venue interpretation&lt;/a&gt; (&lt;a href="https://parleyvoice.cn/blog/live-voice-vs-captions-vs-venue" rel="noopener noreferrer"&gt;China&lt;/a&gt;)). Here the question is pipeline style inside the speech path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Online meetings (two-way):&lt;/strong&gt; you need speak + listen, turn-taking, and often captions for verification. A cascade that exposes bilingual text is usually easier day to day. An E2E model can feel smoother in demos only if captions, language pairs, and virtual-mic routing still work with your meeting app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Venue / one-speaker events:&lt;/strong&gt; continuity and clear output routing matter more than back-and-forth repair. Either architecture can work; physical audio (feedback into the source mic, language bleed) often dominates. Architecture alone will not fix a bad PA layout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Buyer checklist:&lt;/strong&gt; (1) spoken output languages you need, (2) captions you can re-check, (3) what is billed and whether silence counts, (4) whether the other side must install anything, (5) a real both-directions test before the important call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Parley sits today
&lt;/h2&gt;

&lt;p&gt;Parley is a &lt;strong&gt;Windows and Mac desktop&lt;/strong&gt; app for &lt;a href="https://parleyvoice.com/meeting-translation" rel="noopener noreferrer"&gt;live meeting translation&lt;/a&gt; (&lt;a href="https://parleyvoice.cn/meeting-translation" rel="noopener noreferrer"&gt;China&lt;/a&gt;): your mic → cloud translation → virtual microphone into Zoom / Meet / similar; meeting audio → translation → your headphones; bilingual captions in the app; caption history local with SRT export. Only you install it. Managed models shipping now are &lt;strong&gt;Qwen&lt;/strong&gt; and &lt;strong&gt;Doubao&lt;/strong&gt;, with live voice cloning included at the session rate. Gemini and OpenAI are listed as coming soon — not shipped.&lt;/p&gt;

&lt;p&gt;I will not invent a roadmap about whether our cloud providers are “pure cascade” or “pure S2S” under the hood. Users feel the product surface — delay, captions, language matrix, voice, and price — more than the research label. We expose managed models with clear per-minute rates, bilingual captions, and honest caveats about network and devices. Delay is often on the order of a couple of seconds in practice (like sitting next to a human interpreter); we do not promise a fixed app SLA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try a short session
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download Parley for Windows (x64 / ARM64) or Mac (Apple Silicon / Intel).&lt;/li&gt;
&lt;li&gt;Check both audio directions with the meeting app you actually use.&lt;/li&gt;
&lt;li&gt;Top up — the live homepage still says a &lt;strong&gt;$1 first top-up&lt;/strong&gt; is enough to try — and run a few minutes at &lt;a href="https://parleyvoice.com/pricing" rel="noopener noreferrer"&gt;pricing&lt;/a&gt; (&lt;a href="https://parleyvoice.cn/pricing" rel="noopener noreferrer"&gt;China&lt;/a&gt;) rates for Qwen or Doubao.&lt;/li&gt;
&lt;li&gt;Stop the session on breaks; connected silence is billed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Questions: &lt;a href="mailto:support@awiki.ai"&gt;support@awiki.ai&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I am Gaowei Chang, founder of Parley Voice (&lt;a href="https://parleyvoice.com/" rel="noopener noreferrer"&gt;parleyvoice.com&lt;/a&gt; · &lt;a href="https://parleyvoice.cn/" rel="noopener noreferrer"&gt;parleyvoice.cn&lt;/a&gt;). I built the product described here. This is not an independent review. Features and prices reflect the public site; confirm &lt;code&gt;/pricing&lt;/code&gt; and &lt;code&gt;/languages&lt;/code&gt; before you buy.&lt;/p&gt;




&lt;p&gt;Learn about ParleyVoice: Overseas &lt;a href="https://parleyvoice.com/" rel="noopener noreferrer"&gt;parleyvoice.com&lt;/a&gt; · China &lt;a href="https://parleyvoice.cn/" rel="noopener noreferrer"&gt;parleyvoice.cn&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Canonical / original:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overseas: &lt;a href="https://parleyvoice.com/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e" rel="noopener noreferrer"&gt;https://parleyvoice.com/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;China: &lt;a href="https://parleyvoice.cn/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e" rel="noopener noreferrer"&gt;https://parleyvoice.cn/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also ZH:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://parleyvoice.com/zh/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e" rel="noopener noreferrer"&gt;https://parleyvoice.com/zh/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://parleyvoice.cn/zh/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e" rel="noopener noreferrer"&gt;https://parleyvoice.cn/zh/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Official posts (both domains):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://parleyvoice.com/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e" rel="noopener noreferrer"&gt;https://parleyvoice.com/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://parleyvoice.cn/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e" rel="noopener noreferrer"&gt;https://parleyvoice.cn/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also ZH:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://parleyvoice.com/zh/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e" rel="noopener noreferrer"&gt;https://parleyvoice.com/zh/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://parleyvoice.cn/zh/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e" rel="noopener noreferrer"&gt;https://parleyvoice.cn/zh/blog/how-realtime-simultaneous-interpretation-works-pipeline-vs-e2e&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>translation</category>
      <category>meetings</category>
      <category>speech</category>
      <category>ai</category>
    </item>
    <item>
      <title>Why Meetings Get Echo After You Add Live Interpretation—and How ParleyVoice Designs Capture-Side AEC</title>
      <dc:creator>Parley</dc:creator>
      <pubDate>Sun, 25 Oct 2026 03:35:58 +0000</pubDate>
      <link>https://dev.to/parleyvoice/why-meetings-get-echo-after-you-add-live-interpretation-and-how-parleyvoice-designs-capture-side-aec-5bih</link>
      <guid>https://dev.to/parleyvoice/why-meetings-get-echo-after-you-add-live-interpretation-and-how-parleyvoice-designs-capture-side-aec-5bih</guid>
      <description>&lt;p&gt;A meeting that sounded fine can turn strange once live interpretation is connected: the other side hears repeated speech, freshly played translation is recognized again, and when both people talk at once the level can swing up and down.&lt;/p&gt;

&lt;p&gt;The meeting app already has echo cancellation. Why does adding an interpretation tool bring the problem back?&lt;/p&gt;

&lt;p&gt;The key is this: &lt;strong&gt;interpretation changes where sound comes from and where it goes. Audio processing has to know again which parts are a person speaking and which parts the device has just played.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What echo cancellation actually removes
&lt;/h2&gt;

&lt;p&gt;Suppose the other person says a sentence in the meeting. It plays from your computer speakers, is picked up again by a nearby microphone, and is sent back to them.&lt;/p&gt;

&lt;p&gt;They hear a slightly delayed version of themselves.&lt;/p&gt;

&lt;p&gt;That is classic acoustic echo: played-out sound returns to the microphone through air, desk, and room reflections.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Echo cancellation—usually called AEC, for Acoustic Echo Cancellation—estimates and suppresses that played-back echo in the microphone signal while trying to keep the local talker’s voice.&lt;/p&gt;

&lt;p&gt;One condition is essential: the system needs to know what the device just played.&lt;/p&gt;

&lt;p&gt;Microphone audio may contain your speech, speaker return, and room noise at the same time. If processing also receives a copy of the playback signal, it can use that as a reference to find echo in the mic that correlates with what was played. Capture plus a playback reference are the two critical inputs for this class of processing.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;sup id="fnref3"&gt;3&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Why the meeting app’s existing AEC may no longer be enough
&lt;/h2&gt;

&lt;p&gt;In a normal meeting, the app usually controls the audio it receives, plays, and captures. After interpretation is connected, that relationship becomes much more complex.&lt;/p&gt;

&lt;h3&gt;
  
  
  New translated audio may be outside the original playback reference
&lt;/h3&gt;

&lt;p&gt;For example, the other side speaks English and the meeting app receives English; the interpretation tool generates and plays a new Chinese utterance.&lt;/p&gt;

&lt;p&gt;The two clips mean roughly the same thing, but their waveforms, durations, and play times are entirely different.&lt;/p&gt;

&lt;p&gt;If the meeting app’s AEC only has the English original as a reference, while your microphone also picks up the loudspeaker Chinese translation, it lacks the reference it needs for that new echo.&lt;/p&gt;

&lt;p&gt;Whether this shows up depends on the meeting app, system audio processing, and output devices. When another application plays the new translation, the original processing path may not cover it fully.&lt;/p&gt;

&lt;h3&gt;
  
  
  The interpretation app may capture the microphone before the meeting app
&lt;/h3&gt;

&lt;p&gt;Two-way interpretation also changes input order: your voice enters the interpretation app first; after translation, it is sent into the meeting through a virtual microphone.&lt;/p&gt;

&lt;p&gt;If the first capture already contains loudspeaker translation mixed in, that echo can reach the translation model early. By the time the meeting app receives the translated stream, the content has already changed.&lt;/p&gt;

&lt;p&gt;On this path, echo should be handled before audio enters the model whenever possible, so repeated recognition and repeated translation are reduced.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sound can also loop back on the wrong digital path
&lt;/h3&gt;

&lt;p&gt;Another class of problem is digital audio routing: translation played by an app is captured again by system loopback, or the same virtual cable is used for both input and output so audio returns to the translation inlet.&lt;/p&gt;

&lt;p&gt;That feedback never travels through air. Fixing it means clarifying capture scope, input/output direction, and what each play path is for.&lt;/p&gt;

&lt;p&gt;So echo after adding interpretation does not mean the meeting app has necessarily failed. More often, new audio paths sit outside the original processing scope. That reading follows from how capture and playback-reference mechanisms work, and from how interpretation is wired in.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;sup id="fnref3"&gt;3&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Our design: bring a playback reference in at capture time
&lt;/h2&gt;

&lt;p&gt;For these issues, ParleyVoice’s echo-cancellation design moves processing earlier—to the audio capture stage.&lt;sup id="fnref4"&gt;4&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;The core idea is straightforward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;When capturing the microphone, also feed the audio that is actually playing as an independent reference into echo cancellation, and suppress loudspeaker return in the mic as much as possible before audio reaches the translation model.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The two inputs have different roles:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Role in echo cancellation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Microphone capture&lt;/td&gt;
&lt;td&gt;The signal to process—may contain local speech, playback echo, and ambient noise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio actually playing&lt;/td&gt;
&lt;td&gt;An independent reference that helps identify components that came from the loudspeaker&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;“Fed at the same time” means giving the processor both streams. The playback reference stays independent for estimating echo; only the processed microphone speech continues into translation.&lt;/p&gt;

&lt;h3&gt;
  
  
  The reference should match what is really played
&lt;/h3&gt;

&lt;p&gt;What the model returned is not always identical to what the loudspeaker finally outputs.&lt;/p&gt;

&lt;p&gt;Users may lower volume, mute their own interpretation ear-return, or play both the other side’s translation and their own monitor mix. The reference should track final playback content, level, and timing as closely as possible.&lt;sup id="fnref4"&gt;4&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;If a meeting app plays original remote audio straight to the speakers, that loudspeaker path also needs to be considered for reference coverage. Knowing only what the interpretation app itself played may not be enough for every echo in the room.&lt;/p&gt;

&lt;h3&gt;
  
  
  Processing must track capture and playback timing
&lt;/h3&gt;

&lt;p&gt;Played sound reaches the microphone after device, air, and room delay, and with level and spectral change.&lt;/p&gt;

&lt;p&gt;AEC must keep estimating the loudspeaker’s contribution in the mic and suppress it. A timely, accurate playback reference gives that process better information.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  While playing translation, still try to keep new user speech
&lt;/h3&gt;

&lt;p&gt;Real meetings often involve listening and adding a thought at the same time—for example, speaking up with “one more point” before the translation finishes playing.&lt;/p&gt;

&lt;p&gt;So this design is not only about driving echo down; it also aims to keep new speech when playback and talking overlap. Sound quality, double-talk, and behavior across devices still need validation in real use.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Acoustic echo and digital feedback both need attention
&lt;/h2&gt;

&lt;p&gt;Capture-side AEC addresses loudspeaker sound returning through the air to the microphone. Alongside that, ParleyVoice also reduces chances that translation re-enters the translation path through routing.&lt;/p&gt;

&lt;p&gt;On the Windows system-audio capture path, the app excludes output from its own process tree; dual virtual-cable setups check whether endpoints are reused, and keep “translation to the meeting” separate from “original audio from the meeting.” These are routing guards already present in the current client.&lt;sup id="fnref5"&gt;5&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;They work with capture-side AEC: the former reduces digital loopback; the latter targets physical playback returning to the mic.&lt;/p&gt;

&lt;p&gt;For users, we want a simpler result: when translation plays, the system tries not to treat it as a new utterance again; when the user speaks, their words reach translation clearly.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Making clear audio part of live interpretation
&lt;/h2&gt;

&lt;p&gt;A professional interpretation experience needs the model, capture, playback, and audio routing to work together.&lt;/p&gt;

&lt;p&gt;Low latency gets translation there sooner; sound echo handling helps the model hear what actually needs translating. Together they improve whether people can listen, speak, and respond naturally.&lt;/p&gt;

&lt;p&gt;ParleyVoice is refining audio processing around that goal: let capture know what is really playing, keep echo out of the model where we can, and send each direction of audio to the right place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We want users to keep their attention on the people in the conversation—and let audio processing do its job quietly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article describes the design of capture-side echo cancellation. Full results of related enhancement paths still need validation and refinement by device and audio mode; available capability depends on the version in use.&lt;/em&gt;&lt;sup id="fnref4"&gt;4&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Learn about ParleyVoice: Overseas &lt;a href="https://parleyvoice.com/" rel="noopener noreferrer"&gt;parleyvoice.com&lt;/a&gt; · China &lt;a href="https://parleyvoice.cn/" rel="noopener noreferrer"&gt;parleyvoice.cn&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Technical references
&lt;/h3&gt;




&lt;p&gt;Canonical / original:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overseas: &lt;a href="https://parleyvoice.com/blog/echo-cancellation-for-meeting-interpretation" rel="noopener noreferrer"&gt;https://parleyvoice.com/blog/echo-cancellation-for-meeting-interpretation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;China: &lt;a href="https://parleyvoice.cn/blog/echo-cancellation-for-meeting-interpretation" rel="noopener noreferrer"&gt;https://parleyvoice.cn/blog/echo-cancellation-for-meeting-interpretation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;&lt;a href="https://workspace.google.com/resources/echo-cancellation/" rel="noopener noreferrer"&gt;Google Workspace: acoustic echo cancellation overview&lt;/a&gt;.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;&lt;a href="https://webrtc.googlesource.com/src/+/refs/heads/main/api/audio/audio_processing.h" rel="noopener noreferrer"&gt;WebRTC audio processing API: capture stream and reverse (playback) stream&lt;/a&gt;. Cited for general audio-processing principles; it does not mean the product uses that project’s specific implementation.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nn-audioclient-iacousticechocancellationcontrol" rel="noopener noreferrer"&gt;Microsoft: capture endpoint and acoustic echo cancellation render endpoint&lt;/a&gt;.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;Product design basis: ParleyVoice &lt;code&gt;release/1024&lt;/code&gt; audio architecture and default-path notes (internal engineering docs; repository links omitted from the public post). This article follows the design; it does not claim every default path is already fully shipped.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn5"&gt;
&lt;p&gt;Windows system-audio capture scope and dual virtual-cable endpoint checks are current client routing guards (internal implementation notes; repository links omitted from the public post).&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>webrtc</category>
      <category>voice</category>
      <category>rtc</category>
      <category>i18n</category>
    </item>
    <item>
      <title>Keeping Interpretation in Step with Conversation: How ParleyVoice Uses RTC to Cut Waiting in Live Translation</title>
      <dc:creator>Parley</dc:creator>
      <pubDate>Sun, 25 Oct 2026 03:35:08 +0000</pubDate>
      <link>https://dev.to/parleyvoice/keeping-interpretation-in-step-with-conversation-how-parleyvoice-uses-rtc-to-cut-waiting-in-live-ej2</link>
      <guid>https://dev.to/parleyvoice/keeping-interpretation-in-step-with-conversation-how-parleyvoice-uses-rtc-to-cut-waiting-in-live-ej2</guid>
      <description>&lt;p&gt;You have just answered a question on a cross-border call, but the other side does not reply. You assume they missed it and repeat yourself; at the same moment they finally hear the previous translation and start speaking.&lt;/p&gt;

&lt;p&gt;What should have been a natural exchange turns into waiting, repetition, and people talking over each other.&lt;/p&gt;

&lt;p&gt;That is one of the biggest experience gaps between live interpretation and ordinary text translation: &lt;strong&gt;a sentence must not only be accurate—it also has to show up in the conversation on time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To cut waiting outside the model itself, ParleyVoice introduces real-time audio transport on RTC-supported hosted meeting paths, and coordinates the rhythm of capture, send, and playback. We want interpretation to stay as close as possible to the model’s own response speed, so technical handling takes a little less of the conversation’s time.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why latency matters so much
&lt;/h2&gt;

&lt;p&gt;In a meeting, people are not only trading sentences. They are also judging when to reply, when to explain, and when to stop and listen.&lt;/p&gt;

&lt;p&gt;If the translation arrives too late, you may still be hearing the previous line while the other person has already moved to the next question. Both sides wait, yet neither is sure the other heard them; a short follow-up is easy to mistime.&lt;/p&gt;

&lt;p&gt;Latency during continuous speech hurts understanding as well. The speaker has already flipped to the next slide while the translation in your ear is still on the previous one, so listeners must spend extra effort remapping sound to what they see.&lt;/p&gt;

&lt;p&gt;Lower latency therefore has concrete value: easier timely replies, less repetition and interruption, and a better chance of staying with the meeting’s pace.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Where time goes from speech to hearing the translation
&lt;/h2&gt;

&lt;p&gt;When people talk about AI translation latency, they often think first of the model. In practice, the model is only one stage in the full audio path.&lt;/p&gt;

&lt;p&gt;After sound enters the microphone, it must be captured and packed into frames, sent over the network to the translation service; once the model understands the meaning and produces translated audio, that audio must return to the device, pass through playback buffering, and finally come out of headphones or speakers.&lt;/p&gt;

&lt;p&gt;The main waits can be summarized as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;End-to-end interpretation latency ≈ capture and packetization wait + uplink/downlink transport and service forwarding + model understanding and generation + playback buffering and device output.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;“Model understanding and generation” also includes waiting the model needs for enough context. With speech-to-speech models, that work may happen inside a single streaming model rather than three separate “recognize → translate → synthesize” services in series.&lt;/p&gt;

&lt;p&gt;A faster model clearly helps. But if audio keeps queuing in transport and playback, users will still feel slow.&lt;/p&gt;

&lt;p&gt;For example, packets may wait once for transport, wait again on the server to be assembled, then accumulate again on the device before play. Each step adds only a little; together they become a noticeable pause.&lt;/p&gt;

&lt;p&gt;Network jitter also makes these waits uneven. Live interpretation therefore needs both low delay and a continuous, stable flow of audio.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What is RTC, and why does it fit live interpretation?
&lt;/h2&gt;

&lt;p&gt;RTC stands for Real-Time Communication. Voice calls and video meetings are its most familiar uses.&lt;/p&gt;

&lt;p&gt;It organizes the audio path around a clear goal: &lt;strong&gt;get sound there in time and keep it continuous, so people can talk naturally.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That matches live interpretation closely. In practice it helps in three ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Keep audio moving forward in small chunks
&lt;/h3&gt;

&lt;p&gt;Live interpretation needs capture, send, model processing, and playback to advance in parallel as much as possible. As soon as a short chunk is captured, it can start moving downstream; as soon as the model produces playable translation, later stages can receive and play it step by step.&lt;/p&gt;

&lt;p&gt;RTC provides transport and playback mechanisms built for continuous audio, reducing the need to repeatedly accumulate large buffers in every application layer.&lt;/p&gt;

&lt;p&gt;WebSockets can also stream audio. RTC’s added value is that it folds timing requirements, network adaptation, and playback continuity into the design of the whole path.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Reduce extra waiting caused by packet loss
&lt;/h3&gt;

&lt;p&gt;With common reliable, ordered TCP delivery, if an earlier packet must be retransmitted, later packets that have already arrived may still have to wait. That is called head-of-line blocking. In a live conversation, it shows up as an extra pause.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;RTC audio usually prefers transports suited to real-time media, together with error recovery and packet-loss concealment, balancing sound quality against playback deadlines and lowering the chance that a brief network blip stalls following speech. Actual results depend on network conditions and the concrete implementation.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;sup id="fnref3"&gt;3&lt;/sup&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Control buffering to balance continuity and timeliness
&lt;/h3&gt;

&lt;p&gt;Audio packets on the internet do not arrive at a perfectly even rate. Sometimes they come early, sometimes late; the receiver needs a short buffer to keep sound continuous.&lt;/p&gt;

&lt;p&gt;Too little buffering and audio glitches; too much and waiting grows. Mature RTC audio processing adjusts playback buffering to arrival patterns, trading only the wait that is needed for continuous sound.&lt;sup id="fnref3"&gt;3&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;For meeting interpretation, that means we pursue faster response while also caring whether a conversation can keep a stable rhythm throughout.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. How ParleyVoice applies these optimizations to interpretation
&lt;/h2&gt;

&lt;p&gt;On RTC-supported hosted meeting modes, ParleyVoice hands audio transport between the client and the translation service to a real-time media path, while also tuning how audio enters the model and returns to the device.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, keep audio flowing.&lt;/strong&gt; Captured sound enters the path as continuous small frames, and returned translation advances in segments, reducing unnecessary whole-chunk waits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, keep send cadence aligned with capture cadence.&lt;/strong&gt; If every send stacks its processing time before the next send, sustained input can gradually back up. We adjusted the send clock so normal processing overhead stays inside the intended period where possible, lowering the risk that audio falls further behind as the conversation continues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the same time, control wait on the playback side.&lt;/strong&gt; After translation enters the play queue, the system keeps a short buffer for coherent playback and limits later queue growth, so different stages do not each add start-of-play delay again.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Together, these steps serve one goal: audio the model can already process in time should reach the user’s ear as soon as possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. How low can latency go?
&lt;/h2&gt;

&lt;p&gt;The experience we aim for can be put in one sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Keep end-to-end live-interpretation latency as close as possible to the model’s own response latency, plus a short overhead for audio transport and playback.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That “short overhead” can be thought of at the scale of a few hundred milliseconds of RTC audio capability.&lt;/p&gt;

&lt;p&gt;Public RTC technical documentation cites a typical audio-path latency of &lt;strong&gt;150–300 milliseconds—about 0.15–0.3 seconds&lt;/strong&gt;—covering capture, encoding, network transport, decoding, and playback.&lt;sup id="fnref4"&gt;4&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;That figure shows that communication and audio processing can occupy only a modest share of overall wait, so interpretation speed depends more on the model’s semantic understanding and speech generation.&lt;/p&gt;

&lt;p&gt;It is important to read this accurately: &lt;strong&gt;150–300 milliseconds is a typical path reference from public technical material, not a measured guarantee for ParleyVoice’s full translation chain.&lt;/strong&gt; Our real path still includes model integration, packetization, and application playback buffering; experience also varies with network, model, device, and usage mode.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;The direction of RTC optimization is clear: steadily reduce the waiting that can be cut outside the model. The faster the model, the more directly users feel that speed.&lt;/p&gt;

&lt;p&gt;For ParleyVoice, low latency finally shows up in real conversation: customer questions get answers sooner, follow-ups in a meeting are easier to attach, and interpreted speech in a talk stays closer to the speaker’s pace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We want every cross-language exchange to spend a little less time waiting—and a little more time feeling natural.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Learn about ParleyVoice: Overseas &lt;a href="https://parleyvoice.com/" rel="noopener noreferrer"&gt;parleyvoice.com&lt;/a&gt; · China &lt;a href="https://parleyvoice.cn/" rel="noopener noreferrer"&gt;parleyvoice.cn&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Technical references
&lt;/h3&gt;




&lt;p&gt;Canonical / original:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overseas: &lt;a href="https://parleyvoice.com/blog/rtc-low-latency-for-live-interpretation" rel="noopener noreferrer"&gt;https://parleyvoice.com/blog/rtc-low-latency-for-live-interpretation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;China: &lt;a href="https://parleyvoice.cn/blog/rtc-low-latency-for-live-interpretation" rel="noopener noreferrer"&gt;https://parleyvoice.cn/blog/rtc-low-latency-for-live-interpretation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Product implementation basis: RTC main path, send cadence, and playback buffering notes in ParleyVoice &lt;code&gt;release/1024&lt;/code&gt; (internal engineering docs; repository links omitted from the public post).&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc8835.html" rel="noopener noreferrer"&gt;IETF RFC 8835: Transports for WebRTC&lt;/a&gt;, which discusses TCP vs UDP, network fallback, and head-of-line blocking.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;&lt;a href="https://webrtc.googlesource.com/src/+/refs/heads/main/modules/audio_coding/neteq/g3doc/index.md" rel="noopener noreferrer"&gt;WebRTC NetEq: audio jitter buffer and packet-loss concealment&lt;/a&gt;. Cited for general RTC principles; it does not mean ParleyVoice developed or directly ships every module described there.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;&lt;a href="https://doc.shengwang.cn/doc/convoai/restful/best-practice/opt-latency" rel="noopener noreferrer"&gt;RTC official technical documentation: end-to-end latency breakdown&lt;/a&gt;, page last updated 2026-07-21. The 150–300 ms figure is that document’s typical RTC value for conversational AI scenarios; it illustrates technical scale and is not a commitment for other architectures or all network conditions.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>webrtc</category>
      <category>voice</category>
      <category>rtc</category>
      <category>i18n</category>
    </item>
    <item>
      <title>Putting a Live Interpreter Inside Any Meeting App: Lessons from Routing Translated Speech on macOS and Windows</title>
      <dc:creator>Parley</dc:creator>
      <pubDate>Sun, 11 Oct 2026 23:44:58 +0000</pubDate>
      <link>https://dev.to/parleyvoice/putting-a-live-interpreter-inside-any-meeting-app-lessons-from-routing-translated-speech-on-macos-ceh</link>
      <guid>https://dev.to/parleyvoice/putting-a-live-interpreter-inside-any-meeting-app-lessons-from-routing-translated-speech-on-macos-ceh</guid>
      <description>&lt;p&gt;&lt;em&gt;I built Parley, a desktop live interpreter, because I join a lot of international meetings and my English isn't great. This post is about the audio plumbing, which turned out to be most of the work. No code to sell you here, just what I learned.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The constraint that shapes everything
&lt;/h3&gt;

&lt;p&gt;I wanted spoken translation in both directions during a normal call, without asking anyone else to install anything, and without writing a plugin for each meeting platform.&lt;/p&gt;

&lt;p&gt;The only interface every meeting app shares is: &lt;strong&gt;it picks a microphone and a speaker.&lt;/strong&gt; So the interpreter has to &lt;em&gt;be&lt;/em&gt; a microphone and a speaker, and sit between the user's real devices and the meeting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Outgoing: physical mic → capture → cloud translation → translated speech → virtual mic → meeting app
Incoming: meeting app → capture → cloud translation → translated speech → physical headphones
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That simple picture hides most of the hard parts.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Getting audio &lt;em&gt;into&lt;/em&gt; the meeting
&lt;/h3&gt;

&lt;p&gt;The meeting app needs a microphone it can select that carries the translated speech.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS.&lt;/strong&gt; The app installs a virtual audio driver that exposes two devices: &lt;strong&gt;ParleyVirtualMic&lt;/strong&gt;, which the meeting uses as its microphone, and &lt;strong&gt;ParleyMeetingBus&lt;/strong&gt;, which the meeting uses as its speaker so Parley can capture what the other side says. The user's real mic and headphones are selected inside Parley.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows 11.&lt;/strong&gt; The installer bundles the signed VB-CABLE driver. Translated speech goes into the cable; the meeting app selects &lt;strong&gt;CABLE Output&lt;/strong&gt; as its microphone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Installing an audio driver is the most intimidating step for non-technical users, so I spent a lot of effort on doing it automatically and explaining it in plain language. On Windows the installer now discovers the endpoints itself, with no driver downloads or device IDs to type.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Getting audio &lt;em&gt;out&lt;/em&gt; of the meeting, and only the meeting
&lt;/h3&gt;

&lt;p&gt;For the listening direction, you want the other participants' voices and nothing else: not your music, not a YouTube tab, not notification sounds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On &lt;strong&gt;macOS&lt;/strong&gt;, routing the meeting's speaker to ParleyMeetingBus gives Parley exactly the meeting's output.&lt;/li&gt;
&lt;li&gt;On &lt;strong&gt;Windows&lt;/strong&gt;, Parley captures the &lt;strong&gt;meeting app's process&lt;/strong&gt; directly, so the user picks "Zoom" (or whichever app) as the listening source instead of all system audio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A privacy note I put in the docs because it matters: if you capture system audio rather than one process, you may capture more than the conversation you meant to translate.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Feedback loops are the number-one failure
&lt;/h3&gt;

&lt;p&gt;If translated speech plays through laptop speakers, the mic hears it, translates it again, and you get an echo chamber in two languages. Rules I ended up enforcing in the UX:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Headphones are strongly recommended in meeting mode, and the first-run flow says so.&lt;/li&gt;
&lt;li&gt;The meeting only ever hears the virtual mic, never the physical mic directly.&lt;/li&gt;
&lt;li&gt;In in-person (venue) mode, where translated speech &lt;em&gt;does&lt;/em&gt; go to room speakers, the setup guide tells you to keep the microphone away from them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Streaming and the latency/stability trade-off
&lt;/h3&gt;

&lt;p&gt;Capture is resampled to 16 kHz mono PCM and streamed to the realtime model in ~100 ms chunks. The models are the part I don't build: Parley is powered by state-of-the-art large language models, and today the managed options are Qwen (60 input / 29 spoken output languages, Cantonese input-only) and Doubao (Chinese ↔ English), both with live voice cloning. I don't wait for the user to finish a sentence; the model's own turn detection decides when to speak. Translated audio is decoded and queued for playback as soon as each delta arrives.&lt;/p&gt;

&lt;p&gt;The interesting decision was the &lt;strong&gt;playback buffer&lt;/strong&gt;. A short pre-buffer lowers delay but stutters when the network hiccups or the model emits short fragments. I experimented with ~200 ms and went back to about &lt;strong&gt;one second&lt;/strong&gt;, because choppy translated speech is worse for comprehension than a slightly later start. Most of the delay people feel is still the model's: Qwen reports about 2.3 s LAAL and Doubao about 2.53 s speech output latency in their own evaluations (different metrics, not directly comparable).&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Devices change mid-call
&lt;/h3&gt;

&lt;p&gt;Bluetooth headphones disconnect, sample rates change when you plug in a USB mic, the OS switches default devices. Each of those can silently kill one direction. The audio layer (built on cubeb, in Rust) has to notice, reopen the device, and keep the session alive, while the UI (Slint) tells the user what happened instead of just going quiet.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Letting you hear your own translation
&lt;/h3&gt;

&lt;p&gt;Once the outgoing direction worked, the obvious question from my own calls was: &lt;em&gt;what did they actually hear?&lt;/em&gt; So the meeting bar has a translated voice monitor. It plays the model's translated output of what you said into your own headphones. It never plays your raw microphone, and it doesn't open a second model session.&lt;/p&gt;

&lt;p&gt;A few rules kept it from breaking anything else:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's an optional branch at the point where translated speech leaves the model. The full stream still goes to the virtual mic; the monitor copy goes through its own bounded queue, and if that queue backs up it drops its own stale audio rather than slowing the meeting mic.&lt;/li&gt;
&lt;li&gt;It's mixed into the one output stream Parley already has open to your headphones. No ducking, no automatic volume changes to the meeting audio, and a soft knee near full scale instead of hard clipping.&lt;/li&gt;
&lt;li&gt;The volume control (0–100%, default 15%, on a perceptual curve) changes only the monitor's gain. It never touches the system/device volume, the meeting audio, or what's sent to the meeting. Gain changes ramp over a few milliseconds to avoid clicks, and off or 0% is bit-exact bypass.&lt;/li&gt;
&lt;li&gt;Gating follows the translated samples, not your mic, so a translation that arrives after you stop talking isn't cut off.&lt;/li&gt;
&lt;li&gt;It's still not echo cancellation: if you use speakers, the mic can pick them up. Headphones remain the rule.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. One input, many outputs
&lt;/h3&gt;

&lt;p&gt;The venue mode was a nice generalisation: one speaker, several languages at once, each language sent to its own physical speaker or headphone output with its own playback queue (a single output works too). It's unlocked by a one-time $149 venue licence, then billed by usage like everything else. Captions are grouped by language in the history, and SRT export covers the whole session.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Billing that matches what users expect
&lt;/h3&gt;

&lt;p&gt;People don't think in "streams". They think "my meeting lasted 30 minutes". So a two-way meeting, or a venue session with three languages, is &lt;strong&gt;one session charge&lt;/strong&gt;: billing counts the connected time once (by the millisecond, from when the connection is ready, silence included), not once per direction or output. Short sessions aren't rounded up to a full minute. There's no software to buy and no subscription for meeting translation; you pay per minute from a wallet. It complicated the server side, but it makes the price explainable in one sentence.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'd tell anyone building something similar
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Design the first-run audio setup before you design anything else.&lt;/li&gt;
&lt;li&gt;Treat feedback prevention as a product feature, not a bug fix.&lt;/li&gt;
&lt;li&gt;Pick buffer sizes for intelligibility, not benchmark latency.&lt;/li&gt;
&lt;li&gt;Expect device changes constantly and make recovery visible.&lt;/li&gt;
&lt;li&gt;Price in the unit users think in.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I'm the founder of Parley. Parley runs on macOS 14.5+ and Windows 11 x64.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>audio</category>
      <category>macos</category>
      <category>windows</category>
    </item>
  </channel>
</rss>
