<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>video-processing on S Anand</title>
    <link>https://www.s-anand.net/blog/tag/video-processing/</link>
    <description>Recent content in video-processing on S Anand</description>
    <generator>Hugo -- 0.164.0</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 02 Aug 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.s-anand.net/blog/tag/video-processing/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Things I Learned - 02 Aug 2026</title>
      <link>https://www.s-anand.net/blog/things-i-learned-02-aug-2026/</link>
      <pubDate>Sun, 02 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-02-aug-2026/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I continue to be amazed at how efficient video codecs are compared with animated image formats. When compressing 38 PNGs, the final WEBM was smaller than many of the &lt;em&gt;individual&lt;/em&gt; PNGs!
&lt;ul&gt;
&lt;li&gt;2343k: &lt;code&gt;magick -delay 50 -loop 0 file-*.png file.gif&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;398k: &lt;code&gt;magick -delay 50 -loop 0 file-*.png file.avif&lt;/code&gt; (slow)&lt;/li&gt;
&lt;li&gt;284k: &lt;code&gt;magick -delay 50 -loop 0 file-*.png file.webp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;82k: &lt;code&gt;ffmpeg -framerate 2 -i file-%03d.png -c:v libvpx-vp9 -pix_fmt yuva420p file.webm&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://shawnsmucker.substack.com/p/please-use-ai&#34;&gt;Please use AI&lt;/a&gt; by Shawn Smucker is the best guide I&amp;rsquo;ve read about where &lt;em&gt;NOT&lt;/em&gt; to use AI. I need to be more mindful of this.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developers.openai.com/api/docs/models/gpt-transcribe&#34;&gt;gpt-transcribe&lt;/a&gt; is released at 0.45 cents / minute or 27c / hour. &lt;!-- https://chatgpt.com/c/6a6d46c1-c580-83ec-a164-0f0bf46f87ce --&gt;
Gemini 3.6 Flash costs about the same ~27c.
Gemini 3 Flash costs ~15c and that&amp;rsquo;s what I use today.
Gemini 3.5 Flash Lite costs ~6c / hour but it follows my instructions very poorly.
To benchmark this, I just re-run my &lt;a href=&#34;https://github.com/sanand0/scripts/blob/fbd7958bf40da02bcc7bf8c920edc45235c271cd/transcribe_calls.py#L34&#34;&gt;&lt;code&gt;transcribe_calls.py&lt;/code&gt;&lt;/a&gt; script
on a recent conversation (that I remember well) with a different model to see if it&amp;rsquo;s clearly better or worse.
No fancy benchmarking. Creating / maintaining &lt;a href=&#34;https://pythonicvarun.github.io/llm-audio-transcription-benchmark/&#34;&gt;formal benchmarks&lt;/a&gt; isn&amp;rsquo;t always worth it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://astral.sh/blog/ruff-v0.16.0&#34;&gt;ruff 0.16&lt;/a&gt; is out and has a &lt;a href=&#34;https://simonwillison.net/2026/Jul/25/ruff/&#34;&gt;350+ new default rules&lt;/a&gt;. I mean, who would check that &lt;a href=&#34;https://docs.astral.sh/ruff/rules/cached-instance-method/&#34;&gt;&lt;code&gt;functools.cache&lt;/code&gt; on instance methods has a memory leak&lt;/a&gt;? But its output is so agent-friendly that agents would just fix these on the fly anyway, so it &lt;em&gt;does&lt;/em&gt; make sense. It&amp;rsquo;s another step towards code-writing becoming less accessible to humans.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm install --no-package-lock&lt;/code&gt; installs packages ignoring and without creating / updating &lt;code&gt;package-lock.json&lt;/code&gt;. Useful for dev environments.&lt;/li&gt;
&lt;li&gt;Astral has published &lt;a href=&#34;https://wheels.astral.sh/&#34;&gt;prebuilt GPU wheels&lt;/a&gt; for Flash Attention, vLLM, PyCUDA, and many others.&lt;/li&gt;
&lt;li&gt;One characteristic of good benchmarks is that they are easy to verify. I see a lot of comparisons of Fable vs Opus by having them generate 3D worlds (e.g. threejs, Blender, melt) - something that&amp;rsquo;s not trivial for agents, but evaluatable at a glance.&lt;/li&gt;
&lt;li&gt;Maybe it makes sense to open source the intermediate steps in ALL knowledge work, to make AI as good at it as with code? &lt;a href=&#34;https://x.com/i/status/2082163285588107752&#34;&gt;Arvind Narayanan&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;Open-source software and culture is a historical accident. We take it for granted that not only are the outputs of software engineers’ creative work available publicly, but so are all of the intermediate steps (specifications, plans, mockups), tacit knowledge (StackOverflow, documentation culture), detailed process traces (issues, pull requests, bug fixes, code reviews), collaboration records (version control, project boards), and more broadly a culture of learning in public. This level of explicit description would be completely alien in most professions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;I asked ChatGPT &amp;ldquo;How am I doing? Objectively&amp;hellip;&amp;rdquo; and it listed what I knew, but is now obvious to AI agents: Impact and closure are my weak areas, not capability and habits. What&amp;rsquo;s improved, though, is assetization / reuse. (Opus 5 answered this poorly, listing metrics around my posts, talks, skills, transcripts, likes, etc. &lt;!-- https://chatgpt.com/c/6a6c495d-9938-83ec-814a-3c48d9ef466e + https://claude.ai/chat/aad83bd6-aeca-4afa-9580-36e89b7ac4cf --&gt;&lt;/li&gt;
&lt;li&gt;Oh, so most AI layoffs were not AI layoffs. Just AI as an excuse. Also, &amp;ldquo;When we did this analysis, it revealed three things as the real bottlenecks (1) deciding and specifying what to build, (2) verifying and being accountable for what is delivered, and (3) the deep human understanding - of the codebase, the business, and the environment - required to carry out both of these.&amp;rdquo; &lt;a href=&#34;https://www.normaltech.ai/p/why-ai-hasnt-replaced-software-engineers&#34;&gt;Why AI hasn&amp;rsquo;t replaced software engineers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;So, Anthropic models tried to get money to pay for a phone to get an email ID to upload to PyPi to publish a malware to hack a system. This actually is&amp;hellip; concerning, even to me. &lt;a href=&#34;https://simonwillison.net/2026/Jul/30/three-real-world-incidents/&#34;&gt;Simon Willison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Given the &lt;a href=&#34;https://work.turing.com/jobs&#34;&gt;jobs Turing Talent is hiring for&lt;/a&gt; on behalf of AI companies: &lt;!-- https://chatgpt.com/c/6a6b2a9d-b5d0-83ec-8dd7-6c6e2709116f + https://claude.ai/chat/399736bc-f6bd-4e6e-841b-1c8fe4e99f2b --&gt;
&lt;ul&gt;
&lt;li&gt;Gemini is focusing on personalization, i.e. how it can use &lt;em&gt;your&lt;/em&gt; data (emails, documents, photos, calendar, drive, meet, chat, etc.) better. They&amp;rsquo;re not outsourcing this to third-world countries. &lt;a href=&#34;https://gemini.google/overview/agent/spark/&#34;&gt;Gemini Spark&lt;/a&gt; seems to be a driver here.&lt;/li&gt;
&lt;li&gt;Multi-lingual business reasoning will likely improve soon, given the focus.&lt;/li&gt;
&lt;li&gt;Software engineering, data science, science, professional domains (medical, legal, finance), and media (transcription, synthesis, annotations) are the other major categories.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AES can now be decrypted 200-800x faster by &lt;a href=&#34;https://x.com/AnthropicAI/status/2082153302704193861&#34;&gt;Mythos&lt;/a&gt;. The research cost $100,000. No practical implications today, but a trend to watch.&lt;/li&gt;
&lt;li&gt;When blinking, our visual processing is suppressed so we don&amp;rsquo;t see the darkness and imagine the world as continuous. &lt;a href=&#34;https://x.com/i/status/2081388445197389993&#34;&gt;Prof V Balakrishnan&lt;/a&gt; &lt;!-- https://chatgpt.com/c/6a681b2d-a734-83ec-a03d-b21fa387d2e3 --&gt;&lt;/li&gt;
&lt;li&gt;Some countries have fought wars &lt;em&gt;against&lt;/em&gt; independence. The &lt;a href=&#34;https://en.wikipedia.org/wiki/1976_Mahoran_Comoros_referendum&#34;&gt;Mayotte referendum&lt;/a&gt; let them stay a French colony. &lt;a href=&#34;https://en.wikipedia.org/wiki/1997_Anjouan_independence_referendum&#34;&gt;Anjouan in 1997&lt;/a&gt; fought for France to take them back. &lt;a href=&#34;https://www.aahsanguilla.com/anguilla-revolution-1967.html&#34;&gt;Anguilla in 1967&lt;/a&gt; fought and stayed a British colony. &lt;!-- https://chatgpt.com/c/6a673ca5-e79c-83ec-b7ca-69bd86e63006 --&gt;&lt;/li&gt;
&lt;li&gt;Modern fonts have &amp;ldquo;features&amp;rdquo; or styles that you can enable on VS Code via &lt;code&gt;editor.fontLigatures&lt;/code&gt;. For example, here are &lt;a href=&#34;https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets&#34;&gt;FiraCode styles&lt;/a&gt; and &lt;a href=&#34;https://monaspace.githubnext.com/#code-ligatures&#34;&gt;Monaspace styles&lt;/a&gt;. My current FiraCode config has: &lt;code&gt;&amp;quot;editor.fontLigatures&amp;quot;: &amp;quot;&#39;calt&#39;, &#39;liga&#39;, &#39;ss01&#39;, &#39;ss02&#39;, &#39;ss03&#39;, &#39;ss04&#39;, &#39;ss05&#39;, &#39;ss06&#39;, &#39;ss07&#39;, &#39;ss08&#39;, &#39;ss09&#39;, &#39;ss10&#39;, &#39;cv02&#39;, &#39;cv06&#39;, &#39;cv14&#39;, &#39;cv16&#39;, &#39;cv18&#39;, &#39;cv24&#39;, &#39;cv25&#39;, &#39;cv28&#39;, &#39;cv29&#39;, &#39;cv30&#39;, &#39;cv31&#39;, &#39;cv32&#39;, &#39;zero&#39;&amp;quot;&lt;/code&gt; - and the only one I&amp;rsquo;m debating is &lt;code&gt;ss10&lt;/code&gt; in FiraCode, which connects the &lt;code&gt;f&lt;/code&gt; with &lt;code&gt;i&lt;/code&gt; and &lt;code&gt;l&lt;/code&gt; in &lt;code&gt;fi&lt;/code&gt; and &lt;code&gt;fl&lt;/code&gt;. But these look nice in Monaspace at &lt;code&gt;&amp;quot;editor.fontWeight&amp;quot;: &amp;quot;300&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://platform.claude.com/docs/en/about-claude/models/whats-new-opus-5#thinking-on-by-default&#34;&gt;Opus 5 has thinking turned on by default&lt;/a&gt;. This can lead to significantly higher API costs for the unsuspecting. A task that should&amp;rsquo;ve cost me $3 ended up at $9 on Opus 5.&lt;/li&gt;
&lt;li&gt;I installed the &lt;a href=&#34;https://extensions.gnome.org/extension/9231/claude-code-usage/&#34;&gt;Claude Code Usage&lt;/a&gt; widget to further my token psychosis. Now all I need is enough tasks to use those tokens.&lt;/li&gt;
&lt;li&gt;Stacking triggers of any kind helps. For example, I just updated my tabnotes repo to fix a bug while restoring after Edge crashes. That&amp;rsquo;s because I had a visible and immediate need. But I also used this to fix other features I wanted, like loading tabnotes as a page instead of a sidepanel. One trigger led to a related feature getting implemented. This requires a bucket of related ideas to be ready, so a good practice is to &lt;strong&gt;jot down annoying things&lt;/strong&gt;. &lt;!-- https://claude.ai/chat/41501fc8-dd10-4ae9-9cf4-2d883396180a --&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Maybe that is what the “research mathematicians” of the future should do: make a selection from a vast sea of AI-generated mathematics and write a book about it in such a way that other mathematicians can read the book and feel the kind of enrichment that we feel when we get to grips with an area of mathematics.&amp;rdquo; - &lt;a href=&#34;https://gowers.wordpress.com/2026/07/26/thoughts-about-the-leiden-declaration/&#34;&gt;Thoughts about the Leiden Declaration, Timothy Gowers&lt;/a&gt;. An interesting perspective. We&amp;rsquo;ve seen this in the past when something becomes abundant - like chemists&amp;rsquo; discoveries organized by Mendeleev, drug makers&amp;rsquo; evidence organized by Cochrane, lawyers&amp;rsquo; case laws commented by Blackstone and organized by West, knowledge prioritized and organized by Wikipedia, hip-hop DJs, Linnaeus&amp;rsquo; taxonomy, etc. &lt;!-- https://chatgpt.com/c/6a66cc30-729c-83ec-8ba3-f38d27e8bc3e + https://claude.ai/chat/9d6caa91-dfb4-49bb-928e-9d1300c24a6d --&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>How does Gemini process videos?</title>
      <link>https://www.s-anand.net/blog/how-does-gemini-process-videos/</link>
      <pubDate>Thu, 24 Oct 2024 08:47:21 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/how-does-gemini-process-videos/</guid>
      <description>&lt;p&gt;The Gemini documentation is clear:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The File API service extracts image frames from videos at 1 frame per second (FPS) and audio at 1Kbps, single channel, adding timestamps every second. These rates are subject to change in the future for improvements in inference.&lt;/p&gt;
&lt;p&gt;Note: The details of fast action sequences may be lost at the 1 FPS frame sampling rate. Consider slowing down high-speed clips for improved inference quality.&lt;/p&gt;
&lt;p&gt;Individual frames are 258 tokens, and audio is 32 tokens per second. With metadata, each second of video becomes ~300 tokens, which means a 1M context window can fit slightly less than an hour of video.&lt;/p&gt;
&lt;p&gt;To ask questions about time-stamped locations, use the format MM:SS, where the first two digits represent minutes and the last two digits represent seconds.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But on this &lt;a href=&#34;https://sub.thursdai.news/p/thursdai-oct-17-robots-rockets-and&#34;&gt;ThursdAI episode: Oct 17 - Robots, Rockets, and Multi Modal Mania&amp;hellip;&lt;/a&gt;, at 1:00:50, &lt;a href=&#34;https://x.com/hrishioa/&#34;&gt;Hrishi&lt;/a&gt; says&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don&amp;rsquo;t think it&amp;rsquo;s a series of images anymore because when I talk to the model and try to get some concept of what it&amp;rsquo;s perceiving, it&amp;rsquo;s no longer a series of images.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If that&amp;rsquo;s the case, it&amp;rsquo;s a &lt;strong&gt;huge&lt;/strong&gt; change. So I tested it with this video.&lt;/p&gt;
&lt;div class=&#34;video-embed&#34;&gt;&lt;iframe src=&#34;https://www.youtube.com/embed/Dv8KON7WQYA&#34; title=&#34;YouTube video&#34; loading=&#34;lazy&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;This video has 20 numbers refreshing at 4 frames per second.&lt;/p&gt;
&lt;p&gt;When I upload it to &lt;a href=&#34;https://aistudio.google.com/&#34;&gt;AI Studio&lt;/a&gt;, it takes 1,316 tokens. This is close enough to 258 tokens per image (no audio). So I&amp;rsquo;m partly convinced that Gemini still processing videos at 1 frame per second.&lt;/p&gt;
&lt;p&gt;Then, I asked it to &lt;code&gt;Extract all numbers in the video&lt;/code&gt; using Gemini 1.5 Flash 002 as well as Gemini 1.5 Flash 8b. In both cases, the results were: 2018, 85, 47, 37, 38.&lt;/p&gt;
&lt;p&gt;These are frames 2, 6, 10, 14, 18 (out of 20). So, &lt;strong&gt;clearly&lt;/strong&gt; Gemini is still sampling at about 1 frame per second, starting somewhere between 0.25 or 0.5 seconds.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Tools to publish annotated talks from videos</title>
      <link>https://www.s-anand.net/blog/tools-to-publish-annotated-talks-from-videos/</link>
      <pubDate>Sun, 20 Oct 2024 07:22:57 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/tools-to-publish-annotated-talks-from-videos/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Tools to publish annotated talks from videos&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/maxresdefault.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/arun-tangirala-1712444/&#34;&gt;Arun Tangirala&lt;/a&gt; and I webinared on &amp;ldquo;AI in Education&amp;rdquo; yesterday.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;(PS: &amp;quot;Webinared&amp;quot; is not a word. But &amp;quot;verbing weirds language&amp;quot;.)&#34; loading=&#34;lazy&#34; src=&#34;https://picayune.uclick.com/comics/ch/1993/ch930125.gif&#34;&gt;&lt;/p&gt;
&lt;p&gt;This post isn&amp;rsquo;t about the webinar, which went on for an hour and was good fun.&lt;/p&gt;
&lt;div class=&#34;video-embed&#34;&gt;&lt;iframe src=&#34;https://www.youtube.com/embed/fPvhDOyUPc8&#34; title=&#34;YouTube video&#34; loading=&#34;lazy&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;This post isn&amp;rsquo;t for my preparation for the webinar, which happened frantically 15 minutes before it started.&lt;/p&gt;
&lt;p&gt;This post is about how I created the annotated talk at &lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar&#34;&gt;https://github.com/sanand0/ai-in-education-webinar&lt;/a&gt; (inspired by &lt;a href=&#34;https://simonwillison.net/2023/Aug/6/annotated-presentations/&#34;&gt;Simon Willison&amp;rsquo;s annotated presentations&lt;/a&gt; process) &amp;ndash; a post-processing step that took ~3 hours &amp;ndash; and the tools I used for this.&lt;/p&gt;
&lt;h4 id=&#34;scrape-the-comments&#34;&gt;Scrape the comments&lt;/h4&gt;
&lt;p&gt;The Hindu used &lt;a href=&#34;https://streamyard.com/&#34;&gt;StreamYard&lt;/a&gt;. It web-based and has a comments section. I used JS in the &lt;a href=&#34;https://developer.chrome.com/docs/devtools/console&#34;&gt;DevTools Console&lt;/a&gt; to scrape. Roughly, &lt;code&gt;$$(&amp;quot;.some-class-name&amp;quot;).map(d =&amp;gt; d.textContent)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;But the comments are not all visible together. As you scroll, newer/older comments are loaded. So I needed to use my favorite technique: &lt;a href=&#34;https://www.s-anand.net/blog/cyborg-scraping/&#34;&gt;Cyborg Scraping&lt;/a&gt;. During Q&amp;amp;A, I kept scrolling to the bottom and ran:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// One-time set-up
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;messages&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Run every now and then after scrolling to the bottom
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Stores all messages without duplication
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;$$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.some-class-name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;textContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Finally, copy the messages as a JSON array to the clipboard
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;copy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([...&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I used VS Code&amp;rsquo;s regular expression search &lt;code&gt;^\d\d:\d\d (AM|PM)$&lt;/code&gt; to find the timestamps and split the name, time, and comments into columns. &lt;a href=&#34;https://code.visualstudio.com/docs/editor/codebasics#_multiple-selections-multicursor&#34;&gt;Multiple-cursors&lt;/a&gt; all the way. Then I pasted it in Excel to convert it to Markdown. I added this in the &lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar?tab=readme-ov-file#comments&#34;&gt;Comments in the Chat&lt;/a&gt; section.&lt;/p&gt;
&lt;p&gt;(&lt;strong&gt;Excel&lt;/strong&gt; to convert to Markdown? Yeah. My formula is below.)&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/excel-comments.webp&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;transcribe-the-video&#34;&gt;Transcribe the video&lt;/h4&gt;
&lt;p&gt;I downloaded &lt;a href=&#34;https://youtu.be/fPvhDOyUPc8&#34;&gt;the video&lt;/a&gt; using &lt;a href=&#34;https://github.com/yt-dlp/yt-dlp&#34;&gt;yt-dlp&lt;/a&gt;, which I find the most robust tool for YouTube downloads.&lt;/p&gt;
&lt;p&gt;I used &lt;code&gt;ffmpeg.exe -i webinar.mp4 -b:a 32k -ac 1 -ar 22050 webinar.mp3&lt;/code&gt; to convert the video to audio. I use these settings for voice (not music) to get a fairly small MP3 file. I should have used Opus, which is much smaller. I&amp;rsquo;ll do that next.)&lt;/p&gt;
&lt;p&gt;Groq recently added &lt;a href=&#34;https://groq.com/whisper-large-v3-turbo-now-available-on-groq-combining-speed-quality-for-speech-recognition/&#34;&gt;Whisper Large v3&lt;/a&gt; (which is better than most earlier models on transcription.) So I could just go to the &lt;a href=&#34;https://console.groq.com/playground&#34;&gt;Groq playground&lt;/a&gt; and upload the MP3 file to get a transcript in a few seconds.&lt;/p&gt;
&lt;h4 id=&#34;add-images-to-the-transcript&#34;&gt;Add images to the transcript&lt;/h4&gt;
&lt;p&gt;I wrote a tool, &lt;a href=&#34;https://github.com/gramener/videoscribe&#34;&gt;VideoScribe&lt;/a&gt; (WIP), to make transcription and image insertion easy. It uses &lt;code&gt;ffmpeg -i webinar.mp4 -vf select=&#39;key&#39;,showinfo -vsync vfr -compression_level 10 &amp;quot;%04d.jpg&amp;quot;&lt;/code&gt; to extract all keyframes (images with major changes) from the video and inserts them into the right spots in the transcript.&lt;/p&gt;
&lt;p&gt;I picked 36 out of the ~700 that were generated as representing new slides, questions, or key moments and exported it as Markdown. I also used VS Code &lt;a href=&#34;https://code.visualstudio.com/docs/editor/codebasics#_multiple-selections-multicursor&#34;&gt;Multiple Cursors&lt;/a&gt; to link the images to the right timestamp on YouTube.&lt;/p&gt;
&lt;h4 id=&#34;clean-up-the-transcript&#34;&gt;Clean up the transcript&lt;/h4&gt;
&lt;p&gt;Up to here was mostly automated. This step took me an hour, though. I copied chunks of transcripts, passed it to Claude 3.5 Sonnet via Cursor with this prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Clean up this webinar transcript segment. Make minimal modifications fixing spelling, grammar, punctuation, adding &amp;ldquo;quotes&amp;rdquo; where required, and combining into logical paragraphs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is what gave me the bulk of the &lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar#transcript&#34;&gt;webinar transcript&lt;/a&gt;. (I&amp;rsquo;d like to automate this next.)&lt;/p&gt;
&lt;h4 id=&#34;extract-tools&#34;&gt;Extract tools&lt;/h4&gt;
&lt;p&gt;Many audience members asked for a list of tools we mentioned. So I passed ChatGPT the transcript and asked:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;List all tools mentioned in this webinar&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It listed 12 tools, but I know enough to be sceptical. So&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Anand&lt;/strong&gt;: Were any tools missed?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;: No, the list covers all the tools mentioned in the webinar as per the transcript. If you noticed any specific tool that I missed, please let me know.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anand&lt;/strong&gt;: There WERE a few tools missed. Look closely. (I was bluffing, BTW.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;: You&amp;rsquo;re right. Upon closer review, here are the additional tools mentioned:&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anand&lt;/strong&gt;: There are a few more that you missed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;: Got it. Here’s a revised list that should include all the tools mentioned:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That generated the &lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar#tools&#34;&gt;Tools mentioned in the webinar&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;questions&#34;&gt;Questions&lt;/h4&gt;
&lt;p&gt;There were several questions in the comments. I passed them into my &lt;a href=&#34;https://colab.research.google.com/drive/19uYpWrvc1FIAYo2FVKwsLgFGntmYnd_y&#34;&gt;Topic Naming&lt;/a&gt; Colab notebook which clusters them into similar questions (I asked it to pick 40 subtopics) and then further grouped them into higher level topics, and gave names to all of these.&lt;/p&gt;
&lt;p&gt;That created the &lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar#questions&#34;&gt;list of questions people asked&lt;/a&gt;, in a categorized way.&lt;/p&gt;
&lt;h4 id=&#34;notebooklm&#34;&gt;NotebookLM&lt;/h4&gt;
&lt;p&gt;Next, I pasted the transcript into &lt;a href=&#34;https://notebooklm.google.com/notebook/44782cbd-a954-4f3b-9b32-952d68553498&#34;&gt;NotebookLM&lt;/a&gt; and repeated what our classmate &lt;a href=&#34;https://www.linkedin.com/in/raj-vadigepalli-69ba3b27/&#34;&gt;Rajanikanth&lt;/a&gt; said he did.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;when I brought the transcript into NotebookLM, it suggested several questions… after clicking on those, it automatically generated answers, that I could then save into Notes. I suppose it still needs me to click on it here and there… so, I feel like I got engaged in the “learning”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So I &amp;ldquo;clicked here and there&amp;rdquo; and generated:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar#briefing-document&#34;&gt;A Briefing Document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar#detailed-overview&#34;&gt;A Detailed Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar#faq&#34;&gt;An FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar#study-guide&#34;&gt;A Study Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;hellip; and most importantly, a &lt;a href=&#34;https://notebooklm.google.com/notebook/44782cbd-a954-4f3b-9b32-952d68553498/audio&#34;&gt;very engaging 15 minute podcast&lt;/a&gt;, which is what NotebookLM is famous for.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;a href=&#34;https://blog.google/technology/ai/notebooklm-update-october-2024/&#34;&gt;NotebookLM now lets you customize your podcast&lt;/a&gt;. I tried it, saying &amp;ldquo;Focus on what students and teachers can take away practically. Focus on educating rather than entertaining.&amp;rdquo; That generated a podcast that, after 5 seconds of listening, felt slightly less entertaining (duh!) so I reverted to the original.&lt;/p&gt;
&lt;h4 id=&#34;publishing&#34;&gt;Publishing&lt;/h4&gt;
&lt;p&gt;I usually publish static content as Markdown on GitHub Pages. The entire content was pushed to &lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar&#34;&gt;https://github.com/sanand0/ai-in-education-webinar&lt;/a&gt; with GitHub Pages enabled.&lt;/p&gt;
&lt;p&gt;I also created a simple &lt;a href=&#34;https://github.com/sanand0/ai-in-education-webinar&#34;&gt;index.html&lt;/a&gt; that uses &lt;a href=&#34;https://docsify.js.org/&#34;&gt;Docsify&lt;/a&gt; to convert the Markdown to HTML. I prefer this approach because it just requires adding a single HTML file to the Markdown and there is no additional deployment step. The UI is quite elegant, too.&lt;/p&gt;
&lt;h4 id=&#34;simplifying-the-workflow&#34;&gt;Simplifying the workflow&lt;/h4&gt;
&lt;p&gt;This entire workflow took me about 3 hours. Most of the manual effort went into:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Picking the right images (15 minutes)&lt;/li&gt;
&lt;li&gt;Cleaning up the transcript (50 minutes)&lt;/li&gt;
&lt;li&gt;Manually editing the question topics (30 minutes)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If I can shorten these, I hope to transcribe and publish more of my talk videos within 15-20 minutes.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Total immersion</title>
      <link>https://www.s-anand.net/blog/total-immersion/</link>
      <pubDate>Mon, 07 Feb 2005 12:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/total-immersion/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.t-immersion.com/&#34;&gt;Total immersion&lt;/a&gt; has technology that lets you create real-time 3-D images on a video feed. It&amp;rsquo;s more impressive to watch one of their &lt;a href=&#34;mms://wm.networkworld-na-central.speedera.net/wm.networkworld-na-central/events/demo04/TotalImmer_pres.wmv&#34;&gt;demos&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prakash&lt;/strong&gt; &lt;em&gt;7 Feb 2005 12:00 pm&lt;/em&gt;:
I think the demos link needs authorizations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S Anand&lt;/strong&gt; &lt;em&gt;7 Feb 2005 12:00 pm&lt;/em&gt;:
Strange&amp;hellip; it seems to work fine for me. What error does it report?&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
  </channel>
</rss>
