Converting an audio recording to summary text via local LLM

As mentioned in my previous post, I had fun installing code to run LLMs locally. This post will be for me: steps to replicate turning the recording into a summary text.

Convert from MP3 to WAV

ffmpeg -i ~/transcripts/meeting-2026-09-08.mp3 -acodec pcm_s16le -ac 1 -ar 16000 ~/transcripts/meeting-2026-09-08.wav

Run the Whisper.cpp code to turn the recording into a transcript

cd ~/src/whisper.cpp

./build/bin/whisper-cli --model models/ggml-small.en.bin --file ~/transcripts/meeting-2026-09-08.wav --language en --output-txt --output-srt --output-file ~/transcripts/meeting-2026-09-08 --print-progress

I created a prompt file for reuse after every planning meeting:

You create accurate meeting notes from a supplied transcript.

Use exactly these Markdown headings:
## Summary
## Decisions
## Action items
## Open questions
## Names, dates, and terms to verify

Only report decisions, owners, dates, and deadlines that the transcript explicitly states.
Do not invent, infer, or "clean up" unclear details. Mark ambiguity as uncertain.

Split the transcript into smaller chunks

rm -rf ~/transcripts/meeting-2026-09-08-chunks

mkdir ~/transcripts/meeting-2026-09-08-chunks

split --lines=400 --numeric-suffixes=1 --suffix-length=3 --additional-suffix=.txt ~/transcripts/meeting-2026-09-08.txt ~/transcripts/meeting-2026-09-08-chunks/chunk-

Prep for the run of the LLM to make summaries

rm -rf ~/transcripts/meeting-2026-09-08-chunk-summaries

mkdir -p ~/transcripts/meeting-2026-09-08-chunk-summaries

And then I got a bash script:

#!/usr/bin/env bash
set -u
shopt -s nullglob

LLAMA="$HOME/src/llama.cpp-rocm57/build-rocm/bin/llama-cli"
MODEL="$HOME/models/gguf/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf"
SYSTEM_PROMPT="$HOME/llm-prompts/meeting-summary-system.txt"
CHUNKS_DIR="$HOME/transcripts/meeting-2026-09-08-chunks"
OUTPUT_DIR="$HOME/transcripts/meeting-2026-09-08-chunk-summaries"

mkdir -p "$OUTPUT_DIR"

for chunk in "$CHUNKS_DIR"/*.txt; do
base=$(basename "$chunk" .txt)
summary="$OUTPUT_DIR/$base.md"
log="$OUTPUT_DIR/$base.log"

printf 'Summarizing %s...\n' "$base"

if "$LLAMA" \
-m "$MODEL" \
--system-prompt-file "$SYSTEM_PROMPT" \
--file "$chunk" \
-c 4096 \
-n 500 \
-ngl 99 \
-cnv \
-st \
--no-display-prompt \
2>"$log" \
>"$summary"
then
printf ' Wrote %s\n' "$summary"
else
printf ' FAILED: inspect %s\n' "$log" >&2
rm -f "$summary"
fi
done

Fun project: ROCm and local LLMs

Back in May, I got the idea that while I was still employed and had money, I should buy upgrades for my computer. I did so. Last week, I implemented the plan, and it worked.

Background

Back in 2017 (nine years ago!), I bought an ASRock motherboard. At the time, AM4 CPUs were all you could get. I did not buy the latest and greatest CPU, because the latest and greatest is always overpriced. Although Ryzen 7 was available, an AMD Ryzen 7 1800X went for $500. Instead, I bought a Ryzen 5 1500X for $150.

Later, in 2020, I bought an MSI motherboard because I was having trouble with random lockups. But I was still on the Ryzen 5 1500X and 16 GB RAM.

This rig did just fine for me for the last six years. Really, for the last nine years. I’d kept a video card from 2013, though, and it has only 3 GB of RAM. Okay, back in 2013, I splurged the heck out of my purchase there because the video card was $700 before tax and shipping. But for the games I enjoyed playing (Factorio, Tropico, Endless Space, XCOM2, World of Warcraft), it was plenty.

Somewhat, I’d like to play Baldur’s Gate III next. The 3 GB RAM video card was nowhere near good enough.

May 2026 purchases

  • 32 GB RAM (Man, those prices hurt.)
  • MSI Radeon RX Vega 56 (8G RAM)
  • AMD Ryzen 7 5700X3D CPU

The RX Vega 56 was the video card with the largest amount of RAM that I could get without growing into a PCI 5 slot. The motherboard has only PCI 4 slots, so it didn’t make sense to me to pay more money for a card with a capability it cannot use. In the back of my mind too, I didn’t want to mix a card with PCI 5 capability being stymied by a PCI 4 motherboard. If everything matches and lines up, then there won’t be weird problems because some software expects PCI 5 access.

I did want the Ryzen 7 5700X3D processor because it is built with a 7 nm process (oh my goodness!) and consumes (only) 105 watts. The X3D part of it has a whopping 93 MB of L3 cache.

Well, when I received the parts, of course I added the RAM first. Easy peasy, but it didn’t change things much. I wasn’t doing much work that needed RAM.

I went to install the RX Vega 56, and… this video card is about 1/4″ too long for my case. Oof.

Well, way back when, I’d built a Windows 7 box and bought gear for it to be beefy. It sat in a large and quiet Antec P180 case, with an Antec 850 watt power supply.1 So I’ve got a case large enough, and it has the power supply with the extra connections for the RX Vega 56. I’m just going to have to find the time to do the migration.

Migration

I had moved the Antec case / Windows 7 box into my old office, where I used to work from home, and then pulled all the components out.

Last week, on Wednesday, everything lined up, and the whole day was mine. I started with vacuuming and dust blowing the Antec case. Then I powered down my main machine and started the migration process. Between the cleaning and component moves, it took about five hours before I hit the power switch on the new rig.2 It had the same MSI motherboard but now with the Radeon RX Vega 56 and the Ryzen 7 5700X3D.

The magic smoke did not escape! In short order, Debian was running, and I was happy. I did move the audio from electrical to S/PDIF (IEC 60958-3).

The project

I asked an AI to guide me through adding ROCm to this machine. It did so pretty easily. However, the devil is in the details, and pretty quickly, I was running into all sorts of obstacles. It helped that I had a specific goal: turn an MP3 file into a summary of a meeting.3

The AI guided me through installing llama.cpp4 with HIP to connect to the hardware via ROCm. There were numerous packages that HIP expected would be there that I had to find out about because they were missing. Thankfully, pasting the messages of the failed compiles would lead the AI to figuring out what was missing.

By the time I was done, I’d added all these:

rocminfo
clinfo
hipcc
cmake
build-essential
git
pkg-config
mesa-utils
libamdhip64-dev
rocm-cmake
clang
llvm
libclang-rt-dev
libclang-rt-19-dev
libomp-17-dev
libhipblas-dev
libcurl4-openssl-dev

One of the snags was that llama.cpp had a dependency on HIP 6.1, but my hardware can only do HIP 5.7.

git clone https://github.com/ggml-org/llama.cpp.git llama.cpp-rocm57

Amazingly, the AI guided me through downloading the llama.cpp-rocm57 source code, find the check-in for the code that depends on HIP version 6.1, and guided me through deleting it!

This worked!

I am an utter git newbie, but the AI has enough training to guide me through the whole process.

After getting the initial part of ROCm, HIP and llama.cpp-rocm57 installed, I asked about how to do transcription. “Please guide me through installing an LLM to do speech to text, inputting an mp3 file recording of a meeting, and outputting a transcript of what was said.”

The AI then guided me through installing Whisper (whisper.cpp). That went easy. I got about 11,000 words out of the transcription.

Then I asked how to summarize it. It generated a prompt file for me, and threw that at llama.cpp-rocm57. I did run into the problem that the 11,000 words were too much for the 8 GB video card. But I split the transcript file in two, and ran llama.cpp-rocm57 on each piece.

It worked.

I even got a nice little summary like this:

Action items

ActionOwnerDeadlineEvidence/notes
Find a cookUnclearUnclearThe group is looking for a cook.
Decide on menuUnclearUnclearThe group needs to decide on a menu.
Determine ticket priceUnclearUnclearThe price of the event is still uncertain.

This is just so cool: from an hour-long MP3 recording of the first planning meeting to a list of action items, all on my local machine. I’m thrilled.

  1. Foolishly, I hadn’t kept on with the task of installing a Bitcoin miner in it. I would later find in this machine a Bitcoin wallet from summer 2014. But back in 2014, the idea of running an 850 watt power supply full-time during summer really did not appeal to me. But if I had been able to mine 1 Bitcoin, that would be worth about $80,000 today. ↩︎
  2. I’m retired now, so I don’t have to be in a rush. ↩︎
  3. I had volunteered to be the project lead on a New Year’s Eve party. I had recorded the first meeting on my Sony ICD-UX570. In the past, I would pay Amazon to transcribe it for me, but that would cost around $3. I wasn’t terribly thrilled about uploading a recording of a meeting to the cloud, either. ↩︎
  4. I tagged this post with “Facebook” because although I have my beef with them, they do provide their large language model, Llama, as open source and for free. Credit where credit is due, man. ↩︎

I feel a little betrayed by Perplexity.ai

I’d signed up for the service, paying $20 per month. I understand that running this stuff costs money, so sure, I’ll buy a subscription. And some of the Perl programming I was doing, when I asked Perplexity.ai to help, it was excellent.

But recently, the stuff I want, they are putting behind a new tier called “Computer” for $200 per month.

I feel betrayed.

Yes, I would like “Ready-to-paste Picard script for true multi-genre tags – tested on mixed genre tracks”. But I don’t have $200 per month, and never will.

I asked Perplexity.ai if I could turn off the prompting to use “Computer” and of course the answer is no.

It is still useful, of course. What these programs can do, using statistics of word association, is spectacular. But, there’s no Intelligence in Large Language Models (LLMs) yet. If I were going to whine about work, I’d tell how MS Copilot literally wasted 6 hours of my 8-hour day yesterday. It is amazingly bad at generating PowerShell (and if any company should have PowerShell expertise, it should be Microsoft). After getting past all the syntax errors, the script finally worked, except it searched a mailbox and matched nothing. Turns out Copilot hallucinated a function for matching Sent Items. Gah! I am so ready to be retired from this hell.

Anyway, back to Perplexity.ai – the bait-and-switch of getting me to sign up and then putting the good stuff behind a bigger paywall is… well, it doesn’t feel good, man.

AI is getting good

Perplexity AI is proving to be a much better search engine than Google. It is astonishing.

For several years now, Google has been shooting themselves in the foot by trying to reform society through tainting search results. Accordingly, their search results have gone to shit. There are numerous examples of A/B tests against Google search: getting uplifting / supportive results when the female gender is the search, but getting condemning / demoralizing results when the male gender is the search. Ditto A/B test searches for Democrats versus Republicans, and Hillary Clinton versus Donald Trump.

Okay, I’m done: I have replaced my search engine in all my browsers with Perplexity AI.

So while Google was going to shit, Large Language Models became capable. Jeff Bezos of Amazon spun up his own, trained it, and is now putting it out there as Perplexity AI. They have a commercial license for $20 per month, which is too rich for my blood. If they had a $5 per month plan, I’d pay for it now.

But currently, I’m freeloading. I do pay for Twitter, so I might start using Grok (Grok3 just came out) instead. I prefer to spread my activity over different services. Yet, I feel that freeloading is something I don’t like in other people; therefore, if I want to live a high integrity life, I shouldn’t be a freeloader. Anyway….

Today I get to do the minutes for a monthly meeting that I am Recording Secretary for.

On my Windows machine that plays nice with the Sony ICD-UX570 Digital Voice Recorder, I uploaded the recorded MP3 file to Nextcloud. It syncs to the server, and the file ends up in my folder where all these recorded MP3s go. That folder syncs to my main machine I’m working on now.

I had that moment of inspiration that finding these files / messing with the folders is more trouble than it should be. I’m in these folders a lot. Windows has a “Favorites” feature, surely KDE has such too?

Asking of Perplexity AI “does KDE Dolphin have a Favorites feature” instantly took me to a page which presented a ZD Net article “How to use KDE Plasma Places for a much more efficient desktop“. This is precisely what I was looking for, yet I had no idea that it was called Places.

This is great. Google search might have gotten me to this page eventually, but I doubt that I’d have gotten to it without going through many different page views (thereby increasing Google’s ad revenue).

And yes, I’ve asked Perplexity AI to generate a Perl program for reading a Nextcloud calendar, and it took no time at all to do it. Now, the program did not work….

But troubleshooting the problem with Perplexity AI was pretty easy. It suggested I try curl and that worked perfectly.

As it turns out, Nextcloud doesn’t play nice with Net::CalDAVTalk.

Whether this is a problem with Nextcloud (which doesn’t try to do anything on its own – it uses SaberDAV underneath) or this is a problem with Net::CalDAVTalk isn’t a terribly fruitful pursuit. What is almost trivial to do is to ask Perplexity AI to generate the Perl program without Net::CalDAVTalk. The whole thing can be done with HTTP::Request, LWP::UserAgent, and XML::LibXML.

It is astonishing how well this is working, and how quickly this change is taking place.