<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/assets/rss.xsl" type="text/xsl"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>
<channel>
	<title>Sacha Chua - category - subed</title>
	<atom:link href="https://sachachua.com/blog/category/subed/feed/index.xml" rel="self" type="application/rss+xml" />
	<atom:link href="https://sachachua.com/blog/category/subed" rel="alternate" type="text/html" />
	<link>https://sachachua.com/blog/category/subed/feed/index.xml</link>
	<description>Emacs, sketches, and life</description>
	<lastBuildDate>Fri, 17 Apr 2026 13:26:41 GMT</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>11ty</generator>
  <item>
		<title>Comparing pronunciation recordings across time</title>
		<link>https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Fri, 13 Mar 2026 01:11:45 GMT</pubDate>
    <category>french</category>
<category>emacs</category>
<category>org</category>
<category>subed</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/</guid>
		<description><![CDATA[<div class="update" id="orgd4d9c01">
<ul class="org-ul">
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-03-27">[2026-03-27 Fri]</time></span>: Added reconstructions from today and moved more of the code to <a href="https://codeberg.org/sachac/learn-lang/">sachac/learn-lang</a>.</li>
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-03-24">[2026-03-24 Tue]</time></span>: Added updates from today.</li>
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-03-15">[2026-03-15 Sun]</time></span>: Added reference audio for the second set.</li>
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-03-14">[2026-03-14 Sat]</time></span>: I added pronunciation segments for the new set of tongue-twisters I got on Mar 13.</li>
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-03-12">[2026-03-12 Thu]</time></span>: I added a column for Feb 20, the first session with the sentences. I also added keyboard shortcuts (1..n) for playing the audio of the row that the mouse is on.</li>
</ul>

</div>

<div class="sticky-toc" id="orgf2b6963">
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="https://sachachua.com/blog/feed/index.xml#comparing-pronunciation-recordings-across-time-2026-02-20-first-set-maman-peint-un-grand-lapin-blanc-etc">2026-02-20: First set: Maman peint un grand lapin blanc, etc.</a></li>
<li><a href="https://sachachua.com/blog/feed/index.xml#comparing-pronunciation-recordings-across-time-2026-03-14-second-set-mon-oncle-peint-un-grand-pont-blanc-etc">2026-03-14: Second set: Mon oncle peint un grand pont blanc, etc.</a></li>
<li><a href="https://sachachua.com/blog/feed/index.xml#comparing-pronunciation-recordings-across-time-the-code">The code</a></li>
</ul>
</div>

</div>
<div id="outline-container-comparing-pronunciation-recordings-across-time-2026-02-20-first-set-maman-peint-un-grand-lapin-blanc-etc" class="outline-3">
<h3 id="comparing-pronunciation-recordings-across-time-2026-02-20-first-set-maman-peint-un-grand-lapin-blanc-etc">2026-02-20: First set: Maman peint un grand lapin blanc, etc.</h3>
<div class="outline-text-3" id="text-comparing-pronunciation-recordings-across-time-2026-02-20-first-set-maman-peint-un-grand-lapin-blanc-etc">
<p>
My French tutor gave me a list of sentences to help me practise pronunciation.
</p>

<p>
I can fuzzy-match these with the word timing JSON from WhisperX, like this.
</p>

<details><summary>Extract all approximately matching phrases</summary>
<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(subed-record-extract-all-approximately-matching-phrases
   sentences
   <span class="org-string">"/home/sacha/sync/recordings/2026-02-20-raphael.json"</span>
   <span class="org-string">"/home/sacha/proj/french/analysis/virelangues/2026-02-20-raphael-script.vtt"</span>)
</code></pre>
</div>

</details>

<details class="code-details" style="padding: 1em;
                 border-radius: 15px;
                 font-size: 0.9em;
                 box-shadow: 0.05em 0.1em 5px 0.01em  #00000057;">
                  <summary><strong>Sentences</strong></summary>
<ul class="org-ul">
<li>Maman peint un grand lapin blanc.</li>
<li>Un enfant intelligent mange lentement.</li>
<li>Le roi croit voir trois noix.</li>
<li>Le témoin voit le chemin loin.</li>
<li>Moins de foin au loin ce matin.</li>
<li>La laine beige sèche près du collège.</li>
<li>La croquette sèche dans l'assiette.</li>
<li>Elle mène son frère à l'hôtel.</li>
<li>Le verre vert est très clair.</li>
<li>Elle aimait manger et rêver.</li>
<li>Le jeu bleu me plaît peu.</li>
<li>Ce neveu veut un jeu.</li>
<li>Le feu bleu est dangereux.</li>
<li>Le beurre fond dans le cœur chaud.</li>
<li>Les fleurs de ma sœur sentent bon.</li>
<li>Le hibou sait où il va.</li>
<li>L'homme fort mord la pomme.</li>
<li>Le sombre col tombe.</li>
<li>L'auto saute au trottoir chaud.</li>
<li>Le château d'en haut est beau.</li>
<li>Le cœur seul pleure doucement.</li>
<li>Tu es sûr du futur ?</li>
<li>Trois très grands trains traversent trois trop grandes rues.</li>
<li>Je veux deux feux bleus, mais la reine préfère la laine beige.</li>
<li>Vincent prend un bain en chantant lentement.</li>
<li>La mule sûre court plus vite que le loup fou.</li>
<li>Luc a bu du jus sous le pont où coule la boue.</li>
<li>Le frère de Robert prépare un rare rôti rouge.</li>
<li>La mule court autour du mur où hurle le loup.</li>
</ul>


</details>

<p>
Then I can use <a href="https://github.com/sachac/subed-record">subed-record</a> to manually tweak them, add notes, and so on. I end up with VTT files like <a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-06-raphael-script.vtt">2026-03-06-raphael-script.vtt</a>. I can assemble the snippets for a session into a single audio file, like this:
</p>

<div class="media-post" id="org0128ea1">
<p>
</p><div class="audio"><audio controls="1" preload="metadata" src="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-06-raphael-virelangues.opus?2026-03-27" type="audio/ogg"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-06-raphael-virelangues.opus">Download the audio</a><track kind="captions" label="Captions" src="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-06-raphael-virelangues.vtt" srclang="en" default=""></audio><div class="captions" style="display: none"></div></div>
<p></p>

</div>

<p>
I wanted to compare my attempts over time, so I wrote some code to use Org Mode and subed-record to build a table with little audio players that I can use both within Emacs and in the exported HTML.
This collects just the last attempts for each sentence during a number of my sessions (both with the tutor and on my own). The score is from the Microsoft Azure pronunciation assessment service. I'm not entirely sure about its validity yet, but I thought I'd add it for fun. <code>*</code> indicates where I've added some notes from my tutor, which should be available as a <code>title</code> attribute on hover. (Someday I'll figure out a mobile-friendly way to do that.)
</p>

<details><summary>Calling it with my sentences and files</summary>
<div class="org-src-container">
<pre class="src src-emacs-lisp" id="orgc20e9ea"><code>(learn-lang-subed-record-summarize-segments
 sentences
 <span class="org-highlight-quoted-quote">'</span>((<span class="org-string">"/home/sacha/proj/french/analysis/virelangues/2026-02-20-raphael-script.vtt"</span> . <span class="org-string">"Feb 20"</span>)
 <span class="org-comment-delimiter">;</span><span class="org-comment">("~/sync/recordings/processed/2026-02-20-raphael-tongue-twisters.vtt" . "Feb 20")</span>
        (<span class="org-string">"~/sync/recordings/processed/2026-02-22-virelangues-single.vtt"</span> . <span class="org-string">"Feb 22"</span>)
        (<span class="org-string">"~/proj/french/recordings/2026-02-26-virelangues-script.vtt"</span> . <span class="org-string">"Feb 26"</span>)
        (<span class="org-string">"~/proj/french/recordings/2026-02-27-virelangues-script.vtt"</span> . <span class="org-string">"Feb 27"</span>)
        (<span class="org-string">"~/proj/french/recordings/2026-03-03-virelangues.vtt"</span> . <span class="org-string">"Mar 3"</span>)
        (<span class="org-string">"/home/sacha/sync/recordings/processed/2026-03-03-raphael-reference-script.vtt"</span> . <span class="org-string">"Mar 3"</span>)
        (<span class="org-string">"~/proj/french/analysis/virelangues/2026-03-06-raphael-script.vtt"</span> . <span class="org-string">"Mar 6"</span>)
        (<span class="org-string">"~/proj/french/analysis/virelangues/2026-03-12-virelangues-script.vtt"</span> . <span class="org-string">"Mar 12"</span>))
 <span class="org-string">"~/proj/french/analysis/virelangues/clip"</span>
 <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">learn-lang-subed-record-get-last-attempt</span>
 )
</code></pre>
</div>

</details>

<div class="subed-summary" id="orga7fbc17">
<table>


<colgroup>
<col class="org-left">

<col class="org-left">

<col class="org-left">

<col class="org-left">

<col class="org-left">

<col class="org-left">

<col class="org-left">

<col class="org-left">

<col class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Feb 20</th>
<th scope="col" class="org-left">Feb 22</th>
<th scope="col" class="org-left">Feb 26</th>
<th scope="col" class="org-left">Feb 27</th>
<th scope="col" class="org-left">Mar 3</th>
<th scope="col" class="org-left">Mar 3</th>
<th scope="col" class="org-left">Mar 6</th>
<th scope="col" class="org-left">Mar 12</th>
<th scope="col" class="org-left">Text</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-maman-peint-un-grand-lapin-blanc-01.opus?2026-03-27" class="audio-icon" title="Feb 20: X: grande">▶️ 63*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-maman-peint-un-grand-lapin-blanc-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 96</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-maman-peint-un-grand-lapin-blanc-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-maman-peint-un-grand-lapin-blanc-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 94</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-maman-peint-un-grand-lapin-blanc-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 83</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-maman-peint-un-grand-lapin-blanc-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Mm hmm">▶️ 83*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-maman-peint-un-grand-lapin-blanc-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Ouais">▶️ 81*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-maman-peint-un-grand-lapin-blanc-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 88</a></td>
<td class="org-left">Maman peint un grand lapin blanc.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-un-enfant-intelligent-mange-lentement-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Voila, parfait">▶️ 88*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-un-enfant-intelligent-mange-lentement-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-un-enfant-intelligent-mange-lentement-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 99</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-un-enfant-intelligent-mange-lentement-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 99</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-un-enfant-intelligent-mange-lentement-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 96</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-un-enfant-intelligent-mange-lentement-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Parfait">▶️ 89*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-un-enfant-intelligent-mange-lentement-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Ouais, c'est bien">▶️ 92*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-un-enfant-intelligent-mange-lentement-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 83</a></td>
<td class="org-left">Un enfant intelligent mange lentement.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-roi-croit-voir-trois-noix-01.opus?2026-03-27" class="audio-icon" title="Feb 20: X: trois noix">▶️ 84*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-roi-croit-voir-trois-noix-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 97</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-roi-croit-voir-trois-noix-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 97</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-roi-croit-voir-trois-noix-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 96</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-roi-croit-voir-trois-noix-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 94</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-roi-croit-voir-trois-noix-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Mm hmm">▶️ 95*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-roi-croit-voir-trois-noix-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Uh huh">▶️ 98*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-roi-croit-voir-trois-noix-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 99</a></td>
<td class="org-left">Le roi croit voir trois noix.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-t-moin-voit-le-chemin-loin-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Ouais, c'est bien">▶️ 80*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-t-moin-voit-le-chemin-loin-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 85</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-t-moin-voit-le-chemin-loin-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 77</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-t-moin-voit-le-chemin-loin-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 94</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-t-moin-voit-le-chemin-loin-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 97</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-t-moin-voit-le-chemin-loin-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Ouais">▶️ 92*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-t-moin-voit-le-chemin-loin-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 88</a></td>
<td class="org-left">Le témoin voit le chemin loin.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-moins-de-foin-au-loin-ce-matin-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Ouais, parfait">▶️ 72*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-moins-de-foin-au-loin-ce-matin-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 97</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-moins-de-foin-au-loin-ce-matin-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-moins-de-foin-au-loin-ce-matin-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 77</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-moins-de-foin-au-loin-ce-matin-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 92</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-moins-de-foin-au-loin-ce-matin-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Mm hmm, parfait">▶️ 89*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-moins-de-foin-au-loin-ce-matin-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 86</a></td>
<td class="org-left">Moins de foin au loin ce matin.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-la-laine-beige-s-che-pr-s-du-coll-ge-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Ouais, okay, parfait">▶️ 79*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-laine-beige-s-che-pr-s-du-coll-ge-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-laine-beige-s-che-pr-s-du-coll-ge-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 76</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-laine-beige-s-che-pr-s-du-coll-ge-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-laine-beige-s-che-pr-s-du-coll-ge-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 76</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-la-laine-beige-s-che-pr-s-du-coll-ge-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Mm hmm">▶️ 90*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-laine-beige-s-che-pr-s-du-coll-ge-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Mm hmm">▶️ 90*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-laine-beige-s-che-pr-s-du-coll-ge-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 79</a></td>
<td class="org-left">La laine beige sèche près du collège.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-la-croquette-s-che-dans-l-assiette-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Okay, parfait">▶️ 67*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-croquette-s-che-dans-l-assiette-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 99</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-croquette-s-che-dans-l-assiette-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 85</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-croquette-s-che-dans-l-assiette-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 81</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-croquette-s-che-dans-l-assiette-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 85</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-la-croquette-s-che-dans-l-assiette-06.opus?2026-03-27" class="audio-icon" title="Mar 3: C'est mieux">▶️ 99*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-croquette-s-che-dans-l-assiette-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Mm hmm">▶️ 97*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-croquette-s-che-dans-l-assiette-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 97</a></td>
<td class="org-left">La croquette sèche dans l'assiette.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-elle-m-ne-son-fr-re-l-h-tel-01.opus?2026-03-27" class="audio-icon" title="Feb 20: C'est bien">▶️ 88*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-m-ne-son-fr-re-l-h-tel-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 99</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-m-ne-son-fr-re-l-h-tel-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 100</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-m-ne-son-fr-re-l-h-tel-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 100</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-m-ne-son-fr-re-l-h-tel-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 98</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-elle-m-ne-son-fr-re-l-h-tel-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Mm hmm">▶️ 100*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-m-ne-son-fr-re-l-h-tel-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Ouais, c'est bien">▶️ 99*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-m-ne-son-fr-re-l-h-tel-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 100</a></td>
<td class="org-left">Elle mène son frère à l'hôtel.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-verre-vert-est-tr-s-clair-01.opus?2026-03-27" class="audio-icon" title="Feb 20: C'est bien">▶️ 77*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-verre-vert-est-tr-s-clair-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 87</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-verre-vert-est-tr-s-clair-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 99</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-verre-vert-est-tr-s-clair-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 93</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-verre-vert-est-tr-s-clair-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 87</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-verre-vert-est-tr-s-clair-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Mm hmm">▶️ 87*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-verre-vert-est-tr-s-clair-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 99</a></td>
<td class="org-left">Le verre vert est très clair.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-elle-aimait-manger-et-r-ver-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Okay">▶️ 100*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-aimait-manger-et-r-ver-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 94</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-aimait-manger-et-r-ver-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 100</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-aimait-manger-et-r-ver-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 99</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-aimait-manger-et-r-ver-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 99</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-elle-aimait-manger-et-r-ver-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Ouais">▶️ 99*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-aimait-manger-et-r-ver-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Mm hmm">▶️ 100*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-elle-aimait-manger-et-r-ver-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 100</a></td>
<td class="org-left">Elle aimait manger et rêver.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-jeu-bleu-me-pla-t-peu-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Ouais, c'est bien">▶️ 78*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-jeu-bleu-me-pla-t-peu-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 98</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-jeu-bleu-me-pla-t-peu-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 99</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-jeu-bleu-me-pla-t-peu-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 98</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-jeu-bleu-me-pla-t-peu-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 98</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-jeu-bleu-me-pla-t-peu-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Ouais, c'est bien">▶️ 92*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-jeu-bleu-me-pla-t-peu-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 88</a></td>
<td class="org-left">Le jeu bleu me plaît peu.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-ce-neveu-veut-un-jeu-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Ouais">▶️ 78*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-ce-neveu-veut-un-jeu-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 97</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-ce-neveu-veut-un-jeu-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 85</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-ce-neveu-veut-un-jeu-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-ce-neveu-veut-un-jeu-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 85</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-ce-neveu-veut-un-jeu-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 85</a></td>
<td class="org-left">Ce neveu veut un jeu.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-feu-bleu-est-dangereux-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Ouais">▶️ 73*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-feu-bleu-est-dangereux-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-feu-bleu-est-dangereux-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-feu-bleu-est-dangereux-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 96</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-feu-bleu-est-dangereux-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 97</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-feu-bleu-est-dangereux-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 100</a></td>
<td class="org-left">Le feu bleu est dangereux.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-beurre-fond-dans-le-c-ur-chaud-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Ouais, c'est bien">▶️ 87*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-beurre-fond-dans-le-c-ur-chaud-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 76</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-beurre-fond-dans-le-c-ur-chaud-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 65</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-beurre-fond-dans-le-c-ur-chaud-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 97</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-beurre-fond-dans-le-c-ur-chaud-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 85</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-beurre-fond-dans-le-c-ur-chaud-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Ouais">▶️ 74*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-beurre-fond-dans-le-c-ur-chaud-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Ouais">▶️ 85*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-beurre-fond-dans-le-c-ur-chaud-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 96</a></td>
<td class="org-left">Le beurre fond dans le cœur chaud.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-les-fleurs-de-ma-s-ur-sentent-bon-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Mm hmm">▶️ 84*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-les-fleurs-de-ma-s-ur-sentent-bon-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 43</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-les-fleurs-de-ma-s-ur-sentent-bon-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 85</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-les-fleurs-de-ma-s-ur-sentent-bon-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 79</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-les-fleurs-de-ma-s-ur-sentent-bon-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 75</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-les-fleurs-de-ma-s-ur-sentent-bon-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 98</a></td>
<td class="org-left">Les fleurs de ma sœur sentent bon.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-hibou-sait-o-il-va-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Mm hmm">▶️ 70*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-hibou-sait-o-il-va-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 86</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-hibou-sait-o-il-va-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 79</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-hibou-sait-o-il-va-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 76</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-hibou-sait-o-il-va-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 87</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-hibou-sait-o-il-va-06.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 84</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-hibou-sait-o-il-va-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 98</a></td>
<td class="org-left">Le hibou sait où il va.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-l-homme-fort-mord-la-pomme-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Mm hmm">▶️ 92*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-l-homme-fort-mord-la-pomme-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-l-homme-fort-mord-la-pomme-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 86</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-l-homme-fort-mord-la-pomme-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 92</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-l-homme-fort-mord-la-pomme-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 98</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-l-homme-fort-mord-la-pomme-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Ouais">▶️ 99*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-l-homme-fort-mord-la-pomme-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 94</a></td>
<td class="org-left">L'homme fort mord la pomme.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-sombre-col-tombe-01.opus?2026-03-27" class="audio-icon" title="Feb 20: X: sombre">▶️ 83*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-sombre-col-tombe-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 73</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-sombre-col-tombe-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 69</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-sombre-col-tombe-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 81</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-sombre-col-tombe-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 60</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-sombre-col-tombe-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Oui">▶️ 96*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-sombre-col-tombe-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 81</a></td>
<td class="org-left">Le sombre col tombe.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-l-auto-saute-au-trottoir-chaud-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Oui, c'&#233;tait mieux">▶️ 39*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-l-auto-saute-au-trottoir-chaud-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 49</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-l-auto-saute-au-trottoir-chaud-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 69</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-l-auto-saute-au-trottoir-chaud-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 56</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-l-auto-saute-au-trottoir-chaud-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 69</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-l-auto-saute-au-trottoir-chaud-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Oui">▶️ 96*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-l-auto-saute-au-trottoir-chaud-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 94</a></td>
<td class="org-left">L'auto saute au trottoir chaud.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-ch-teau-d-en-haut-est-beau-01.opus?2026-03-27" class="audio-icon" title="Feb 20">▶️ 82</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-ch-teau-d-en-haut-est-beau-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 84</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-ch-teau-d-en-haut-est-beau-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 85</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-ch-teau-d-en-haut-est-beau-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 98</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-ch-teau-d-en-haut-est-beau-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 94</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-ch-teau-d-en-haut-est-beau-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Mm hmm">▶️ 96*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-ch-teau-d-en-haut-est-beau-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 99</a></td>
<td class="org-left">Le château d'en haut est beau.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-c-ur-seul-pleure-doucement-01.opus?2026-03-27" class="audio-icon" title="Feb 20">▶️ 89</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-c-ur-seul-pleure-doucement-02.opus?2026-03-27" class="audio-icon" title="Feb 22">▶️ 85</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-c-ur-seul-pleure-doucement-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 75</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-c-ur-seul-pleure-doucement-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 91</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-c-ur-seul-pleure-doucement-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 52</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-c-ur-seul-pleure-doucement-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Mm hmm">▶️ 75*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-c-ur-seul-pleure-doucement-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Ouais, c'est mieux">▶️ 70*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-c-ur-seul-pleure-doucement-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 98</a></td>
<td class="org-left">Le cœur seul pleure doucement.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-tu-es-s-r-du-futur-01.opus?2026-03-27" class="audio-icon" title="Feb 20: Haha, ouais">▶️ 98*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-tu-es-s-r-du-futur-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 99</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-tu-es-s-r-du-futur-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 99</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-tu-es-s-r-du-futur-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-tu-es-s-r-du-futur-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Oui">▶️ 93*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-tu-es-s-r-du-futur-07.opus?2026-03-27" class="audio-icon" title="Mar 6: Mm hmm">▶️ 97*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-tu-es-s-r-du-futur-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 99</a></td>
<td class="org-left">Tu es sûr du futur ?</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-trois-tr-s-grands-trains-traversent-trois-trop-grandes-rues-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 97</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-trois-tr-s-grands-trains-traversent-trois-trop-grandes-rues-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 93</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-trois-tr-s-grands-trains-traversent-trois-trop-grandes-rues-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 92</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-trois-tr-s-grands-trains-traversent-trois-trop-grandes-rues-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Oui, c'est mieux">▶️ 85*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-trois-tr-s-grands-trains-traversent-trois-trop-grandes-rues-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 90</a></td>
<td class="org-left">Trois très grands trains traversent trois trop grandes rues.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-je-veux-deux-feux-bleus-mais-la-reine-pr-f-re-la-laine-beige-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 94</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-je-veux-deux-feux-bleus-mais-la-reine-pr-f-re-la-laine-beige-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 85</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-je-veux-deux-feux-bleus-mais-la-reine-pr-f-re-la-laine-beige-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 97</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-je-veux-deux-feux-bleus-mais-la-reine-pr-f-re-la-laine-beige-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Oui, c'est bien">▶️ 82*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-je-veux-deux-feux-bleus-mais-la-reine-pr-f-re-la-laine-beige-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 92</a></td>
<td class="org-left">Je veux deux feux bleus, mais la reine préfère la laine beige.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-vincent-prend-un-bain-en-chantant-lentement-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 91</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-vincent-prend-un-bain-en-chantant-lentement-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 79</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-vincent-prend-un-bain-en-chantant-lentement-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 87</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-vincent-prend-un-bain-en-chantant-lentement-06.opus?2026-03-27" class="audio-icon" title="Mar 3: lentement; oui">▶️ 82*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-vincent-prend-un-bain-en-chantant-lentement-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 94</a></td>
<td class="org-left">Vincent prend un bain en chantant lentement.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-mule-s-re-court-plus-vite-que-le-loup-fou-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 89</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-mule-s-re-court-plus-vite-que-le-loup-fou-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 91</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-mule-s-re-court-plus-vite-que-le-loup-fou-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 91</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-la-mule-s-re-court-plus-vite-que-le-loup-fou-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Ouais">▶️ 84*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-mule-s-re-court-plus-vite-que-le-loup-fou-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 92</a></td>
<td class="org-left">La mule sûre court plus vite que le loup fou.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-luc-a-bu-du-jus-sous-le-pont-o-coule-la-boue-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 91</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-luc-a-bu-du-jus-sous-le-pont-o-coule-la-boue-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 93</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-luc-a-bu-du-jus-sous-le-pont-o-coule-la-boue-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 93</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-luc-a-bu-du-jus-sous-le-pont-o-coule-la-boue-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Ouais, c'est bien">▶️ 92*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-luc-a-bu-du-jus-sous-le-pont-o-coule-la-boue-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 96</a></td>
<td class="org-left">Luc a bu du jus sous le pont où coule la boue.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-fr-re-de-robert-pr-pare-un-rare-r-ti-rouge-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 88</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-fr-re-de-robert-pr-pare-un-rare-r-ti-rouge-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 71</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-fr-re-de-robert-pr-pare-un-rare-r-ti-rouge-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 94</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-le-fr-re-de-robert-pr-pare-un-rare-r-ti-rouge-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Oui">▶️ 86*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-le-fr-re-de-robert-pr-pare-un-rare-r-ti-rouge-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 92</a></td>
<td class="org-left">Le frère de Robert prépare un rare rôti rouge.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-mule-court-autour-du-mur-o-hurle-le-loup-03.opus?2026-03-27" class="audio-icon" title="Feb 26">▶️ 81</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-mule-court-autour-du-mur-o-hurle-le-loup-04.opus?2026-03-27" class="audio-icon" title="Feb 27">▶️ 84</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-mule-court-autour-du-mur-o-hurle-le-loup-05.opus?2026-03-27" class="audio-icon" title="Mar 3">▶️ 88</a></td>
<td class="org-left"><a href="https://sachachua.com/home/sacha/proj/french/analysis/virelangues/clip-la-mule-court-autour-du-mur-o-hurle-le-loup-06.opus?2026-03-27" class="audio-icon" title="Mar 3: Ouais">▶️ 67*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/clip-la-mule-court-autour-du-mur-o-hurle-le-loup-08.opus?2026-03-27" class="audio-icon" title="Mar 12">▶️ 94</a></td>
<td class="org-left">La mule court autour du mur où hurle le loup.</td>
</tr>
</tbody>
</table>

</div>

<p>
Pronunciation still feels a bit hit or miss. Sometimes I say a sentence and my tutor says "Oui," and then I say it again and he says "Non, non&hellip;" The <code>/ʁ/</code> and <code>/y/</code> sounds are hard.
</p>

<p>
I like seeing these compact links in an Org Mode table and being able to play them, thanks to my <a href="https://sachachua.com/dotemacs#audio">custom audio link type</a>. It should be pretty easy to write a function that lets me use a keyboard shortcut to play the audio (maybe using the keys 1-9?) so that I can bounce between them for comparison.
</p>

<p>
If I screen-share from Google Chrome, I can share the tab with audio, so my tutor can listen to things at the same time. Could be fun to compare attempts so that I can try to hear the differences better. Hmm, actually, let's try adding keyboard shortcuts that let me use 1-8, n/p, and f/b to navigate and play audio. Mwahahaha! It works!
</p>
</div>
</div>
<div id="outline-container-comparing-pronunciation-recordings-across-time-2026-03-14-second-set-mon-oncle-peint-un-grand-pont-blanc-etc" class="outline-3">
<h3 id="comparing-pronunciation-recordings-across-time-2026-03-14-second-set-mon-oncle-peint-un-grand-pont-blanc-etc">2026-03-14: Second set: Mon oncle peint un grand pont blanc, etc.</h3>
<div class="outline-text-3" id="text-comparing-pronunciation-recordings-across-time-2026-03-14-second-set-mon-oncle-peint-un-grand-pont-blanc-etc">
<p>
Update 2026-03-14: My tutor gave me a new set of tongue-twisters. When I'm working on my own, I find it helpful to loop over an audio reference with a bit of silence after it so that I can repeat what I've heard. I have several choices for reference audio:
</p>

<ul class="org-ul">
<li>I can generate an audio file using text-to-speech, like a local instance of <a href="https://github.com/nazdridoy/kokoro-tts">Kokoro TTS</a>, or a hosted service like Google Translate (via <a href="https://gtts.readthedocs.io/en/latest/cli.html">gtts-cli</a>), <a href="https://elevenlabs.io/api">ElevenLabs</a>, or <a href="https://learn.microsoft.com/en-us/azure/ai-services/speech-service/text-to-speech">Microsoft Azure</a>.</li>
<li>I can extract a recording of my tutor from one of my sessions.</li>
<li>I can extract a recording of myself from one of my tutoring sessions where my tutor said that the pronunciation is alright.</li>
</ul>

<p>
Here I stumble through the tongue-twisters. I've included reference audio from Kokoro, gtts, and ElevenLabs for comparison.
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp" id="org3a2dd75"><code>(my-subed-record-analyze-file-with-azure-and-references
 (subed-record-keep-last
  (subed-record-filter-skips
   (subed-parse-file
    <span class="org-string">"/home/sacha/proj/french/analysis/virelangues/2026-03-13-raphael-script.vtt"</span>)))
 <span class="org-string">"~/proj/french/analysis/virelangues-2026-03-13/2026-03-13-clip"</span>)
</code></pre>
</div>


<div class="subed-summary" id="org55d5daa">
<table>


<colgroup>
<col class="org-left">

<col class="org-left">

<col class="org-left">

<col class="org-left">

<col class="org-right">

<col class="org-left">

<col class="org-right">

<col class="org-right">

<col class="org-right">

<col class="org-right">

<col class="org-right">

<col class="org-left">
</colgroup>
<tbody>
<tr>
<td class="org-left">Gt</td>
<td class="org-left">Kk</td>
<td class="org-left">Az</td>
<td class="org-left">Me</td>
<td class="org-right">ID</td>
<td class="org-left">Comments</td>
<td class="org-right">All</td>
<td class="org-right">Acc</td>
<td class="org-right">Flu</td>
<td class="org-right">Comp</td>
<td class="org-right">Conf</td>
<td class="org-left">&nbsp;</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-01.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-01.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-01.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-01.opus?2026-03-27" class="audio-icon" title="X: pont">▶️</a></td>
<td class="org-right">1</td>
<td class="org-left">X: pont</td>
<td class="org-right">93</td>
<td class="org-right">99</td>
<td class="org-right">90</td>
<td class="org-right">100</td>
<td class="org-right">86</td>
<td class="org-left">Mon oncle peint un grand pont blanc. {pont}</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-02.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-02.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-02.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-02.opus?2026-03-27" class="audio-icon" title="C'est mieux">▶️</a></td>
<td class="org-right">2</td>
<td class="org-left">C'est mieux</td>
<td class="org-right">68</td>
<td class="org-right">75</td>
<td class="org-right">80</td>
<td class="org-right">62</td>
<td class="org-right">87</td>
<td class="org-left">Un singe malin prend un bon raisin rond.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-03.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-03.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-03.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-03.opus?2026-03-27" class="audio-icon" title="Ouais, c'est &#231;a">▶️</a></td>
<td class="org-right">3</td>
<td class="org-left">Ouais, c'est ça</td>
<td class="org-right">83</td>
<td class="org-right">94</td>
<td class="org-right">78</td>
<td class="org-right">91</td>
<td class="org-right">89</td>
<td class="org-left">Dans le vent du matin, mon chien sent un bon parfum.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-04.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-04.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-04.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-04.opus?2026-03-27" class="audio-icon" title="ok">▶️</a></td>
<td class="org-right">4</td>
<td class="org-left">ok</td>
<td class="org-right">75</td>
<td class="org-right">86</td>
<td class="org-right">63</td>
<td class="org-right">100</td>
<td class="org-right">89</td>
<td class="org-left">Le soin du roi consiste à joindre chaque coin du royaume.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-05.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-05.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-05.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-05.opus?2026-03-27" class="audio-icon" title="Ouais, c'est &#231;a, parfait">▶️</a></td>
<td class="org-right">5</td>
<td class="org-left">Ouais, c'est ça, parfait</td>
<td class="org-right">83</td>
<td class="org-right">94</td>
<td class="org-right">74</td>
<td class="org-right">100</td>
<td class="org-right">88</td>
<td class="org-left">Dans un coin du bois, le roi voit trois points noirs.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-06.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-06.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-06.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-06.opus?2026-03-27" class="audio-icon" title="Ouais, parfait">▶️</a></td>
<td class="org-right">6</td>
<td class="org-left">Ouais, parfait</td>
<td class="org-right">90</td>
<td class="org-right">92</td>
<td class="org-right">87</td>
<td class="org-right">100</td>
<td class="org-right">86</td>
<td class="org-left">Le feu de ce vieux four chauffe peu.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-07.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-07.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-07.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-07.opus?2026-03-27" class="audio-icon" title="Ouais">▶️</a></td>
<td class="org-right">7</td>
<td class="org-left">Ouais</td>
<td class="org-right">77</td>
<td class="org-right">85</td>
<td class="org-right">88</td>
<td class="org-right">71</td>
<td class="org-right">86</td>
<td class="org-left">Deux peureux veulent un peu de feu.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-08.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-08.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-08.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-08.opus?2026-03-27" class="audio-icon">▶️</a></td>
<td class="org-right">8</td>
<td class="org-left">&nbsp;</td>
<td class="org-right">77</td>
<td class="org-right">78</td>
<td class="org-right">75</td>
<td class="org-right">83</td>
<td class="org-right">85</td>
<td class="org-left">Deux vieux bœufs veulent du beurre.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-09.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-09.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-09.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-09.opus?2026-03-27" class="audio-icon" title="Ouais, parfait">▶️</a></td>
<td class="org-right">9</td>
<td class="org-left">Ouais, parfait</td>
<td class="org-right">92</td>
<td class="org-right">94</td>
<td class="org-right">89</td>
<td class="org-right">100</td>
<td class="org-right">89</td>
<td class="org-left">Elle aimait marcher près de la rivière.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-10.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-10.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-10.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-10.opus?2026-03-27" class="audio-icon" title="Ok, c'est bien">▶️</a></td>
<td class="org-right">10</td>
<td class="org-left">Ok, c'est bien</td>
<td class="org-right">93</td>
<td class="org-right">98</td>
<td class="org-right">89</td>
<td class="org-right">100</td>
<td class="org-right">90</td>
<td class="org-left">Je vais essayer de réparer la fenêtre.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-11.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-11.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-11.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-11.opus?2026-03-27" class="audio-icon" title="Okay">▶️</a></td>
<td class="org-right">11</td>
<td class="org-left">Okay</td>
<td class="org-right">83</td>
<td class="org-right">87</td>
<td class="org-right">76</td>
<td class="org-right">100</td>
<td class="org-right">89</td>
<td class="org-left">Le bébé préfère le lait frais.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-12.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-12.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-12.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-12.opus?2026-03-27" class="audio-icon">▶️</a></td>
<td class="org-right">12</td>
<td class="org-left">&nbsp;</td>
<td class="org-right">77</td>
<td class="org-right">92</td>
<td class="org-right">70</td>
<td class="org-right">86</td>
<td class="org-right">90</td>
<td class="org-left">Charlotte cherche ses chaussures dans la chambre.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-13.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-13.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-13.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-13.opus?2026-03-27" class="audio-icon" title="Okay">▶️</a></td>
<td class="org-right">13</td>
<td class="org-left">Okay</td>
<td class="org-right">91</td>
<td class="org-right">90</td>
<td class="org-right">94</td>
<td class="org-right">91</td>
<td class="org-right">88</td>
<td class="org-left">Un chasseur sachant chasser sans son chien est-il un bon chasseur ?</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-14.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-14.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-14.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-14.opus?2026-03-27" class="audio-icon" title="Ouais">▶️</a></td>
<td class="org-right">14</td>
<td class="org-left">Ouais</td>
<td class="org-right">91</td>
<td class="org-right">88</td>
<td class="org-right">92</td>
<td class="org-right">100</td>
<td class="org-right">91</td>
<td class="org-left">Le journaliste voyage en janvier au Japon.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-15.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-15.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-15.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-15.opus?2026-03-27" class="audio-icon" title="C'est bien (X: dans un)">▶️</a></td>
<td class="org-right">15</td>
<td class="org-left">C'est bien (X: dans un)</td>
<td class="org-right">91</td>
<td class="org-right">88</td>
<td class="org-right">94</td>
<td class="org-right">100</td>
<td class="org-right">88</td>
<td class="org-left">Georges joue du jazz dans un grand bar. {dans un}</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-16.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-16.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-16.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-16.opus?2026-03-27" class="audio-icon" title="C'est bien">▶️</a></td>
<td class="org-right">16</td>
<td class="org-left">C'est bien</td>
<td class="org-right">88</td>
<td class="org-right">87</td>
<td class="org-right">94</td>
<td class="org-right">88</td>
<td class="org-right">85</td>
<td class="org-left">Un jeune joueur joue dans le grand gymnase.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-17.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-17.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-17.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-17.opus?2026-03-27" class="audio-icon">▶️</a></td>
<td class="org-right">17</td>
<td class="org-left">&nbsp;</td>
<td class="org-right">95</td>
<td class="org-right">94</td>
<td class="org-right">96</td>
<td class="org-right">100</td>
<td class="org-right">91</td>
<td class="org-left">Le compagnon du montagnard soigne un agneau.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-18.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-18.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-18.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-18.opus?2026-03-27" class="audio-icon">▶️</a></td>
<td class="org-right">18</td>
<td class="org-left">&nbsp;</td>
<td class="org-right">85</td>
<td class="org-right">88</td>
<td class="org-right">84</td>
<td class="org-right">86</td>
<td class="org-right">89</td>
<td class="org-left">La cigogne soigne l’agneau dans la campagne.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-gtts-19.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-kokoro-19.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-azure-19.opus?2026-03-27" class="audio-icon">👂🏼</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/2026-03-13-clip-19.opus?2026-03-27" class="audio-icon" title="grenouille">▶️</a></td>
<td class="org-right">19</td>
<td class="org-left">grenouille</td>
<td class="org-right">71</td>
<td class="org-right">80</td>
<td class="org-right">68</td>
<td class="org-right">75</td>
<td class="org-right">86</td>
<td class="org-left">La grenouille fouille les feuilles dans la broussaille.</td>
</tr>
</tbody>
</table>

</div>

<p>
And comparing clips over time:
</p>

<div class="subed-summary" id="org7d5b437">

<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(learn-lang-subed-record-summarize-segments
 (split-string (org-file-contents <span class="org-string">"~/proj/french/analysis/virelangues-2026-03-13/phrases.txt"</span>) <span class="org-string">"\n"</span>)
 <span class="org-highlight-quoted-quote">'</span>((<span class="org-string">"/home/sacha/proj/french/analysis/virelangues/2026-03-13-raphael-script.vtt"</span> . <span class="org-string">"Mar 13"</span>)
   (<span class="org-string">"/home/sacha/proj/french/analysis/virelangues-2026-03-13/2026-03-20-raphael-script.vtt"</span> . <span class="org-string">"Mar 20"</span>)
   (<span class="org-string">"/home/sacha/proj/french/analysis/virelangues-2026-03-13/2026-03-24-raphael-script.vtt"</span> . <span class="org-string">"Mar 24"</span>)
   (<span class="org-string">"/home/sacha/proj/french/analysis/virelangues-2026-03-13/2026-03-27-script.vtt"</span> . <span class="org-string">"Mar 27"</span>))
 <span class="org-string">"~/proj/french/analysis/virelangues-2026-03-13/all-"</span>
 <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">learn-lang-subed-record-get-last-attempt</span>)
</code></pre>
</div>


<table>


<colgroup>
<col class="org-left">

<col class="org-left">

<col class="org-left">

<col class="org-left">

<col class="org-left">
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Mar 13</th>
<th scope="col" class="org-left">Mar 20</th>
<th scope="col" class="org-left">Mar 24</th>
<th scope="col" class="org-left">Mar 27</th>
<th scope="col" class="org-left">Text</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;mon-oncle-peint-un-grand-pont-blanc-01.opus?2026-03-27" class="audio-icon" title="Mar 13: X: pont">▶️ 93*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;mon-oncle-peint-un-grand-pont-blanc-02.opus?2026-03-27" class="audio-icon" title="Mar 20">▶️ 89</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;mon-oncle-peint-un-grand-pont-blanc-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 71*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;mon-oncle-peint-un-grand-pont-blanc-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 88</a></td>
<td class="org-left">Mon oncle peint un grand pont blanc.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-singe-malin-prend-un-bon-raisin-rond-01.opus?2026-03-27" class="audio-icon" title="Mar 13: C'est mieux">▶️ 68*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-singe-malin-prend-un-bon-raisin-rond-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Mm hmm">▶️ 82*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-singe-malin-prend-un-bon-raisin-rond-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 90*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-singe-malin-prend-un-bon-raisin-rond-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 91</a></td>
<td class="org-left">Un singe malin prend un bon raisin rond.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;dans-le-vent-du-matin-mon-chien-sent-un-bon-parfum-01.opus?2026-03-27" class="audio-icon" title="Mar 13: Ouais, c'est &#231;a">▶️ 83*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;dans-le-vent-du-matin-mon-chien-sent-un-bon-parfum-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Oui">▶️ 89*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;dans-le-vent-du-matin-mon-chien-sent-un-bon-parfum-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 93*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;dans-le-vent-du-matin-mon-chien-sent-un-bon-parfum-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 95</a></td>
<td class="org-left">Dans le vent du matin, mon chien sent un bon parfum.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-soin-du-roi-consiste-joindre-chaque-coin-du-royaume-01.opus?2026-03-27" class="audio-icon" title="Mar 13: ok">▶️ 75*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-soin-du-roi-consiste-joindre-chaque-coin-du-royaume-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Mm hmm">▶️ 84*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-soin-du-roi-consiste-joindre-chaque-coin-du-royaume-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Ouais">▶️ 86*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-soin-du-roi-consiste-joindre-chaque-coin-du-royaume-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 90</a></td>
<td class="org-left">Le soin du roi consiste à joindre chaque coin du royaume.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;dans-un-coin-du-bois-le-roi-voit-trois-points-noirs-01.opus?2026-03-27" class="audio-icon" title="Mar 13: Ouais, c'est &#231;a, parfait">▶️ 83*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;dans-un-coin-du-bois-le-roi-voit-trois-points-noirs-02.opus?2026-03-27" class="audio-icon" title="Mar 20: C'est &#231;a. C'est bien.">▶️ 88*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;dans-un-coin-du-bois-le-roi-voit-trois-points-noirs-03.opus?2026-03-27" class="audio-icon" title="Mar 24">▶️ 96</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;dans-un-coin-du-bois-le-roi-voit-trois-points-noirs-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 97</a></td>
<td class="org-left">Dans un coin du bois, le roi voit trois points noirs.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-feu-de-ce-vieux-four-chauffe-peu-01.opus?2026-03-27" class="audio-icon" title="Mar 13: Ouais, parfait">▶️ 90*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-feu-de-ce-vieux-four-chauffe-peu-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Oui">▶️ 90*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-feu-de-ce-vieux-four-chauffe-peu-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 90*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-feu-de-ce-vieux-four-chauffe-peu-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 99</a></td>
<td class="org-left">Le feu de ce vieux four chauffe peu.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;deux-peureux-veulent-un-peu-de-feu-01.opus?2026-03-27" class="audio-icon" title="Mar 13: Ouais">▶️ 77*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;deux-peureux-veulent-un-peu-de-feu-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Mm hmm">▶️ 77*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;deux-peureux-veulent-un-peu-de-feu-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mmm hmm">▶️ 84*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;deux-peureux-veulent-un-peu-de-feu-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 89</a></td>
<td class="org-left">Deux peureux veulent un peu de feu.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;deux-vieux-b-ufs-veulent-du-beurre-01.opus?2026-03-27" class="audio-icon" title="Mar 13">▶️ 77</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;deux-vieux-b-ufs-veulent-du-beurre-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Mm hmm">▶️ 80*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;deux-vieux-b-ufs-veulent-du-beurre-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Ouais">▶️ 71*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;deux-vieux-b-ufs-veulent-du-beurre-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 52</a></td>
<td class="org-left">Deux vieux bœufs veulent du beurre.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;elle-aimait-marcher-pr-s-de-la-rivi-re-01.opus?2026-03-27" class="audio-icon" title="Mar 13: Ouais, parfait">▶️ 92*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;elle-aimait-marcher-pr-s-de-la-rivi-re-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Ouais">▶️ 88*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;elle-aimait-marcher-pr-s-de-la-rivi-re-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 100*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;elle-aimait-marcher-pr-s-de-la-rivi-re-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 96</a></td>
<td class="org-left">Elle aimait marcher près de la rivière.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;je-vais-essayer-de-r-parer-la-fen-tre-01.opus?2026-03-27" class="audio-icon" title="Mar 13: Ok, c'est bien">▶️ 93*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;je-vais-essayer-de-r-parer-la-fen-tre-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Mm hmm">▶️ 87*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;je-vais-essayer-de-r-parer-la-fen-tre-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 98*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;je-vais-essayer-de-r-parer-la-fen-tre-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 94</a></td>
<td class="org-left">Je vais essayer de réparer la fenêtre.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-b-b-pr-f-re-le-lait-frais-01.opus?2026-03-27" class="audio-icon" title="Mar 13: Okay">▶️ 83*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-b-b-pr-f-re-le-lait-frais-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Ouais">▶️ 85*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-b-b-pr-f-re-le-lait-frais-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Ouais">▶️ 93*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-b-b-pr-f-re-le-lait-frais-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 97</a></td>
<td class="org-left">Le bébé préfère le lait frais.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;charlotte-cherche-ses-chaussures-dans-la-chambre-01.opus?2026-03-27" class="audio-icon" title="Mar 13">▶️ 77</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;charlotte-cherche-ses-chaussures-dans-la-chambre-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Oui">▶️ 78*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;charlotte-cherche-ses-chaussures-dans-la-chambre-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 88*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;charlotte-cherche-ses-chaussures-dans-la-chambre-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 87</a></td>
<td class="org-left">Charlotte cherche ses chaussures dans la chambre.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-chasseur-sachant-chasser-sans-son-chien-est-il-un-bon-chasseur-01.opus?2026-03-27" class="audio-icon" title="Mar 13: Okay">▶️ 91*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-chasseur-sachant-chasser-sans-son-chien-est-il-un-bon-chasseur-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Ouais">▶️ 92*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-chasseur-sachant-chasser-sans-son-chien-est-il-un-bon-chasseur-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 97*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-chasseur-sachant-chasser-sans-son-chien-est-il-un-bon-chasseur-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 92</a></td>
<td class="org-left">Un chasseur sachant chasser sans son chien est-il un bon chasseur ?</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-journaliste-voyage-en-janvier-au-japon-01.opus?2026-03-27" class="audio-icon" title="Mar 13: Ouais">▶️ 91*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-journaliste-voyage-en-janvier-au-japon-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Mm hmm">▶️ 84*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-journaliste-voyage-en-janvier-au-japon-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 88*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-journaliste-voyage-en-janvier-au-japon-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 91</a></td>
<td class="org-left">Le journaliste voyage en janvier au Japon.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;georges-joue-du-jazz-dans-un-grand-bar-01.opus?2026-03-27" class="audio-icon" title="Mar 13: C'est bien (X: dans un)">▶️ 91*</a></td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;georges-joue-du-jazz-dans-un-grand-bar-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Ouais, parfait">▶️ 79*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;georges-joue-du-jazz-dans-un-grand-bar-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 95</a></td>
<td class="org-left">Georges joue du jazz dans un grand bar.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-jeune-joueur-joue-dans-le-grand-gymnase-01.opus?2026-03-27" class="audio-icon" title="Mar 13: C'est bien">▶️ 88*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-jeune-joueur-joue-dans-le-grand-gymnase-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Oui, c'est bien.">▶️ 99*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-jeune-joueur-joue-dans-le-grand-gymnase-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 90*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-jeune-joueur-joue-dans-le-grand-gymnase-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 96</a></td>
<td class="org-left">Un jeune joueur joue dans le grand gymnase.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-compagnon-du-montagnard-soigne-un-agneau-01.opus?2026-03-27" class="audio-icon" title="Mar 13">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-compagnon-du-montagnard-soigne-un-agneau-02.opus?2026-03-27" class="audio-icon" title="Mar 20">▶️ 95</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-compagnon-du-montagnard-soigne-un-agneau-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 94*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-compagnon-du-montagnard-soigne-un-agneau-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 93</a></td>
<td class="org-left">Le compagnon du montagnard soigne un agneau.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-cigogne-soigne-l-agneau-dans-la-campagne-01.opus?2026-03-27" class="audio-icon" title="Mar 13">▶️ 85</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-cigogne-soigne-l-agneau-dans-la-campagne-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Mm hmm (I think I need to fix the campagne though)">▶️ 63*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-cigogne-soigne-l-agneau-dans-la-campagne-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Ouais">▶️ 86*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-cigogne-soigne-l-agneau-dans-la-campagne-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 100</a></td>
<td class="org-left">La cigogne soigne l'agneau dans la campagne.</td>
</tr>

<tr>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-grenouille-fouille-les-feuilles-dans-la-broussaille-01.opus?2026-03-27" class="audio-icon" title="Mar 13: grenouille">▶️ 71*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-grenouille-fouille-les-feuilles-dans-la-broussaille-02.opus?2026-03-27" class="audio-icon" title="Mar 20: X: la">▶️ 64*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-grenouille-fouille-les-feuilles-dans-la-broussaille-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Ouais">▶️ 79*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-grenouille-fouille-les-feuilles-dans-la-broussaille-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 91</a></td>
<td class="org-left">La grenouille fouille les feuilles dans la broussaille.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-vieille-abeille-travaille-dans-la-broussaille-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Ouais, c'est bien">▶️ 66*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-vieille-abeille-travaille-dans-la-broussaille-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Mm hmm">▶️ 79*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;la-vieille-abeille-travaille-dans-la-broussaille-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 73</a></td>
<td class="org-left">La vieille abeille travaille dans la broussaille.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-juge-jean-juge-justement-les-jolis-bijoux-de-julie-02.opus?2026-03-27" class="audio-icon" title="Mar 20: Y: Mm hmm">▶️ 96*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-juge-jean-juge-justement-les-jolis-bijoux-de-julie-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Ouais">▶️ 90*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;le-juge-jean-juge-justement-les-jolis-bijoux-de-julie-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 95</a></td>
<td class="org-left">Le juge Jean juge justement les jolis bijoux de Julie.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;ma-compagne-m-accompagne-la-campagne-avec-une-autre-compagne-03.opus?2026-03-27" class="audio-icon" title="Mar 24: Y: Ouais, c'est &#231;a">▶️ 92*</a></td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;ma-compagne-m-accompagne-la-campagne-avec-une-autre-compagne-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 93</a></td>
<td class="org-left">Ma compagne m'accompagne à la campagne avec une autre compagne.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;une-tortue-t-tue-marche-dessus-sous-une-pluie-continue-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 82</a></td>
<td class="org-left">Une tortue têtue marche dessus sous une pluie continue.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;une-mule-t-tue-pousse-une-roue-lourde-sur-une-rue-boueuse-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 76</a></td>
<td class="org-left">Une mule têtue pousse une roue lourde sur une rue boueuse.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;trois-gros-rats-gris-grimpent-dans-trois-grands-greniers-rugueux-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 73</a></td>
<td class="org-left">Trois gros rats gris grimpent dans trois grands greniers rugueux.</td>
</tr>

<tr>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left">&nbsp;</td>
<td class="org-left"><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/all&#45;&#45;un-professeur-rigoureux-corrige-un-rapport-sur-une-erreur-rare-04.opus?2026-03-27" class="audio-icon" title="Mar 27">▶️ 84</a></td>
<td class="org-left">Un professeur rigoureux corrige un rapport sur une erreur rare.</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
<div id="outline-container-comparing-pronunciation-recordings-across-time-the-code" class="outline-3">
<h3 id="comparing-pronunciation-recordings-across-time-the-code">The code</h3>
<div class="outline-text-3" id="text-comparing-pronunciation-recordings-across-time-the-code">
<details><summary>Code for summarizing the segments</summary>
<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(<span class="org-keyword">defun</span> <span class="org-function-name">my-subed-record-analyze-file-with-azure-and-references</span> (subtitles prefix <span class="org-type">&amp;optional</span> always-create)
  (cons
   <span class="org-highlight-quoted-quote">'</span>(<span class="org-string">"Gt"</span> <span class="org-string">"Kk"</span> <span class="org-string">"Az"</span> <span class="org-string">"Me"</span> <span class="org-string">"ID"</span> <span class="org-string">"Comments"</span> <span class="org-string">"All"</span> <span class="org-string">"Acc"</span> <span class="org-string">"Flu"</span> <span class="org-string">"Comp"</span> <span class="org-string">"Conf"</span>)
   (seq-map-indexed
    (<span class="org-keyword">lambda</span> (sub i)
      (<span class="org-keyword">let</span> ((sound-file (expand-file-name (format <span class="org-string">"%s-%02d.opus"</span>
                                                  prefix
                                                  (1+ i))))
            (tts-services
             <span class="org-highlight-quoted-quote">'</span>((<span class="org-string">"gtts"</span> . learn-lang-tts-gtts-say)
               (<span class="org-string">"kokoro"</span> . learn-lang-tts-kokoro-fastapi-say)
               (<span class="org-string">"azure"</span> . learn-lang-tts-azure-say)))
            tts-files
            (note (subed-record-get-directive <span class="org-string">"#+NOTE"</span> (elt sub 4))))
        (<span class="org-keyword">when</span> (<span class="org-keyword">or</span> always-create (not (file-exists-p sound-file)))
          (subed-record-extract-audio-for-current-subtitle-to-file sound-file sub))
        (<span class="org-keyword">setq</span>
         tts-files
         (mapcar
          (<span class="org-keyword">lambda</span> (row)
            (<span class="org-keyword">let</span> ((reference (format <span class="org-string">"%s-%s-%02d.opus"</span> prefix (car row) (1+ i) )))
              (<span class="org-keyword">when</span> (<span class="org-keyword">or</span> always-create (not (file-exists-p reference)))
                (funcall (cdr row)
                         (subed-record-simplify (elt sub 3))
                         <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">sync</span>
                         reference))
              (org-link-make-string
               (concat <span class="org-string">"audio:"</span> reference <span class="org-string">"?icon=t&amp;note="</span> (url-hexify-string (car row)))
               <span class="org-string">"&#128066;&#127996;"</span>)))
          tts-services))
        (append
         tts-files
         (list
          (org-link-make-string
           (concat <span class="org-string">"audio:"</span> sound-file <span class="org-string">"?icon=t"</span>
                   (format <span class="org-string">"&amp;source-start=%s"</span> (elt sub 1))
                   (<span class="org-keyword">if</span> (<span class="org-keyword">and</span> note (not (string= note <span class="org-string">""</span>)))
                       (format <span class="org-string">"&amp;title=%s"</span>
                               (url-hexify-string note))
                     <span class="org-string">""</span>))
           <span class="org-string">"&#9654;&#65039;"</span>)
          (format <span class="org-string">"%d"</span> (1+ i))
          (<span class="org-keyword">or</span> note <span class="org-string">""</span>))
         (learn-lang-azure-subed-record-parse (elt sub 4))
         (list
          (elt sub 3)))))
    subtitles)))
</code></pre>
</div>

</details>

<p>
Jumping to the source again:
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(<span class="org-keyword">defun</span> <span class="org-function-name">my-subed-record-org-clip-view-source</span> ()
  (<span class="org-keyword">interactive</span>)
  (<span class="org-keyword">let*</span> ((params
          (url-parse-query-string
           (cdr
            (url-path-and-query
             (url-generic-parse-url
              (org-element-property <span class="org-builtin">:raw-link</span> (org-element-context))))))))
    (find-file (car (alist-get <span class="org-string">"source-file"</span> params nil nil <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">string=</span>)))
    (subed-jump-to-subtitle-id-at-msecs
     (string-to-number (car (alist-get <span class="org-string">"source-start"</span> params nil nil <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">string=</span>))))))
</code></pre>
</div>


<p>
I've moved the rest of the code to <a href="https://codeberg.org/sachac/learn-lang/">sachac/learn-lang on Codeberg</a>.
</p>
</div>
</div>
<div><a href="https://sachachua.com/blog/2026/03/comparing-pronunciation-recordings-across-time/index.org">View Org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F03%2Fcomparing-pronunciation-recordings-across-time%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>Improving subed-vtt parsing; using dedicated windows in Emacs; training my intuition</title>
		<link>https://sachachua.com/blog/2025/01/improving-subed-vtt-parsing-using-dedicated-windows-in-emacs-training-my-intuition/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Tue, 28 Jan 2025 18:07:54 GMT</pubDate>
    <category>emacs</category>
<category>subed</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2025/01/improving-subed-vtt-parsing-using-dedicated-windows-in-emacs-training-my-intuition/</guid>
		<description><![CDATA[<p>
While putting together some notes on how to use
<a href="https://github.com/sachac/subed?tab=readme-ov-file#starting-from-auto-generated-youtube-captions">subed.el with auto-generated YouTube captions</a>, I
decided to get subed-word-data working with the
Youtube VTT format. The sample file I downloaded
from one of my YouTube videos had a cue whose text
started with a blank line, so I ended up redoing
the way subed-vtt.el parsed cues. Twice, actually.
The first time, I changed it to handle multiple
blocks in cue text (separated by blank lines).
Then I came across this <a href="https://github.com/web-platform-tests/wpt/tree/master/webvtt/parsing/file-parsing/tests">test suite for WebVTT
parsing</a> and found out that the timing line for a
cue doesn't have to be preceded by a blank line,
so then I needed to change the VTT parsing again.
</p>

<p>
Fortunately, I inherited a large <a href="https://github.com/jorgenschaefer/emacs-buttercup">Buttercup</a> test
suite from subed.el's original author. I've been
adding to it over the years. As I learned more
about how I wanted subed.el to behave, I added
more cases. Then I worked on shifting the code to
behave the way I wanted it to. At first, I didn't
quite understand what I wanted the code to do, but
as I pinned down more test cases, I was able to
figure it out.
</p>

<p>
This was the first time I used
<code>toggle-window-dedicated</code> (<code>C-x w d</code>) extensively.
This function keeps the same buffer displayed in
the window instead of letting Emacs Lisp functions
replace it. First, I set up a large window for my
<code>subed-vtt.el</code>. I split the other side into a
smaller window for my <code>test-subed-vtt.el</code>, another
window for a temporary VTT file, and a window for
output from whatever command I'm running. I set
most of the windows to dedicated except for my
temporary output window. I also enabled
<code>winner-mode</code> just in case I messed things up so
that I could restore with <code>winner-undo</code>.
Dedicating the windows meant I didn't have to keep
fussing around with my windows and buffers to get
things back to where I wanted them to be. I did
use <code>C-x o</code> (<code>other-window</code>) a lot, so maybe it'll
be worth getting the hang of <a href="https://github.com/abo-abo/ace-window">ace-window</a>.
</p>


<figure id="orgdebfff4">
<img src="https://sachachua.com/blog/2025/01/improving-subed-vtt-parsing-using-dedicated-windows-in-emacs-training-my-intuition/2025-01-28_12-40-04.png" alt="2025-01-28_12-40-04.png">

<figcaption><span class="figure-number">Figure 1: </span>Dedicated windows for the code, the test file, and a VTT buffer for interactive testing; a spare window for other output</figcaption>
</figure>

<p>
Sometimes I wanted to focus on one of those small
windows. <a href="https://protesilaos.com/codelog/2020-08-03-emacs-custom-functions-galore/">prot/window-single-toggle</a> was helpful for
maximizing a window and then returning to the
previous configuration.
</p>

<p>
I mostly evaluated or edebugged my code and then
used <a href="https://sachachua.com/dotemacs#buttercup">my-buttercup-run-dwim</a> to run a suite in my
<code>test-subed-vtt.el</code>. <code>sp-backward-up-sexp</code> and
<code>sp-narrow-to-sexp</code> were also helpful for
navigating the suites and focusing on whatever I
was working on.
</p>

<p>
I'm looking forward to exploring the other test
cases from that repository. It feels good to get
better as a coder.
</p>

<p>
I just finished reading <a href="https://www.goodreads.com/book/show/200128457-mathematica">Mathematica: a Secret
World of Imagination and Curiosity</a>, by David
Bessis. The idea of training your intuition echoed
in my mind as I wrote test cases and changed the
code. I started to look forward to the gaps
between my understanding of the spec and my
understanding of the test cases, and the gaps
between the test cases and my implementation. It
felt almost like a conversation. Sometimes it was
hard to translate an idea into code. I felt myself
getting muddled and turned around. Whenever I
noticed that, I just had to back up and start from
something I understood, figure out what I was
uncertain about, and then go from there.
</p>

<p>
I like the way that subed.el gives me tools for
thinking about text, times, and metadata together.
That abstraction has been helpful for editing
audio and making videos. The more solid I can make
it, the easier it will be to imagine other things
that use those ideas.
</p>
<div><a href="https://sachachua.com/blog/2025/01/improving-subed-vtt-parsing-using-dedicated-windows-in-emacs-training-my-intuition/index.org">View org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2025%2F01%2Fimproving-subed-vtt-parsing-using-dedicated-windows-in-emacs-training-my-intuition%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>Automatically correcting phrasing and misrecognized words in speech-to-text captions by using a script</title>
		<link>https://sachachua.com/blog/2025/01/automatically-correcting-phrasing-and-misrecognized-words-in-speech-to-text-captions-by-using-a-script/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Sat, 11 Jan 2025 14:11:40 GMT</pubDate>
    <category>speechtotext</category>
<category>subed</category>
<category>emacs</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2025/01/automatically-correcting-phrasing-and-misrecognized-words-in-speech-to-text-captions-by-using-a-script/</guid>
		<description><![CDATA[<p>
I usually write my scripts with phrases that could be turned into the subtitles. I figured I might as well combine that information with the WhisperX transcripts which I use to cut out my false starts and oopses. To do that, I use the <code>string-distance</code> function, which calculates how similar strings are, based on the <a href="https://en.wikipedia.org/wiki/Levenshtein_distance">Levenshtein [distance] algorithm</a>. If I take each line of the script and compare it with the list of words in the transcription, I can add one transcribed word at a time, until I find the number with the minimum distance from my current script phrase. This lets me approximately match strings despite misrecognized words. I use oopses to signal mistakes. When I detect those, I look for the previous script line that is closest to the words I restart with. I can then skip the previous lines automatically. When the script and the transcript are close, I can automatically correct the words. If not, I can use comments to easily compare them at that point. Even though I haven't optimized anything, it runs well enough for my short videos. With these subtitles as a base, I can get timestamps with <code>subed-align</code> and then there's just the matter of tweaking the times and adding the visuals.
</p>

<p>
</p><div class="sketch-full"><a class="photoswipe" href="https://sketches.sachachua.com/filename/2025-01-09-01%20Matching%20a%20script%20with%20a%20transcript%20&#45;&#45;%20subed%20emacs.png" data-src="https://sketches.sachachua.com/static/2025-01-09-01%20Matching%20a%20script%20with%20a%20transcript%20&#45;&#45;%20subed%20emacs.png" data-title="2025-01-09-01 Matching a script with a transcript &#x2013; subed emacs" data-w="2808" data-h="3744"><picture>
      <img src="https://sketches.sachachua.com/static/2025-01-09-01%20Matching%20a%20script%20with%20a%20transcript%20&#45;&#45;%20subed%20emacs.png" width="2808" height="3744" alt="2025-01-09-01 Matching a script with a transcript &#x2013; subed emacs" loading="lazy" style="max-height: 90vw; height: auto; width: auto" decoding="async">
      <figcaption>2025-01-09-01 Matching a script with a transcript &#x2013; subed emacs</figcaption>
    </picture></a></div>
<p></p>

<details class="code-details" style="padding: 1em;
                 border-radius: 15px;
                 font-size: 0.9em;
                 box-shadow: 0.05em 0.1em 5px 0.01em  #00000057;">
                  <summary><strong>Text from sketch</strong></summary>
<p>
Matching a script with a transcript 2025-01-09-01
</p>

<ul class="org-ul">
<li>script</li>
<li>record on my phone</li>
<li>WhisperX transcript (with false starts and recognition errors)</li>
</ul>

<p>
My current implementation is totally unoptimized (n²) but it's fine for short videos.
</p>

<p>
Process:
</p>

<ul class="org-ul">
<li>While there are transcript words to process
<ul class="org-ul">
<li>Find the script line that has the minimum distance to the words left in the transcript. restart after oopses</li>
</ul></li>

<li>Script</li>
<li>Transcript: min. distance between script phrase &amp; transcript</li>
<li>Restarting after oops: find script phrase with minimum distance</li>

<li>Ex. script phrase: The Emacs text editor</li>
<li>Transcript: The Emax text editor is a&#x2026;</li>
<li>Bar graph of distance decreasing, and then increasing again</li>
<li>Minimum distance</li>

<li>Oops?
<ul class="org-ul">
<li>N: Use transcript words, or diff &gt; threshold?
<ul class="org-ul">
<li>Y: Add script words as comment</li>
<li>N: Correct minor errors</li>
</ul></li>
<li>Y: Mark caption for skipping and look for the previous script line with minimum distance.</li>
</ul></li>
</ul>

<p>
Result:
</p>

<ul class="org-ul">
<li>Untimed captions with comments</li>
<li>Aeneas</li>
<li>Timed captions for editing</li>
</ul>

<p>
This means I can edit a nicely-split, mostly-corrected file.
</p>


</details>

<p>
I've included the links to various files below so you can get a sense of how it works. Let's focus on an excerpt from the middle of my script file.
</p>

<pre class="example" id="org95bda22">
it runs well enough for my short videos.
With these subtitles as a base,
I can get timestamps with subed-align
</pre>

<p>
When I call WhisperX with <code>large-v2</code> as the model and <code>&#45;&#45;max_line_width 50 &#45;&#45;segment_resolution chunk &#45;&#45;max_line_count 1</code> as the options, it produces these captions corresponding to that part of the script.
</p>


<div class="org-src-container">
<pre class="src src-subed-vtt"><span class="org-subed-time">01:25.087</span> <span class="org-subed-time-separator">&#45;&#45;&gt;</span> <span class="org-subed-time">01:29.069</span>
runs well enough for my short videos. With these subtitles

<span class="org-subed-time">01:29.649</span> <span class="org-subed-time-separator">&#45;&#45;&gt;</span> <span class="org-subed-time">01:32.431</span>
as a base, I can get... Oops. With these subtitles as a base, I

<span class="org-subed-time">01:33.939</span> <span class="org-subed-time-separator">&#45;&#45;&gt;</span> <span class="org-subed-time">01:41.205</span>
can get timestamps with subedeline, and then there's just
</pre>
</div>


<p>
Running <code>subed-word-data-use-script-file</code> results in a VTT file containing this excerpt:
</p>


<div class="org-src-container">
<pre class="src src-subed-vtt"><span class="org-subed-time">00:00:00.000</span> <span class="org-subed-time-separator">&#45;&#45;&gt;</span> <span class="org-subed-time">00:00:00.000</span>
it runs well enough for my short videos.

<span class="org-comment">NOTE #+SKIP</span>

<span class="org-subed-time">00:00:00.000</span> <span class="org-subed-time-separator">&#45;&#45;&gt;</span> <span class="org-subed-time">00:00:00.000</span>
With these subtitles as a base,

<span class="org-comment">NOTE #+SKIP</span>

<span class="org-subed-time">00:00:00.000</span> <span class="org-subed-time-separator">&#45;&#45;&gt;</span> <span class="org-subed-time">00:00:00.000</span>
I can get... Oops.

<span class="org-subed-time">00:00:00.000</span> <span class="org-subed-time-separator">&#45;&#45;&gt;</span> <span class="org-subed-time">00:00:00.000</span>
With these subtitles as a base,

<span class="org-comment">NOTE</span>
<span class="org-comment">#+TRANSCRIPT: I can get timestamps with subedeline,</span>
<span class="org-comment">#+DISTANCE: 0.14</span>

<span class="org-subed-time">00:00:00.000</span> <span class="org-subed-time-separator">&#45;&#45;&gt;</span> <span class="org-subed-time">00:00:00.000</span>
I can get timestamps with subed-align
</pre>
</div>


<p>
There are no timestamps yet, but <code>subed-align</code> can add them. Because <code>subed-align</code> uses the <a href="https://github.com/readbeyond/aeneas">Aeneas</a> forced alignment tool to figure out timestamps by lining up waveforms for speech-synthesized text with the recorded audio, it's important to keep the false starts in the subtitle file. Once <code>subed-align</code> has filled in the timestamps and I've tweaked the timestamps by using the waveforms, I can use <a href="https://github.com/sachac/subed-record">subed-record</a> to create an audio file that omits the subtitles that have <code>#+SKIP</code> comments.
</p>

<p>
The code is available as <code>subed-word-data-use-script-file</code> in <a href="https://github.com/sachac/subed/blob/main/subed/subed-word-data.el">subed-word-data.el</a>. I haven't released a new version of subed.el yet, but you can get it from the repository.
</p>

<ul class="org-ul">
<li><a href="https://sachachua.com/blog/2025/01/automatically-correcting-phrasing-and-misrecognized-words-in-speech-to-text-captions-by-using-a-script/202501(2).txt">Script as a text file exported using the Supernote's handwriting recognition</a></li>
<li><a href="https://sachachua.com/blog/2025/01/automatically-correcting-phrasing-and-misrecognized-words-in-speech-to-text-captions-by-using-a-script/2025_01_08_10_07_00.vtt">VTT produced by WhisperX</a></li>
<li><a href="https://sachachua.com/blog/2025/01/automatically-correcting-phrasing-and-misrecognized-words-in-speech-to-text-captions-by-using-a-script/2025_01_08_10_07_00-split.vtt">VTT that was automatically split and commented using subed-word-data-use-script-file</a></li>
</ul>

<p>
In addition to making my editing workflow a little more convenient, I think it might also come in handy for applying the segmentation from tools like <a href="https://gitlab.com/jun8git/sub-seg">sub-seg</a> or <a href="https://github.com/readbeyond/lachesis">lachesis</a> to captions that might already have been edited by volunteers. (I got sub-seg working on my system, but I haven't figured out lachesis.) If I call <code>subed-word-data-use-script-file</code> with the universal prefix arg <code>C-u</code>, it should set <code>keep-transcript-words</code> to true and keep any corrections we've already made to the caption text while still approximately matching and using the other file's segments. Neatly-segmented captions might be more pleasant to read and may <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC7901653/">require less cognitive load</a>.
</p>

<p>
There's probably some kind of fancy Python project
that already does this kind of false start
identification and script reconciliation. I just
did it in Emacs Lisp because that was handy and
because that way, I can make it part of subed. If
you know of a more robust or full-featured
approach, please let me know!
</p>
<div><a href="https://sachachua.com/blog/2025/01/automatically-correcting-phrasing-and-misrecognized-words-in-speech-to-text-captions-by-using-a-script/index.org">View org source for this post</a></div>
<p>You can <a href="https://sachachua.com/blog/2025/01/automatically-correcting-phrasing-and-misrecognized-words-in-speech-to-text-captions-by-using-a-script/#comment">view 1 comment</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2025%2F01%2Fautomatically-correcting-phrasing-and-misrecognized-words-in-speech-to-text-captions-by-using-a-script%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>#YayEmacs 9: Trimming/adding silences to get to a target; subed-record-sum-time</title>
		<link>https://sachachua.com/blog/2025/01/yayemacs-9-trimming-adding-silences-to-get-to-a-target-subed-record-sum-time/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Thu, 09 Jan 2025 15:24:29 GMT</pubDate>
    <category>audio</category>
<category>subed</category>
<category>yay-emacs</category>
<category>emacs</category>
<category>video</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2025/01/yayemacs-9-trimming-adding-silences-to-get-to-a-target-subed-record-sum-time/</guid>
		<description><![CDATA[<p>
New in this video: subed-record-sum-time, <code>#+PAD_LEFT</code> and <code>#+PAD_RIGHT</code>
</p>

<div class="row"><div class="columns"><div style="width: 400px"><video controls="1" src="https://sachachua.com/blog/2025/01/yayemacs-9-trimming-adding-silences-to-get-to-a-target-subed-record-sum-time/subed-record-sum-time.webm" poster="https://sachachua.com/blog/2025/01/yayemacs-9-trimming-adding-silences-to-get-to-a-target-subed-record-sum-time/2025-01-09_10-23-18.png" type="video/webm"><div>Video not supported. Thumbnail:<br><img src="https://sachachua.com/blog/2025/01/yayemacs-9-trimming-adding-silences-to-get-to-a-target-subed-record-sum-time/2025-01-09_10-23-18.png" alt="Thumbnail"></div><a href="https://sachachua.com/blog/2025/01/yayemacs-9-trimming-adding-silences-to-get-to-a-target-subed-record-sum-time/subed-record-sum-time.webm">Download the video</a></video></div></div><div class="columns">
<p>
I like the constraints of a one-minute video, so I added a subed-record-sum-time command. That way, when I edit the video using Emacs, I can check how long the result will be. First, I split the subtitles, align it with the audio to fix the timestamps, and double check the times. Then I can skip my oopses. Sometimes WhisperX doesn't catch them, so I also look at waveforms and characters per second. I already talk quickly, so I'm not going to speed that up but I can trim the pauses in between phrases which is easy to do with waveforms. Sometimes, after reviewing a draft, I realize I need a little more time. If the original audio has some silence, I can just copy and paste it. If not, I can pad left or pad right to add some silence. I can try the flow of some sections and compile the video when I'm ready. Emacs can do almost anything. Yay Emacs!
</p>

<p>You can <a href="https://youtube.com/watch?v=https://youtube.com/shorts/scyAC4yrWbE">watch this on YouTube</a>, <a href="https://sachachua.com/blog/2025/01/yayemacs-9-trimming-adding-silences-to-get-to-a-target-subed-record-sum-time/subed-record-sum-time.webm">download the video</a>, or <a href="https://sachachua.com/blog/feed/media/subed-record-sum-time.opus">download the audio</a>.</p></div></div>

<p>
Play by play:
</p>

<ul class="org-ul">
<li>I like the constraints of a one-minute video, so I added a <code>subed-record-sum-time</code> command. That way, when I edit the video using Emacs, I can check how long the result will be.
<ul class="org-ul">
<li><a href="https://github.com/sachac/subed-record">subed-record</a> uses subtitles and directives in
comments in a VTT subtitle file to edit audio
and video. <code>subed-record-sum-time</code> calculates
the resulting duration and displays it in the
minibuffer.</li>
</ul></li>
<li>First, I split the subtitles, align it with the audio to fix the timestamps, and double check the times.
<ul class="org-ul">
<li>I'm experimenting with an algorithmic way to
combine the breaks from my script with the
text from the transcript. <code>subed-align</code> calls
the <a href="https://github.com/readbeyond/aeneas">aeneas forced alignment tool</a> to match up
the text with the timestamps. I use
<code>subed-waveform-show-all</code> to show all the
waveforms.</li>
</ul></li>
<li>Then I can skip my oopses.
<ul class="org-ul">
<li>Adding a <code>NOTE #+SKIP</code> comment before a
subtitle makes <code>subed-record-compile-video</code>
and <code>subed-record-compile-flow</code> skip that part
of the audio.</li>
</ul></li>
<li>Sometimes WhisperX doesn't catch them,
<ul class="org-ul">
<li><a href="https://github.com/m-bain/whisperX">WhisperX</a> sometimes doesn't transcribe my false starts if I repeat things quickly.</li>
</ul></li>
<li>so I also look at waveforms
<ul class="org-ul">
<li><code>subed-waveform-show-all</code> adds waveforms for
all the subtitles. If I notice there's a pause
or a repeated shape in the waveform, or if I
listen and notice the repetition, I can
confirm by middle-clicking on the waveform to
sample part of it.</li>
</ul></li>
<li>and characters per second.
<ul class="org-ul">
<li>Low characters per second is sometimes a sign
that the timestamps are incorrect or there's a
repetition that wasn't transcribed.</li>
</ul></li>
<li>I already talk quickly, so I'm not going to speed that up
<ul class="org-ul">
<li>Also, I already sound like a chipmunk;
mechanically speeding up my recording to fit
in a certain time will make that worse =)</li>
</ul></li>
<li>but I can trim the pauses in between phrases which is easy to do with waveforms.
<ul class="org-ul">
<li>left-click to set the start, right-click to
set the stop. If I want to adjust the
previous/next one at the same time, I would
use shift-left-click or shift-right-click, but
here I want to skip the gaps between phrases,
so I adjust the current subtitle without
making the previous/next one longer.</li>
</ul></li>
<li>Sometimes, after reviewing a draft, I realize I need a little more time.
<ul class="org-ul">
<li>I can specify visuals like a video, animated
GIF, or an image by adding a <code>[[file:...]]</code>
link in the comment for a subtitle. That
visual will be used until the next visual is
specified in a comment on a different
subtitle. <code>subed-record-compile-video</code> can
automatically speed up video clips to fit in
the time for the current audio segment, which
is the set of subtitles before the next visual
is defined. After I compile and review the
video, sometimes I notice that something goes by too quickly.</li>
</ul></li>
<li>If the original audio has some silence, I can just copy and paste it.
<ul class="org-ul">
<li>This can sometimes feel more natural than adding in complete silence.</li>
</ul></li>
<li>If not, I can pad left or pad right to add some silence.
<ul class="org-ul">
<li>I added a new feature so that I could specify
something like <code>#+PAD_RIGHT: 1.5</code> in a comment
to add 1.5 seconds of silence after the audio
specified by that subtitle.</li>
</ul></li>
<li>I can try the flow of some sections
<ul class="org-ul">
<li>I can select a region and then use <code>M-x
    subed-record-compile-try-flow</code> to play the
audio or <code>C-u M-x
    subed-record-compile-try-flow</code> to play the
audio+video for that region.</li>
</ul></li>
<li>and compile the video when I'm ready.
<ul class="org-ul">
<li><code>subed-record-compile-video</code> compiles the
video to the file specified in <code>#+OUTPUT:
    filename</code>. ffmpeg is very arcane, so I'm glad
I can simplify my use of it with Emacs Lisp.</li>
</ul></li>
<li>Emacs can do almost anything. Yay Emacs!
<ul class="org-ul">
<li>Non-linear audio and video editing is actually
pretty fun in a text editor, especially when I
can just use <code>M-x vundo</code> to navigate my undo
history.</li>
</ul></li>
</ul>

<p>
Links:
</p>

<ul class="org-ul">
<li><a href="https://github.com/sachac/subed">sachac/subed: subed is a subtitle editor for Emacs</a></li>
<li><a href="https://github.com/sachac/subed-record">sachac/subed-record: Record audio in segments and compile it into a file</a></li>
<li><a href="https://github.com/m-bain/whisperX">m-bain/whisperX: WhisperX: Automatic Speech Recognition with Word-level Timestamps (&amp; Diarization)</a></li>
<li><a href="https://github.com/readbeyond/aeneas">readbeyond/aeneas: aeneas is a Python/C library and a set of tools to automagically synchronize audio and text (aka forced alignment)</a></li>
</ul>

<p>
Related:
</p>

<ul class="org-ul">
<li><a href="https://sachachua.com/blog/2025/01/editing-videos-with-emacs-and-subed-record-el/">Editing videos with Emacs and subed-record.el</a></li>
<li><a href="https://sachachua.com/blog/2024/10/yay-emacs-tweaking-my-video-workflow-with-whisperx-and-subed-record/">Yay Emacs 5: Tweaking my video workflow with WhisperX and subed-record</a></li>
</ul>
<div><a href="https://sachachua.com/blog/2025/01/yayemacs-9-trimming-adding-silences-to-get-to-a-target-subed-record-sum-time/index.org">View org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2025%2F01%2Fyayemacs-9-trimming-adding-silences-to-get-to-a-target-subed-record-sum-time%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>Editing videos with Emacs and subed-record.el</title>
		<link>https://sachachua.com/blog/2025/01/editing-videos-with-emacs-and-subed-record-el/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Wed, 01 Jan 2025 19:23:04 GMT</pubDate>
    <category>emacs</category>
<category>subed</category>
<category>video</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2025/01/editing-videos-with-emacs-and-subed-record-el/</guid>
		<description><![CDATA[<p>
I want to document more of my Minecraft adventures with A+. Video is a natural way to do this. It builds on her familiarity with the tutorials and streams she enjoys watching. I set up <a href="https://obsproject.com/">OBS</a> on her laptop and plugged in my Blue Yeti microphone. We did our first interview yesterday. I edited and subtitled it (because why not!), uploaded it as an unlisted YouTube video, and shared it with her dad, sister, and cousins.
</p>

<p>
I did the video editing in Emacs with <a href="https://github.com/sachac/subed-record">subed-record</a>. First, I used <a href="https://github.com/m-bain/whisperX">WhisperX</a> to transcribe the video, and I used <a href="https://github.com/sachac/subed/blob/main/subed/subed-align.el">subed-align</a> to fix the timestamps with <a href="https://www.readbeyond.it/aeneas/">aeneas</a>. I normalized the audio with <a href="https://www.audacityteam.org/">Audacity</a> and I exported the .opus file for use in subed-record.el. Then I added <code>NOTE #+SKIP</code> before times I wanted to remove, like when she asked for a retake. Here's what that subtitle markup looks like:
</p>

<pre class="example" id="org5b67dfb">
WEBVTT

NOTE #+SKIP

00:00:00.000 &#45;&#45;&gt; 00:00:16.679
And then I'll record in my side also
and we'll just put it in somehow.
Somehow. Okay. We can edit that, right?
Yeah, we'll learn how to edit things.
It'll be great.

NOTE
Introduction
#+AUDIO: cuberventures-001.opus
[[file:intro.webm]]
#+OUTPUT: cuberventures-001-fxnt-create-2-windmill-home-cafe-trains-hotel-half-underwater.webm

00:00:16.680 &#45;&#45;&gt; 00:00:19.399
Okay, so now we're here with &lt;username&gt;.

00:00:19.400 &#45;&#45;&gt; 00:00:23.039
I want to find out what you like about Minecraft and

00:00:23.040 &#45;&#45;&gt; 00:00:26.079
all the cool things that you have been building lately.
</pre>

<p>
This was a little different from my usual video creation workflow, where I record the audio and the video separately. When I wrote subed-record.el, I assumed I'd edit the audio first,  choose images/GIFs/videos that were already ready to go, and then combine those visuals with sections of audio, speeding things up or slowing things down as needed. Now I wanted to apply the same edits to the video as I did to the audio. A+ did a great job of looking at stuff in Minecraft while talking about them, so I wanted to keep her narration in sync. I added some code to allow me to specify a same-edits keyword for the visuals. That meant that I would use the same selection list that I used for cutting the audio. Here's what that subtitle markup looks like:
</p>

<pre class="example" id="orgdbcad53">
NOTE
[[file:2024-12-31 10-35-14.mkv]]
#+OPTIONS: same-edits

00:00:43.860 &#45;&#45;&gt; 00:00:45.941
Shall we take a tour of my world?

00:00:45.942 &#45;&#45;&gt; 00:00:50.079
Sure, let's tell people which mod pack this is.

00:00:50.080 &#45;&#45;&gt; 00:00:55.639
This is FXNT Create 2, also known as FoxyNoTail Create 2.

NOTE Windmill

00:00:55.640 &#45;&#45;&gt; 00:00:58.239
I've got this little bit of path leading to the interview

00:00:58.240 &#45;&#45;&gt; 00:01:01.839
room. This is my unfinished windmill. I've been meaning to
</pre>

<p>
This workflow lets me cut out segments in the middle of the video, like this:
</p>

<pre class="example" id="orgd791344">
00:17:30.200 &#45;&#45;&gt; 00:17:33.119
great start for a tour. I'm looking forward to seeing what

00:17:33.120 &#45;&#45;&gt; 00:17:34.112
you will build next.

NOTE #+SKIP

00:17:34.113 &#45;&#45;&gt; 00:18:02.379
Do you have any last words before
we try to figure out this video editing thing?
Yeah. We'll cut that last part out.
Let's just do a retake on that last part.
Someday. Out here. Okay. There you go.
This is a beautiful view.

00:18:02.380 &#45;&#45;&gt; 00:18:08.119
The last things I want to say about this world is there'll be
</pre>

<p>
I also wanted to start the video with a segment from my recording, so we could see her avatar on screen during the introduction. She kept her computer on first-person POV instead of changing the camera. I used mpv to figure out the timestamps for the start and end of the part that I wanted to use, then I used ffmpeg to cut that clip. I added a comment with a link to that video in order to use it before the main video. That's the <code>[[file:intro.webm]]</code> in the first section's comments.
</p>

<p>
After testing a small section of the transcript by selecting a region and using <code>subed-record-compile-video</code>, I deselected the region and used <code>subed-record-compile-video</code> to produce the whole video.
</p>

<p>
I also modified <code>subed-record-compile-subtitles</code>
to include the other non-directive comments, so I
can include the section headings in the raw VTT
file and have them turn up in the exported
version. Then I can use the new
<code>subed-section-comments-as-chapters</code> command to
copy those as chapters for the YouTube
description.
</p>

<p>
We're not going to share that particular video
yet, but I'm looking forward to trying that
technique with videos about stuff I'm figuring out
in Minecraft or Emacs. It's also tempting me to
think about ways to specify transitions like
crossfades and other fancy effects like overlays.
</p>

<p>
I like using the transcript as the starting point
for video editing. It just makes sense to me to
work with it as text. I also like this experiment
with documenting more of our Minecraft
experimentation. It seems to get her talking and
encourages her to build more. I'm looking forward
to learning more about Minecraft and making videos
too.
</p>

<p>
We did another video today using the new shortcuts
I've just set up for toggling OBS recording. This
time we didn't even need to do any editing. I used
Org Export to make her a little HTML file that had
the two videos on it, so she can review it any
time. Onward!
</p>
<div><a href="https://sachachua.com/blog/2025/01/editing-videos-with-emacs-and-subed-record-el/index.org">View org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2025%2F01%2Fediting-videos-with-emacs-and-subed-record-el%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>subed.el: Tweaking subtitle times</title>
		<link>https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Thu, 19 Dec 2024 14:51:17 GMT</pubDate>
    <category>emacs</category>
<category>subed</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/</guid>
		<description><![CDATA[<p>
When subtitle times are too far off from the video
or audio, people start worrying if their video has
frozen or jumped ahead. It's good to keep
subtitles roughly in time with the audio.
</p>

<p>
For EmacsConf, we can get timing information from
two places. <a href="https://github.com/m-bain/whisperX">WhisperX</a> produces a JSON file with
word data in the process of doing the speech
recognition, and the <a href="https://www.readbeyond.it/aeneas/">aeneas forced alignment tool</a>
can use synthesized text-to-speech to figure out
the timestamps for each line of text compared to a
media file.
</p>

<p>
Aeneas timestamps are more helpful once we start
editing, but it can be confused by long silences,
extraneous noises, multiple speakers, and
inaccurate transcripts (words added or removed).
</p>

<p>
<a href="https://sachachua.com/blog/2024/11/yay-emacs-7-using-word-timing-in-caption-editing-with-subed-word-data/">When I combine the WhisperX word data with
subtitles</a>, I can see where the times might need a
closer look because matching words weren't found.
</p>


<figure id="org4b1534a">
<img src="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_12-27-37.png" alt="2024-12-18_12-27-37.png">

<figcaption><span class="figure-number">Figure 1: </span>Screenshot with word data loaded</figcaption>
</figure>

<p>
Loading word data requires a pretty close match at
the moment, but since we change only about 4% of
the subtitle text when editing, those cues are
still helpful. (I measured this by the Levenshtein
distance between the combined cue texts of edited
subtitles versus the original WhisperX
transcripts, using <code>string-distance</code> to
approximate the editing percentage.)
</p>

<details><summary>Calculating how much we edited</summary>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span class="org-keyword">let</span> ((sum-original 0)
      (sum-dist 0))
  (append
   (seq-keep
    (<span class="org-keyword">lambda</span> (talk)
      (<span class="org-keyword">when</span> (<span class="org-keyword">and</span> (emacsconf-talk-file talk <span class="org-string">"&#45;&#45;main.vtt"</span>)
                 (emacsconf-talk-file talk <span class="org-string">"&#45;&#45;reencoded.json"</span>))
        (<span class="org-keyword">let*</span> ((json-object-type <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">alist</span>)
               (json-array-type <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">list</span>)
               (edited-text
                (mapconcat (<span class="org-keyword">lambda</span> (sub) (elt sub 3))
                           (subed-parse-file (emacsconf-talk-file talk <span class="org-string">"&#45;&#45;main.vtt"</span>))
                           <span class="org-string">" "</span>))
               (original-text
                (mapconcat
                 (<span class="org-keyword">lambda</span> (word)
                   (assoc-default <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">word</span> word))
                 (assoc-default
                  <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">word_segments</span>
                  (json-read-file (emacsconf-talk-file talk <span class="org-string">"&#45;&#45;reencoded.json"</span>)))
                 <span class="org-string">" "</span>))
               (dist (string-distance original-text edited-text)))
          (<span class="org-keyword">setq</span> sum-original (+ sum-original (length original-text)))
          (<span class="org-keyword">setq</span> sum-dist (+ sum-dist dist))
          (list
           (length original-text)
           (length edited-text)
           dist))))
    (emacsconf-get-talk-info))
   <span class="org-highlight-quoted-quote">'</span>(hline)
   (list
    (list
     sum-original
     (format <span class="org-string">"%d%%"</span> (/ (* 100.0 sum-dist) sum-original))
     sum-dist))))
</pre>
</div>

</details>

<p>
To make it easier to correct subtitle timing, I
added a few ways to tweak subtitle timing for a
region of subtitles.
</p>

<p>
<b>WhisperX:</b> <code>subed-word-data-fix-subtitle-timing</code> in
<a href="https://github.com/sachac/subed/blob/main/subed/subed-word-data.el">subed-word-data.el</a> tries to match the word
data from WhisperX against the text of the current
subtitle, using <code>string-distance</code> for approximate
matches. I start at about two words shorter than
what's in the subtitle, and then increase the
number of words taken from the data while the
string distance decreases. I skip the data for
words before the beginning of the first
subtitle in the region.
</p>

<p>
</p><figure><video controls="1" src="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_12.44.23.webm" type="video/webm"><a href="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_12.44.23.webm">Download the video</a></video><figcaption><div>Screencast of subed-word-data-fix-subtitle-timing</div></figcaption></figure>
<p></p>

<p>
<b>Aeneas:</b> <code>subed-align-region</code> uses Aeneas to realign the
subtitles from the region using the section of the
media file between the start of the first subtitle
and the end of the last subtitle in the region.
When I notice that the times are off, I <a href="https://sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/">skim the
subtitles</a> (or just skim them visually) to find the
last well-timed subtitle. Then I pick a subtitle
that's in the incorrectly-timed section. I use
<code>subed-mpv-jump-to-current-subtitle</code> (<code>M-j</code>) to
jump to that position, and I play back that
subtitle. It usually belongs to some text further
down, so I reset to that position with <code>M-j</code>, set
my mark before the previous correctly-timed
subtitle with <code>C-SPC</code>, go to the subtitle that
matches that time, and use
<code>subed-copy-player-pos-to-start-time</code> (<code>C-c [</code>) to
set the proper timestamp. Then I can go to the
previous incorrectly-timed subtitle and use <code>M-x
subed-align-region</code>. This runs the Aeneas forced
alignment tool using just the subtitle text in the
region, the starting timestamp of the first
subtitle, and the ending timestamp of the last
subtitle, making it easy to adjust that section.
<code>subed-align-region</code> is in <a href="https://github.com/sachac/subed/blob/main/subed/subed-align.el">subed-align.el</a>
</p>

<p>
<b>Retiming by pressing SPC after each subtitle:</b> As
an experiment, I've also added a
<code>subed-retime-subtitles</code> command that plays
through the subtitles so that I can press <code>SPC</code>
when the next subtitle starts. It begins with the
current subtitle and stops when you press a key
that's not in its keymap.
</p>

<p>
</p><figure><video controls="1" src="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_13.06.47.webm" type="video/webm"><a href="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_13.06.47.webm">Download the video</a></video><figcaption><div>Screencast with audio: subed-retime-subtitles</div></figcaption></figure>
<p></p>

<p>
<b>Manual adjustments</b>: For fine-tuning timestamps,
I usually turn on <code>subed-waveform-show-all</code> and
shift-left-click
(<code>subed-waveform-set-start-and-copy-to-previous</code>)
or shift-right-click
(<code>subed-waveform-set-stop-and-copy-to-next</code>) on
the waveforms because it's easy to see where the
words and pauses are. When I'm not sure, I can use
middle-click (<code>subed-waveform-play-sample</code>) to
play part of the file without changing the
subtitle start/stop or the MPV playback position.
</p>

<p>
</p><figure><video controls="1" src="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_12.54.08.webm" type="video/webm"><a href="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_12.54.08.webm">Download the video</a></video><figcaption><div>Screencast with audio of using the waveforms</div></figcaption></figure>
<p></p>

<p>
I'm experimenting with adding repeating
keybindings. There was a
<code>subed-mpv-frame-step-map</code> that was bound to <code>C-c
C-f</code>, so I've renamed it to <code>subed-mpv-control</code>,
added a whole bunch of keybindings to the
<code>subed-mpv-control-map</code> based on MPV and Aegisub
shortcuts, and made it a repeating transient map.
</p>

<p>
</p><figure><video controls="1" src="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_13.02.52.webm" type="video/webm"><a href="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_13.02.52.webm">Download the video</a></video><figcaption><div>Screencast with audio, experimenting with the mpv control map</div></figcaption></figure>
<p></p>

<p>
<b>Ideas for next steps</b>:
</p>

<p>
Gotta get the hang of all these new capabilities
through practice! =)
</p>

<p>
To make my <code>subed-align-region</code> workflow even more
convenient, I could use <code>completing-read</code> to let
me select a future subtitle with completion, and
then Emacs could automatically fix the subtitle
start time, go to the previous subtitle, and
realign the region.
</p>

<p>
Also, I think switching the waveforms from overlays to
text properties could be a good idea. When I cut
text, the overlays get left behind, but I want the
waveforms to go away too.
</p>

<p>
While writing this post and fiddling with <a href="https://github.com/sachac/subed">subed</a>, I
ended up adding a bunch of keybindings and a menu.
I figured this was as good a time as any to stop
tweaking it and finally publish. (But it's fun!
Just one more idea&#x2026;)
</p>
<div><a href="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/index.org">View org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2024%2F12%2Fsubed-el-tweaking-subtitle-times%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>Checking caption timing by skimming with Emacs Lisp or JS</title>
		<link>https://sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Sun, 17 Nov 2024 12:29:02 GMT</pubDate>
    <category>js</category>
<category>emacs</category>
<category>subed</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/</guid>
		<description><![CDATA[<p>
Sometimes automatic subtitle timing tools like
<a href="https://www.readbeyond.it/aeneas/">Aeneas</a> can get confused by silences, extraneous
sounds, filler words, mis-starts, and text that
I've edited out of the raw captions for easier
readability. It's good to quickly check each
caption. I used to listen to captions at 1.5x
speed, watching carefully as each caption
displayed. This took a fair bit of time and focus,
so&#x2026; it usually didn't happen. Sampling the first
second of each caption is faster and requires a
little less attention.
</p>
<div id="outline-container-orgdc21377" class="outline-2">
<h3 id="orgdc21377">Skimming with subed.el</h3>
<div class="outline-text-2" id="text-orgdc21377">
<p>
Here's a function that I wrote to play the first
second of each subtitle.
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span class="org-keyword">defvar</span> <span class="org-variable-name">my-subed-skim-msecs</span> 1000 <span class="org-doc">"Number of milliseconds to play when skimming."</span>)
(<span class="org-keyword">defun</span> <span class="org-function-name">my-subed-skim-starts</span> ()
  (<span class="org-keyword">interactive</span>)
  (subed-mpv-unpause)
  (subed-disable-loop-over-current-subtitle)
  (<span class="org-keyword">catch</span> <span class="org-highlight-quoted-quote">'</span><span class="org-constant">done</span>
    (<span class="org-keyword">while</span> (not (eobp))
      (subed-mpv-jump-to-current-subtitle)
      (<span class="org-keyword">let</span> ((ch
             (read-char <span class="org-string">"(q)uit? "</span> nil (/ my-subed-skim-msecs 1000.0))))
        (<span class="org-keyword">when</span> ch
          (<span class="org-keyword">throw</span> <span class="org-highlight-quoted-quote">'</span><span class="org-constant">done</span> t)))
      (subed-forward-subtitle-time-start)
      (<span class="org-keyword">when</span> (<span class="org-keyword">and</span> subed-waveform-minor-mode
                 (not subed-waveform-show-all))
        (subed-waveform-refresh))
      (recenter)))
  (subed-mpv-pause))
</pre>
</div>


<p>
Now I can read the lines as the subtitles play,
and I can press any key to stop so that I can fix
timestamps.
</p>
</div>
</div>
<div id="outline-container-org8f02356" class="outline-2">
<h3 id="org8f02356">Skimming with Javascript</h3>
<div class="outline-text-2" id="text-org8f02356">
<p>
I also want to check the times on the Web in case
there have been caching issues. Here's some
Javascript to skim the first second of each cue in
the first text track for a video, with some code
to make it easy to process the first video in the
visible area.
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp">function getVisibleVideo() {
  const videos = document.querySelectorAll(<span class="org-highlight-quoted-quote">'</span><span class="org-constant">video</span><span class="org-highlight-quoted-quote">'</span>)<span class="org-comment-delimiter">;</span>
  for (const video of videos) {
    const rect = video.getBoundingClientRect()<span class="org-comment-delimiter">;</span>
    if (
      rect.top &gt;= 0 <span class="org-type">&amp;&amp;</span>
      rect.left &gt;= 0 <span class="org-type">&amp;&amp;</span>
      rect.bottom &lt;= (window.innerHeight || document.documentElement.clientHeight) <span class="org-type">&amp;&amp;</span>
      rect.right &lt;= (window.innerWidth || document.documentElement.clientWidth)
    ) <span class="org-warning">{</span>
      return video<span class="org-comment-delimiter">;</span>
    }
  }
  return null<span class="org-comment-delimiter">;</span>
}

async function skimVideo(video=getVisibleVideo(), msecs=1000) {
  // Get the first text track (assumed to be captions/subtitles)
  const textTrack = video.textTracks[0]<span class="org-comment-delimiter">;</span>
  if (!textTrack) return<span class="org-comment-delimiter">;</span>
  const remaining = [...textTrack.cues].filter((cue) =&gt; cue.endTime &gt;= video.currentTime)<span class="org-comment-delimiter">;</span>
  video.play()<span class="org-comment-delimiter">;</span>
  // Play the first 1 second of each visible subtitle
  for (<span class="org-keyword">let</span> i = 0<span class="org-comment-delimiter">; </span><span class="org-comment">i &lt; remaining.length &amp;&amp; !video.paused; i++) {</span>
    video.currentTime = remaining[i].startTime<span class="org-comment-delimiter">;</span>
    await new Promise((resolve) =&gt; setTimeout(resolve, msecs))<span class="org-comment-delimiter">;</span>
  }
}
</pre>
</div>


<p>
Then I can call it with <code>skimVideo();</code>. Actually,
in our backstage area, it might be useful to add a
Skim button so that I can skim things from my
phone.
</p>


<div class="org-src-container">
<pre class="src src-js"><span class="org-keyword">function</span> <span class="org-function-name">handleSkimButton</span>(<span class="org-variable-name">event</span>) {
   <span class="org-keyword">const</span> <span class="org-variable-name">vid</span> = event.target.closest(<span class="org-string">'.vid'</span>).querySelector(<span class="org-string">'video'</span>);
   skimVideo(vid);
 }

document.querySelectorAll(<span class="org-string">'video'</span>).forEach((vid) =&gt; {
   <span class="org-keyword">const</span> <span class="org-variable-name">div</span> = document.createElement(<span class="org-string">'div'</span>);
   <span class="org-keyword">const</span> <span class="org-variable-name">skim</span> = document.createElement(<span class="org-string">'button'</span>);
   skim.textContent = <span class="org-string">'Skim'</span>;
   div.appendChild(skim);
   vid.parentNode.insertBefore(div, vid.nextSibling);
   skim.addEventListener(<span class="org-string">'click'</span>, handleSkimButton);
});
</pre>
</div>

</div>
</div>
<div id="outline-container-orgf22ecd7" class="outline-2">
<h3 id="orgf22ecd7">Results</h3>
<div class="outline-text-2" id="text-orgf22ecd7">
<p>
How much faster is it this way?
</p>

<details><summary>Some code to help figure out the speedup</summary>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span class="org-keyword">-let*</span> ((files (directory-files <span class="org-string">"~/proj/emacsconf/2024/cache"</span> t <span class="org-string">"&#45;&#45;main\\.vtt"</span>))
        ((count-subs sum-seconds)
         (-unzip (mapcar
                  (<span class="org-keyword">lambda</span> (file)
                    (list
                     (length (subed-parse-file file))
                     (/ (compile-media-get-file-duration-ms
                         (concat (file-name-sans-extension file) <span class="org-string">".webm"</span>)) <span class="org-warning">1000.0)))</span>
                  files)))
        (total-seconds (-reduce <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">+</span> sum-seconds))
        (total-subs (-reduce <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">+</span> count-subs)))
  (format <span class="org-string">"%d files, %.1f hours, %d total captions, speed up of %.1f"</span>
          (length files)
          (/ total-seconds 3600.0)
          total-subs
          (/ total-seconds total-subs)))
</pre>
</div>

</details>

<p>
It looks like for EmacsConf talks where we
typically format captions to be one long line each
(&lt; 60 characters), this can be a speed-up of about
4x compared to listening to the video at normal
speed. More usefully, it's different enough to get
my brain to do it instead of putting it off.
</p>

<p>
Most of the automatically-generated timestamps are
fine. It's just a few that might need tweaking.
It's nice to be able to skim them with fewer
keystrokes.
</p>
</div>
</div>
<div><a href="https://sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/index.org">View org source for this post</a></div>

<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2024%2F11%2Fchecking-caption-timing-by-skimming-with-emacs-lisp-or-js%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item>
	</channel>
</rss>