<?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: Hayato Kamiya</title>
    <description>The latest articles on DEV Community by Hayato Kamiya (@officekamiya).</description>
    <link>https://dev.to/officekamiya</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%2F4105539%2Fef87f2c4-7ba2-4839-9778-351b14e02e77.png</url>
      <title>DEV Community: Hayato Kamiya</title>
      <link>https://dev.to/officekamiya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/officekamiya"/>
    <language>en</language>
    <item>
      <title>I measured Gemini Live Translate in 3 languages: same rhythm, 2x the characters</title>
      <dc:creator>Hayato Kamiya</dc:creator>
      <pubDate>Fri, 04 Sep 2026 06:46:22 +0000</pubDate>
      <link>https://dev.to/officekamiya/i-measured-gemini-live-translate-in-3-languages-same-rhythm-2x-the-characters-3fnm</link>
      <guid>https://dev.to/officekamiya/i-measured-gemini-live-translate-in-3-languages-same-rhythm-2x-the-characters-3fnm</guid>
      <description>&lt;p&gt;I build a meeting tool where people who speak different languages talk to each other directly. You speak Japanese, the other person hears English; they speak English, you hear Japanese. The speech translation runs on Google's &lt;a href="https://workspace.google.com/blog/ai-and-machine-learning/gemini-35-live-translate" rel="noopener noreferrer"&gt;Gemini 3.5 Live Translate&lt;/a&gt; (&lt;code&gt;gemini-3.5-live-translate-preview&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://awai.live/en/demo/meeting" rel="noopener noreferrer"&gt;Here is a demo&lt;/a&gt; with three people in Japanese, English and Spanish. No signup.&lt;/p&gt;

&lt;p&gt;I wanted to add live subtitles to that screen. You listen to the translated audio, and you read &lt;strong&gt;what the other person actually said&lt;/strong&gt; in their own words, before translation. Something like putting original-language subtitles on a dubbed film. Not a transcript that appears after they finish talking: the Pixel Recorder kind, where words show up one or two at a time while they are still speaking.&lt;/p&gt;

&lt;p&gt;That gave me a hard requirement I could not design around: &lt;strong&gt;if the delay is five seconds, the feature is useless.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Subtitles exist so you can react, in the moment, to what was just said. A subtitle for something said five seconds ago arrives after the conversation has already moved on. Under a second, and you can glance at the panel and keep up. Somewhere between those two numbers is the line between a feature and a decoration.&lt;/p&gt;

&lt;p&gt;One word before going further, because it runs through the whole post. The transcript does not come back in one piece: it arrives &lt;strong&gt;in small instalments&lt;/strong&gt;, and each instalment is a &lt;strong&gt;chunk&lt;/strong&gt;. Subtitles are those chunks, joined in the order they turn up.&lt;/p&gt;

&lt;p&gt;So the question was simple. How fast does Live Translate actually emit chunks, and how big is each one?&lt;/p&gt;

&lt;p&gt;I could not answer it from anything I had.&lt;/p&gt;

&lt;h2&gt;
  
  
  When I built the prototype, there was no reason to measure this
&lt;/h2&gt;

&lt;p&gt;A few months earlier I had built a prototype on &lt;a href="https://ai.google.dev/gemini-api/docs/live" rel="noopener noreferrer"&gt;Gemini Live&lt;/a&gt; (&lt;code&gt;gemini-3.1-flash-live-preview&lt;/code&gt;). The question then was whether you could feed it human speech directly and have the model recognize it as text at all. It could, and it did that well.&lt;/p&gt;

&lt;p&gt;Later I settled on Live Translate for making human conversation legible. In principle the two should behave alike, so the prototype code looked reusable — but &lt;strong&gt;how much of it carried over was an open question&lt;/strong&gt;. So I rebuilt on top of it with Live Translate.&lt;/p&gt;

&lt;p&gt;When I got to the subtitles, I needed latency numbers. I went back to the prototype for them, and they were not there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The other side had changed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gemini Live is a voice version of an AI chat. You speak, the model answers, one turn each. &lt;strong&gt;The AI waits for you to finish.&lt;/strong&gt; It does not matter how long you take; the conversation does not break. So time was never a variable in the prototype. "Speech goes in, text comes out" was the whole question, and there was no reason to record when each chunk arrived.&lt;/p&gt;

&lt;p&gt;Subtitles are not like that. The other side is a person, and people do not wait. If the text does not land while they are still speaking, it is worth nothing — so &lt;strong&gt;time itself becomes the requirement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Same model family, similar-looking API, and the requirements swap out completely depending on whether the thing on the other side is an AI or a human. The prototype answered "does this work." What I needed here was "does this arrive in time." Different job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making time measurable
&lt;/h2&gt;

&lt;p&gt;To make the subtitles arrive in time, I first had to know how long they were taking. And to measure "how many seconds after speech begins", &lt;strong&gt;I have to know when speech began&lt;/strong&gt; — on my side of the wire.&lt;/p&gt;

&lt;p&gt;So I added VAD (voice activity detection): a step that watches the incoming audio locally and catches &lt;strong&gt;the moment a voice starts&lt;/strong&gt;. When it fires, I record that timestamp and tell the API "starting now".&lt;/p&gt;

&lt;p&gt;Gemini Live Translate can also work out where speech begins and ends on its own. But then &lt;strong&gt;the start of the clock sits on its side&lt;/strong&gt;, and there is no way to say what the seconds are counted from. Bringing the time reference over to my side is the whole reason the VAD is there.&lt;/p&gt;

&lt;p&gt;The check runs every 32 milliseconds, so the gap to the true onset stays inside that. Against &lt;strong&gt;the one second or so that a subtitle is allowed&lt;/strong&gt;, that is fine enough.&lt;/p&gt;

&lt;p&gt;After that it is just logging. The start-of-speech signal, each audio send, each transcript chunk coming back, all with timestamps, on a monotonic clock so nothing shifts under you if the system time is adjusted.&lt;/p&gt;

&lt;p&gt;The measuring script pulls the connection settings, the endpoint and the model straight out of the code we actually run, so what goes over the wire is byte-identical to a real session. A measurement of a lookalike would prove nothing about production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Japanese, English and Arabic. I picked Arabic deliberately: it is written right-to-left, and its script is far from both the Latin alphabet and Japanese.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Japanese&lt;/th&gt;
&lt;th&gt;English&lt;/th&gt;
&lt;th&gt;Arabic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Audio length&lt;/td&gt;
&lt;td&gt;90s&lt;/td&gt;
&lt;td&gt;100s&lt;/td&gt;
&lt;td&gt;100s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speech segments&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transcript chunks&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Characters per chunk (median)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same (mean / p90 / max)&lt;/td&gt;
&lt;td&gt;6.0 / 10 / 13&lt;/td&gt;
&lt;td&gt;12.0 / 20 / 23&lt;/td&gt;
&lt;td&gt;9.0 / 14 / 22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inter-chunk interval (median / p90)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1.023s&lt;/strong&gt; / 1.267s&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1.049s&lt;/strong&gt; / 1.399s&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1.038s&lt;/strong&gt; / 1.272s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speech onset → first chunk (median)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.64s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.80s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.57s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same (p90 / max)&lt;/td&gt;
&lt;td&gt;1.03s / 2.88s&lt;/td&gt;
&lt;td&gt;1.24s / 4.40s&lt;/td&gt;
&lt;td&gt;1.13s / 2.23s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arrived during speech / after&lt;/td&gt;
&lt;td&gt;63 / 4&lt;/td&gt;
&lt;td&gt;67 / 6&lt;/td&gt;
&lt;td&gt;71 / 4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The three bold rows are the ones that mattered for building subtitles.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Characters per chunk&lt;/strong&gt; — how much text arrives at once. &lt;strong&gt;This is the only row that differs by 2×&lt;/strong&gt; (6 / 13 / 9)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inter-chunk interval&lt;/strong&gt; — how long until the next piece of text. &lt;strong&gt;Near-identical across all three&lt;/strong&gt; (1.023 / 1.049 / 1.038s)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speech onset → first chunk&lt;/strong&gt; — how long before the first character shows up. &lt;strong&gt;Also close&lt;/strong&gt; (0.64 / 0.80 / 0.57s)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the cadence and the head start are the same in every language, and &lt;strong&gt;only the amount of text per delivery changes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That difference is really about how much a single character carries. Since the interval is almost exactly a second, the per-second count is the same figure: about 6 characters in Japanese, 9 in Arabic, 12 in English. Turned around, that is roughly &lt;strong&gt;170 / 110 / 85 milliseconds of screen time per character&lt;/strong&gt;. One Japanese character occupies about as long as two English ones.&lt;/p&gt;

&lt;p&gt;The chunk counts (67 / 73 / 75) differ because the clips were 90 and 100 seconds long. Per second they come out at 0.74 / 0.73 / 0.75.&lt;/p&gt;

&lt;p&gt;For what it is worth, I ran Japanese twice in independent sessions: median onset 0.66s then 0.64s, interval 1.009s then 1.023s. Run-to-run spread is around ±0.05s.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rhythm does not depend on the language
&lt;/h2&gt;

&lt;p&gt;Three languages, three scripts, and the interval lands on the same second. That does not look like a coincidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The server is not emitting per word. It is emitting per unit of time.&lt;/strong&gt; It appears to flush roughly once a second with whatever it recognized in that second. That means "one or two words at a time" is a property you get in any language. What changes is how many characters fit in a second.&lt;/p&gt;

&lt;p&gt;Onset latency is language-independent too: 0.57s to 0.80s at the median, 1.03s to 1.24s at p90. The outliers (2.2s to 4.4s) were all the &lt;strong&gt;first utterance of a session&lt;/strong&gt;. Warm-up. Every subsequent utterance landed in the 0.4–1.2s band. It recurs once per reconnection, which is worth knowing if your session drops.&lt;/p&gt;

&lt;p&gt;So why does &lt;em&gt;that&lt;/em&gt; number — characters per second — differ by 2×?&lt;/p&gt;

&lt;p&gt;This part is speculation. I suspect the rate at which people exchange information by voice settles in roughly the same place whoever is speaking. The processing happens on the human side, and that side does not change with the language. If so, however differently a language chooses to express things, the amount it can carry per second stays put: a script that packs more into each character needs fewer of them, one that packs less needs more, and the same content goes across either way.&lt;/p&gt;

&lt;p&gt;There is research that measured something close to this. A &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC6984970/" rel="noopener noreferrer"&gt;2019 study of 17 languages across 9 families, with 170 native speakers&lt;/a&gt;, found that speech rate (syllables per second) varies a lot between languages, but multiply it by the information density of a syllable and every language lands around &lt;strong&gt;39 bits per second (SD 5.10)&lt;/strong&gt;. Languages with less dense syllables talk faster to make up for it.&lt;/p&gt;

&lt;p&gt;That study does not include Arabic, and I measured characters on a screen rather than bits or syllables, so the two do not stack directly. Still, "the interval and the head start line up, and only the characters per second differ" fits that shape of explanation.&lt;/p&gt;

&lt;p&gt;Two more things I checked, because they change how the receiving side has to be built:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The stream is append-only.&lt;/strong&gt; I brought up the Pixel Recorder at the top, and one thing it does is &lt;strong&gt;rewrite what it already showed you&lt;/strong&gt;: as recognition catches up, it goes back and corrects an earlier guess.&lt;/p&gt;

&lt;p&gt;If Live Translate did the same, subtitles would have to be built on the assumption that text already on screen can move. That changes the whole display, so it was worth checking first.&lt;/p&gt;

&lt;p&gt;I looked for rewrites with a deliberately strict test: does any chunk start with three or more characters matching the tail of what I already have? Two hits across all runs, one in Japanese and one in English. Both turned out to be at the same point in the audio, where the speaker restarted a phrase, and the model transcribed the restart faithfully. Not a protocol resend: a real repetition, reproducing at the same position across four independent sessions. &lt;strong&gt;Zero corrections.&lt;/strong&gt; What arrives simply stacks up in order; nothing behind reaches forward to change what is already there. You join the pieces as they come and never look back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chunks arrive while the person is still talking.&lt;/strong&gt; This one decides whether the feature is possible at all.&lt;/p&gt;

&lt;p&gt;If the text only landed once an utterance was over, subtitles could only ever be &lt;strong&gt;finished sentences appearing in blocks&lt;/strong&gt; — the opposite of what I wanted. And in this audio the longest single utterance ran &lt;strong&gt;14 seconds&lt;/strong&gt;. Wait for the end and the panel sits empty for those 14 seconds, by which point the conversation has moved on.&lt;/p&gt;

&lt;p&gt;It does not wait. &lt;strong&gt;Over 90% of the text was on screen while the person was still speaking.&lt;/strong&gt; The rest turns up just after they finish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Only the on-screen text varies by language
&lt;/h2&gt;

&lt;p&gt;And it was never only the character count. &lt;strong&gt;How many chunks the same speech breaks into, and where those breaks fall, both change with the language.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is what actually arrived:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;English   'Anyway, the true'  /  ' ability of the'  /  ' lovely ghostwriter'
Arabic    'طيب، عشان كده يا جماعه'  /  ' قدرات الكاتب'
Japanese  'ラブリーゴースト'  /  'ライターの真の'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;English and Arabic broke &lt;strong&gt;at word boundaries&lt;/strong&gt;, and every continuation carried a leading space (look at the gap in front of &lt;code&gt;' ability of the'&lt;/code&gt;). Join them and that space is your word separator.&lt;/p&gt;

&lt;p&gt;Japanese did not. The single word "ラブリーゴーストライター" (lovely ghostwriter) is split into &lt;code&gt;'ラブリーゴースト'&lt;/code&gt; and &lt;code&gt;'ライターの真の'&lt;/code&gt; — &lt;strong&gt;cut in the middle of the word, with nothing to signal that it is mid-word.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two consequences for the client:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Concatenate verbatim. Do not trim, do not insert separators.&lt;/strong&gt; Trimming the leading space welds English and Arabic words together. The Japanese mid-word split means a word will sit visibly incomplete for about a second, and there is nothing you can do about that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch text direction per bubble.&lt;/strong&gt; Subtitles go out the way a messaging app looks: one utterance, one bubble. What comes back is the speaker's own language, so in a multilingual meeting a right-to-left bubble and a left-to-right one sit in the same panel. Pick a direction for the whole panel and one of them breaks, so the UI has to decide bubble by bubble (in HTML, &lt;code&gt;dir="auto"&lt;/code&gt; on each one).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So the UI limit cannot be a character count
&lt;/h2&gt;

&lt;p&gt;Here is the rule I was about to write: cap the subtitle panel at N characters, drop the oldest.&lt;/p&gt;

&lt;p&gt;With a 2× spread in characters per second, that cap buys a different amount of &lt;em&gt;time&lt;/em&gt; in every language. Cap at 60 characters and Japanese keeps 10 seconds on screen while English keeps 5. Tune N until Japanese feels right and English scrolls away before you can read it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cap by rendered lines instead&lt;/strong&gt;, and the difference cancels out:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Characters per second&lt;/th&gt;
&lt;th&gt;Characters per line (mobile)&lt;/th&gt;
&lt;th&gt;Characters in 3 lines&lt;/th&gt;
&lt;th&gt;3 lines ≈&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Japanese&lt;/td&gt;
&lt;td&gt;6.0 (full-width)&lt;/td&gt;
&lt;td&gt;~20&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~10s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;td&gt;12.0&lt;/td&gt;
&lt;td&gt;~40&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~10s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arabic&lt;/td&gt;
&lt;td&gt;9.0&lt;/td&gt;
&lt;td&gt;~35&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~12s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Capping by lines is, of course, still capping by "characters per line × lines". &lt;strong&gt;The difference is that you are not the one choosing the characters per line.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Chunks arrive with no line breaks in them. Where the text wraps is decided by the width of the panel and the font — and the panel is the same width in every language, because it is the width of the screen. Fill it with full-width characters and a line holds about 20; fill it with half-width ones and it holds about 40. &lt;strong&gt;The character count per line moves by exactly as much as the characters are wide.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That turned out to move in step with the characters-per-second figure. So three lines hold 60 characters in one language and 120 in another, and &lt;strong&gt;in time they both come out at 10–12 seconds&lt;/strong&gt;. The line count was doing the normalization for me.&lt;/p&gt;

&lt;p&gt;If the horizontal side follows the font, so should the vertical. &lt;strong&gt;Reserve the height of those three lines in font-relative units, not pixels.&lt;/strong&gt; Arabic, Devanagari and Thai have taller line boxes, and a px-fixed box clips them.&lt;/p&gt;

&lt;p&gt;(Three lines rather than three messages, incidentally, because that 14-second utterance came to about 84 characters, which overflows three lines on its own.)&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://awai.live/en/demo/meeting" rel="noopener noreferrer"&gt;three-line panel is running here&lt;/a&gt; if you want to see whether the reasoning holds up in practice. Turn subtitles on in the toolbar; they are off by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not cover
&lt;/h2&gt;

&lt;p&gt;Of the three recordings I measured, &lt;strong&gt;only the Japanese one is an actual person speaking.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For English and Arabic I had no audio to work with, so I took the &lt;em&gt;translated speech&lt;/em&gt; the model hands back during a Japanese run and fed that in as the input. Which means those two languages are &lt;strong&gt;the model talking to itself&lt;/strong&gt;: clean, no accent, no disfluency, no one talking fast. Real speakers will chunk differently, and the model card itself notes that accents degrade language detection.&lt;/p&gt;

&lt;p&gt;Separately from this measurement, I have confirmed that English speech from a real person &lt;strong&gt;is transcribed properly&lt;/strong&gt;. But that is as far as it goes — I did not measure chunk granularity or latency on it. For every other language I have not even checked that much.&lt;/p&gt;

&lt;p&gt;I have not measured Chinese, Korean, Thai, or Hindi. The one-second period looks structural rather than tuned, so I would expect it to hold, but that is a guess and I would rather label it as one.&lt;/p&gt;

&lt;p&gt;And this is one speaker at a time. What happens when several people hold separate sessions concurrently is a different measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this ended up
&lt;/h2&gt;

&lt;p&gt;The tool is called &lt;a href="https://awai.live/en" rel="noopener noreferrer"&gt;AWAI&lt;/a&gt;: people in different languages sit in the same meeting and talk. The subtitles I measured here are on that screen.&lt;/p&gt;

&lt;p&gt;And the &lt;a href="https://awai.live/en/demo/meeting" rel="noopener noreferrer"&gt;demo&lt;/a&gt; I have linked a few times is &lt;strong&gt;not a mock-up made for this post&lt;/strong&gt;. The code drawing those subtitles is exactly the production code; the only difference is that the data comes from a recorded replay instead of a live channel. &lt;strong&gt;Open a real meeting and the same thing runs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Subtitles, though, only exist during the meeting. &lt;strong&gt;What AWAI is actually for is what is left afterwards&lt;/strong&gt;: the conversation sorted by topic, with who said what on which subject. If subtitles are "what did they just say", that is "what did we actually talk about". The 0.64 seconds I measured here is one instant at the front of it.&lt;/p&gt;

&lt;p&gt;Building for more than one language usually gets framed as absorbing the differences between them. Measured, the differences and the sameness fell into two clean piles.&lt;/p&gt;

&lt;p&gt;The text on screen differs — the character count, where it breaks, how tall a line is. The rhythm it arrives in does not. And that seems to be less about Gemini than about &lt;strong&gt;people exchanging information by voice at roughly the same rate whatever language they use&lt;/strong&gt;. The writing system varies; the speaking and listening underneath it does not.&lt;/p&gt;

&lt;p&gt;That is the part that stuck with me while building a multilingual meeting tool. The thing that matters when two people talk to each other appears to survive the change of language.&lt;/p&gt;

&lt;p&gt;And I only saw it because I wired the translation up myself and &lt;strong&gt;measured what came back, one piece at a time&lt;/strong&gt;. Using it would not have shown me that. If you are building on a streaming speech API, measure it for your own use rather than carrying over what you checked before — what you verified with an AI on the other end goes back up for verification the moment you put it between two people.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>python</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
