33: The Audio Studio - transcript
Jessica: The QUILL Cast, episode thirty-three. I'm Jessica. Today we close the speech arc. Episode twenty-one read documents aloud, episode twenty-eight sent your voice to the screen, episode thirty-two turned other people's recordings into your documents, and today we walk the outbound direction. Documents and recordings become listening. Chaptered, titled, mastered, and published, from one keyboard-first studio that announces every step. The total series is fifty-four episodes, twenty-one to go after today.
Liam: I'm Liam. Quick recap of episode thirty-two. That was the Listening Companion and the transcription pipeline. The offline path runs on your machine through a Whisper-family model, the cloud path is OpenAI with a Deepgram diarization option, and the post-transcription chooser offers the ten built-in transcript actions, Meeting Minutes, Action Items, Executive Summary, Interview Notes, Study Notes, Q and A Extraction, Clean Up and Draft, Follow-Up Email, Key Quotes, and Decisions Log, ordered for the shape of the recording. The action chooser rides on the AI provider you set up in the AI Hub, and if AI is off, it offers the AI Setup Wizard instead of a dead end. Today is the door that takes finished work out, and it lives in the same Tools Speech menu, one entry down.
Jessica: Let's set the frame. The Audio Studio is a guided, journey-aware wizard. It is a stack of pages whose visible sequence depends on the journey you choose on the first page. There are three journeys. Journey one, narrate documents into an audiobook or speech audio. Journey two, combine a folder of audio recordings into one chaptered book. Journey three, edit an existing audiobook, listen, rename, split a chapter, retime a boundary, fix tags, save. Each journey collects the same shape of input, a single batch request, and the existing batch runner, unchanged, executes it. The Studio is the front door, not a second pipeline. The whole module is in quill ui audio studio, a package, not the quill ui audio studio dialog file the brief looked for, and that file does not exist on disk.
Liam: A do this now beat before the deep dive, because the rest of the episode assumes you can reach it. Open QUILL. Open the Tools menu. Open the Speech submenu. Scroll to Audio Studio, the last export entry. Press Enter. The wizard opens. Notice the title says QUILL Audio Studio, the first page is a radio box with the three journeys, and the first choice is selected because that is what the settings remember from your last run, audio studio last journey. The screen reader announces your arrival, but no chapter or file picker is asked yet. Press Escape for now. Resume the episode when the Audio Studio is on your screen once, so the rest of the episode matches what you saw.
Jessica: Journey one, narrate documents. The page sequence is in the wizard code at quill ui audio studio wizard dot py, and it is Start, then What should I read, then Who should read it, then How should chapters work, then Output and diagnostics, then Tell me about the book, then Review and start. Seven pages. Every page announce-says its step number and total when you land on it, step three of seven, Who should read it, so a screen reader user always knows where they are. The Back and Next buttons follow the standard wizard keyboard contract, and there is a third button between Next and Start called Skip to summary, the right thing for a returning user whose project profile is already complete. The button hides itself on the first and last pages, and on page six of seven, the summary page itself.
Liam: What should I read is the source page. A folder picker with a dropdown seeded from the Audio Studio's source-folder most-recently-used list, so the second run is one keystroke away. A checkbox for include subfolders, four file-type checkboxes for Word dot docx, Markdown dot md, HTML, and plain text, two glob filter fields, a size cap in megabytes with zero meaning no limit, and a Count documents button that runs file discovery off the UI thread and announces the result, fourteen documents found, about ninety-two thousand words, before committing to a whole night of synthesis. The work happens on a daemon thread, the result is applied through wx CallAfter, and a newer count cancels an older one by generation number, so pressing Count twice in quick succession does not race the announcement.
Jessica: Who should read it is the voice page, and it is the most generous page in the wizard. Engine selector at the top, with each option labeled with the engine name, and any engine whose binaries are not installed gets a parenthetical, not installed, in the label, so the choice is honest before you pick it. Voice selector with a Preview voice button that pushes a sample line through the chosen engine and voice on the same UI, so you hear the speed and the pronunciation before you commit. Rate in words per minute, Kokoro speed as a floating point spinner, and three more voice tools. Round-robin rotation, with an add picker, a list of rotation voices, and Move Up, Move Down, Remove buttons. Voice casting, with a pattern field that accepts a title glob like star interview star or a section number like hash one, a voice picker, an Add rule button, and a list of rules with first match wins in the column header. And translated editions, with a language picker, a voice picker, an Add language button, a list of targets, a Remove language button, and a Translate with selector that offers AI provider cloud and LibreTranslate local.
Liam: How should chapters work is the structure page. Chapter mode, single chaptered file or separate file per article, with a Preview chapter titles button that reads the first twenty chapters your choice would produce off the UI thread. Speak each heading aloud, combine empty headings into the next article, play a transition sounder between headings, and four millisecond spinners. Every spinner has a screen-reader-accessible name, and every checkbox has a mnemonic, so the whole page is operable with no mouse.
Jessica: Output and diagnostics is where you set the cost-versus-quality contract. Output format, MP3 with chapter markers, M4B audiobook native chapters, or WAV. What to do if the file already exists, skip, overwrite, rename. Normalize loudness to audiobook ACX level. Reuse unchanged audio from the last run, the checkbox for incremental rebuilds, on by default. Dry run, write preview text only, do not synthesize. Save the text sent to speech as a sidecar, one file per document. Audition, convert only the first document so you can judge the result before committing the whole batch. And a temporary files folder, blank for the system temp, with a Browse temp button.
Liam: Tell me about the book is the metadata page, and it is the page most people rush. A checkbox to assemble the results into one audiobook, then a grid of book fields, title, author, narrator, genre, year. A Look up book details button that calls Open Library and MusicBrainz, with a one-time consent dialog and a busy cursor, then a single-choice picker of the matches, where the chosen match fills the title, author, genre, year, and offers to download the cover as cover dot jpg beside the sources. A cover image text field with a Browse cover button, a book format selector M4B or MP3, an ACX loudness normalize checkbox, fade in, fade out, and tempo spinners, a spoken credits checkbox for the documents journey, a review chapters checkbox, and a save the book as text field with a Browse book button that knows the right extension for the chosen format.
Jessica: Review and start is the summary page. The text control lists every choice in plain sentences, one per line, and is updated whenever the wizard is shown, so backtracking to the chapters page and changing the level setting shows up in the summary as soon as you return here. The lines are produced by summary lines in pages shared, which renders every field of the batch request, including round-robin rotation, translation targets, dry run, ACX normalize, and review chapters. The Save a job file button pins this exact run to a portable text file with a quilljob extension, hand-editable in Notepad, so the third run of the same book is one dialog and one Start.
Liam: Now the two features that make this an exporter instead of a wizard. First, incremental rebuilds. The field is reuse unchanged, on the output page, on by default. The mechanism is in quill core speech synth cache, and the cache file is dot quill speech-cache dot json in the source folder. The fingerprint is deliberately conservative. The source path, the text, and every audio-shaping setting that affects the produced audio, voice, rate, speed, format, chapter mode, heading level, gaps, normalize, speak-headings, sound, sounder volume, combine, cast list, rotation list. If any of those changes, the fingerprint changes, and that document re-synthesizes. If the fingerprint matches and the output file still exists on disk, the runner announces, reused, unchanged since last run, and skips the synthesis. The fingerprint never sees secrets, and the cache is local and never leaves the folder.
Jessica: Second, voice casting. The rotation is fine for variety, the cast is for character work. The cast rules live in casting rules, an ordered tuple of pattern, voice id pairs. The pattern is a fnmatch glob, case-insensitive, matched against the section's heading title, or a hash-N token for section number N, one-based. First match wins. Everything else falls back to the rotation, and the rotation falls back to the single voice. The wizard's Who should read it page makes this concrete. Type star interview star in the pattern field, pick the guest voice in the picker, press Add rule, and the list shows star interview star equals guest voice. The previous script summarized this as every chapter titled like interview gets the guest voice, and chapter one gets the narrator, and that summary is still right. Switching engines clears both the rotation and the cast, because both name voices of the previous engine.
Liam: Journey two, combine a folder of audio files into one chaptered book. The page sequence is Start, then Where are the recordings, then Tell me about the book, then Review and start. Four pages. The Where page has the same MRU-seeded folder picker as the documents source page, an include subfolders checkbox, a library mode checkbox every subfolder becomes its own audiobook, a trim leading and trailing silence checkbox, and a note that lists the accepted formats, MP3, M4A slash M4B, WAV, FLAC, Opus, OGG. The note also says files that look like previous builds are set aside automatically, so a folder you have run through the Studio before does not feed itself back into a new book. The runner forces the chapter review step on for a single book and off for library mode, so unattended library mode never pops a dialog. The wizard's Tell me about the book page in this journey hides the spoken credits checkbox, because there is no narration voice to speak them with, and forces the assemble checkbox and the review chapters checkbox on. A small static line says you will review the chapter list before the book is built, so the user is told instead of asked.
Jessica: Journey three, edit an existing audiobook. The page sequence is Start, then Open a book, two pages. The Open a book page is a ComboBox seeded from the audiobooks most-recently-used list, with a Browse button. The wildcard accepts dot mp3, dot m4b, dot m4a, all files. The chosen file opens in the Chapter Workbench, the heart of journey three, and the wizard closes. The Workbench is its own dialog, not a wizard page, because the workbench is iterative, listen, edit, listen, save, not linear. The recent file write is best-effort, so a locked profile still gets the workbench open. The whole thing is in quill ui audio studio chapter workbench.
Liam: The Chapter Workbench has four rows of controls stacked above the player, and a tags grid below. The chapter list is a ListBox with a row format of number dot title, dash, starts time, comma, runs duration, so chapter 4 of 33 says chapter four, The Long Road, starts one hour two minutes thirty seconds, runs fourteen minutes. The title row is a TextCtrl plus a Rename button, and pressing Enter in the TextCtrl triggers Rename too. The surgery row has four buttons, Split at playhead, Set start to playhead, Merge into previous, Restore original. The analysis row has Propose chapters from silences, Propose AI titles, Check against ACX. The import-export row has Import chapters, Export chapters, Split into files. Save and Save As, Publish, Close. MP3 saves in place, mutagen rewrites only the tags. M4B cannot be rewritten in place, so its Save button is disabled with the tooltip, an M4B is saved as a new file, use Save As, and Save As runs a lossless re-mux.
Jessica: The four surgery buttons are the workbench's daily bread. Split at playhead parks the playhead where a new chapter should begin, then a single press makes that boundary. The handler reads the playhead from the player, calls split chapter in quill core speech chapters, and announces, Split at one hour three minutes fifteen seconds, now thirty-four chapters. Set start to playhead retimes the selected chapter's start to the current playhead, useful when a boundary was recorded ten seconds early. Merge into previous folds the selected chapter into the one before it. Restore original brings the chapter list back to whatever the file had on open, and clears the dirty flag, so Save is a no-op. Every edit runs in milliseconds, so the workflow is play, stop, nudge, play, stop, nudge, save.
Liam: The import-export row is the workbench's escape hatch. Import chapters opens a file dialog with a wildcard for chapter list files, dot txt, dot cue, dot json, dot csv, parses them through parse chapter text in quill core speech chapter io, and replaces the list. Export chapters opens a single-choice dialog with five formats, Audacity labels, timestamps, CUE sheet, Podcasting two point oh JSON, and CSV spreadsheet, then a save dialog with the right extension pre-filled. Split into files is the reverse trip, one book becomes many files, one per chapter, with a folder picker and an extension that matches the book kind, dot mp3 for MP3 books, dot m4a for M4B books. That last operation is for podcasters who want each chapter as a separate episode, and for assistive-tech users who want per-chapter files on a player that does not understand chapter markers.
Jessica: Propose chapters from silences is the ffmpeg-driven suggestion. The dialog asks for two numbers, a noise threshold in dB, default negative thirty, and a minimum silence in seconds, default zero point eight. On OK, the runner calls detect silence chapters in quill core speech silence, which runs ffmpeg silencedetect on the background pool and returns proposed chapter boundaries at the silence midpoints, with a five-second minimum chapter length. The proposals land in the list, and the dirty flag is set. Nothing is applied blind. Restore original is right there.
Liam: Propose AI titles is the on-device-then-AI naming flow. The button is greyed out in Safe Mode and when no AI provider is configured, and the message is, AI title proposals need a configured AI provider, and are unavailable in Safe Mode, set one up in AI, AI Hub first. When it is available, the button opens a consent dialog that says, QUILL will transcribe the first minute of each of N chapters with the local speech model, the audio never leaves this computer, then send only that transcribed text to your configured AI. The work is in quill core speech chapter titles. ffmpeg slices the opening sixty seconds of each chapter to sixteen kilohertz mono WAV, the local Whisper model transcribes on this machine, the transcript goes to the ask callable which is QUILL's AI gateway, and a local model keeps even the text on device. The prompt is fixed, here is the transcript of the opening minute of one audiobook chapter, reply with only a short, descriptive chapter title of at most eight words, no quotes, no numbering, no trailing period. The reply is cleaned, first line, stripped of quotes, eight words max, applied to each chapter.
Jessica: Check against ACX is the Audible-submission window check. The runner calls acx check file in quill core speech loudness, which ffmpeg-loops the book and reports integrated loudness in LUFS, true peak in dBFS, and noise floor in dBFS. The targets are written in the result dialog, integrated loudness negative twenty LUFS plus or minus three, true peak maximum negative three dB, noise floor maximum negative sixty dB. The verdict is announced before the dialog appears, and the dialog shows the measurements plus a what-to-fix list when the book fails. The verdict is spoken on completion so a user who dismisses the dialog with Escape still gets the message.
Liam: The player panel is the workbench's anchor. Play, stop, previous chapter, next chapter, rewind, forward, where am I, plus a position slider that speaks human time, a volume slider, and a speed selector at zero point seven five x, one x, one point two five x, one point five x, two x. The WMP backend, wx dot media dot MediaCtrl, is the default and ships with wxPython, so playback is zero new native dependency. The mpv backend, libmpv, is preferred when its DLL is installed, on-demand download, a QUILL LIBMPV override, or a copy beside the executable, and the discovery is in audio engine preferred backend. A broken mpv DLL never takes playback away, the engine code falls back to wx dot media. The seek behavior is explicit, was playing before, is playing after, unless the caller passes resume equals true or false. The player auto-loads the remembered listening position on the next open, and the player announces resuming where you left off, at one hour two minutes thirty seconds, before the first frame.
Jessica: Where am I is the workbench's glance button. It speaks three parts. The chapter, chapter N of M, title. The chapter position, three minutes twelve seconds into the chapter, eleven minutes eighteen left in it. The book position, one hour five minutes forty-four seconds of twelve hours thirty-three minutes in the book, eleven hours twenty-seven minutes sixteen seconds remaining. The three parts are joined with full stops, so a screen reader user hears the whole thing as one sentence. The status line under the player shows the same information as text. The position slider moves during playback and stays put during manual drag, so a user mid-scrub does not fight the auto-update.
Liam: Then publish. The Publish button on the workbench is a one-way door into the Publish dialog, which has three consent-gated sections, podcast feed, SFTP upload, Auphonic mastering, plus a folder-feed jump. The whole dialog is disabled in Safe Mode, and the entry point at the bottom of the module says so explicitly. The podcast feed section writes a dot rss file next to the book, no network involved, and asks for the public URL where the audio will live. The SFTP section has a destination store backed by a json file in the app data dir, with name, host, port, username, remote folder, URL base, and the password in the Windows Credential Manager. The Upload book now button publishes the book plus its companion files, the chapters JSON and any sidecars, through QUILL's own SSH client, and the host-key policy is the standard one, paramiko dot Reject Policy, with trust first use honored.
Jessica: The Auphonic section is the mastering service. Paste an API token, press Check account and load presets, the runner calls list presets and account info, the dialog announces the username, the credit count, and the preset count. Press Send to Auphonic, confirm, and the book is uploaded, the production is polled every five seconds for up to thirty minutes, and the results download next to the book. The cancel button is live, both for the upload and for the production poll, so a runaway Auphonic job is one click away from being stopped.
Liam: The folder feed dialog is for the self-hosting podcaster. It scans the book's parent folder for masters, treats every master as an episode, and writes a single feed dot rss with all of them, plus a separate show notes page, an accessible HTML document with a heading per episode. The settings live in dot quill feed dot json, so the show survives a folder move. After every new build, one button rewrites the feed. The episode list lets the user override per-episode title and description. The dialog is also the door to the Write show notes page action, which writes an accessible HTML index next to the feed.
Jessica: Honest corrections from the previous script, because we verify and we want this to be true. One, the file quill ui audio studio dialog dot py does not exist. The Studio is a package, quill ui audio studio. Two, the journey menu is at Tools, Speech, Audio Studio, the last export entry, not the first. Three, the documents journey has seven pages, not six, because Output and diagnostics is its own page, between Chapters and Book. Four, the chapter review step is on by default for the documents journey's book, and it is always on for the audio journey. Five, the format chooser on the Output page is MP3, M4B, WAV. Six, the ACX check reports integrated loudness, true peak, noise floor, not just loudness, and the targets are negative twenty plus or minus three LUFS, negative three dB true peak maximum, negative sixty dB noise floor maximum. Seven, the Propose AI titles dialog says the audio never leaves this computer, and the ffmpeg slice and the Whisper transcription both run locally, only the transcript text goes to the AI.
Liam: The DAISY export is the old faithful and we want to mention it for completeness. The old single-page dialog, File, Export, DAISY Talking Book, still ships, and the implementation is in quill io daisy dot py, a wx-free module. Headings become the navigation levels, and the output is the DAISY format that accessible libraries and dedicated players have run on for decades. The DAISY export is the path for institutional delivery, library of congress style deposits, school reading lists, and any workflow that already has a DAISY reader.
Jessica: Other small kindnesses worth naming. The Look up book details button on the Book page calls Open Library and MusicBrainz, with a one-time consent dialog, and a chosen match offers to download the cover as cover dot jpg beside the sources. The Audition checkbox on the Output page converts only the first document, so a two-hour book does not run before you have heard the voice. The Save a job file button on the summary page pins an entire run to a portable text file, the Load a job file button on the start page restores it. The Job file is also editable by hand, which makes it a real artifact, not hidden state.
Liam: A second do this now beat for the second half. Open the Tools, Speech, Audio Studio menu. Choose the second journey, combine a folder of audio recordings. Point it at any folder that holds a few MP3 or M4A files, even three voice memos, and tick the Library mode checkbox off. Click Next. Notice that the Tell me about the book page hides the spoken credits checkbox, and the assemble and review chapters checkboxes are forced on, and a small static line says you will review the chapter list before the book is built. Click Next to the summary, then click Start, and watch the chapter review list come up. Notice that the chapter titles are the file names in natural filename order, and that the review is editable. Cancel out of the run before it actually builds, and notice that nothing was committed, the source files are unchanged. Resume the episode when you have walked one folder through the combine journey, even partway.
Jessica: A craft note, and the kind of thing that makes the difference between a tool you tolerate and a tool you trust. Name your files. The chapter list takes its titles from the file names, and the workbench import, the publish feed, and the show notes page all read from those titles. star interview, dash, the developer, dot m4a is a better chapter title than file zero zero seven dot m4a. Microphones still matter. The chapter title proposer is only as good as the audio it transcribes. And keep ffmpeg installed. The chapter slice, the silence proposal, and the ACX check all need it, and the Studio's chapter list always says so in its analysis-row tooltips.
Liam: Homework, four steps. One, run Tools, Speech, Audio Studio, the narrate journey, against any folder of two or three documents, just to see the seven pages, the summary, the Start, and the announcement as it runs. Two, run it again with the Reuse unchanged audio from the last run checkbox on, and notice the runner announce, reused, unchanged since last run, for the documents that did not change. Three, build a small book with the Chapter Workbench, split a chapter at the playhead, retime another with Set start to playhead, run Check against ACX, and notice the verdict and the measurements. Four, run Propose AI titles on a chaptered book, and notice that the audio stayed on your machine, the proposals landed in the list for review, and Restore original put the original titles back with one click.
Jessica: Next episode we change arcs entirely. Episode thirty-four is setting up AI in QUILL, including the paths that cost nothing. We will cover the AI Hub, the free-tier providers, the local Ollama path, the Get API key flow, and the wizard that turns AI on for the first time. Setting up AI is the door to Ask Quill, the AI Library, the transcript actions from episode thirty-two, the AI title proposer from today's episode, and every other AI surface in QUILL. We do it once, we do it carefully, and the rest of the show gets to lean on it.
Liam: A reminder, since this is the end of episode thirty-three. The QUILL Cast is fifty-four episodes total, twenty-one to go after today. The speech arc is complete. The AI arc starts next. The accessible vault, the trust and community finale, and the episodes in between are ahead. The transcript is on the site, and the source for every claim is in the code, in the Audio Studio package, in the workbench, in the publish dialog, and in the synth cache module. The Audio Studio is the front door, and the door stays open.
Jessica: That's the close. I'm Jessica. Stop exporting transcripts. Start publishing books.
Liam: I'm Liam. Fifty-four episodes total, twenty-one to go, and a studio that knows what to do with your work.