<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://storyteller-platform.dev/blog</id>
    <title>Storyteller Blog</title>
    <updated>2026-05-25T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://storyteller-platform.dev/blog"/>
    <subtitle>Storyteller Blog</subtitle>
    <icon>https://storyteller-platform.dev/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[v2.14.0: A big update to file management]]></title>
        <id>https://storyteller-platform.dev/blog/20260525_scanner</id>
        <link href="https://storyteller-platform.dev/blog/20260525_scanner"/>
        <updated>2026-05-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Heya!]]></summary>
        <content type="html"><![CDATA[<p>Heya!</p>
<p>After the last
<a href="https://gitlab.com/storyteller-platform/storyteller/-/merge_requests/408" target="_blank" rel="noopener noreferrer" class="">failed attempt at writing an update blog post</a>,
I'll try to keep this one brief so there's actually something to read!</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>TL;DR</div><div class="admonitionContent_BuS1"><ul>
<li class="">Much richer metadata from books: sort, filter and, well, actually see the page
counts and durations of your (audio)books.</li>
<li class="">Storyteller can now (re)scan books in your library to pick up changes to the
files from external sources (Calibre, Audiobookshelf, etc.)</li>
<li class="">All auto-import rules have been moved to the settings page. You can set as
many as you like, add books to multiple collections, and add ignore rules for
specific folders.</li>
<li class="">Simplified file management model. Books in the Storyteller UI now more
directly correspond to the files in your asset folder. Deleting a book doesn't
leave a bunch of orphaned files around.</li>
<li class="">Advanced file management features: you can now add, replace, and remove
audiobooks and ebooks to/from existing books.</li>
</ul></div></div>
<p>Read on for more details!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reworked-scanner">Reworked scanner<a href="https://storyteller-platform.dev/blog/20260525_scanner#reworked-scanner" class="hash-link" aria-label="Direct link to Reworked scanner" title="Direct link to Reworked scanner" translate="no">​</a></h2>
<p>The biggest change in here, which allows for all the other changes to happen,
has been to unify all of the many different ingestion methods Storyteller had
for books into a singular pipeline: the scan.</p>
<p>To you it's probably quite convenient that you could get books into Storyteller
in so many different ways: you can upload books directly, pick a random file on
your server to import, or, what most people probably do, point Storyteller at a
folder on your server and let it scan it for you. While nice, it meant that we
had a lot of different places where we had to handle the same book being
imported in different ways, which made it more costly to add extra data
extraction features.</p>
<p>No more! Now everything flows through a the single scan pipeline, which should
(🤞) make it easier for us to do many more things with books in the future.</p>
<p>One immediate change this brings is that you can now (re)scan books in your
library to pick up changes to the files from external sources (Calibre,
Audiobookshelf, etc.).</p>
<p><img decoding="async" loading="lazy" alt="The new library scanning settings section, with a big button to trigger a scan of your library, and the ability to schedule scans to run automatically" src="https://storyteller-platform.dev/assets/images/scanner-setting-6ac2d7f9e853f852ce64c698c8d33b45.png" width="1764" height="1252" class="img_ev3q"></p>
<p>By default we will run a once a day rescan of your library to pick up changes to
your files and detect whether files have gone missing, but you can configure how
often this and when this happens using a
<a href="https://crontab.guru/" target="_blank" rel="noopener noreferrer" class="">cron expression</a>. (Note: this scheduled scan is separate
from the auto-import rules and are meant for eg uploaded or manually imported
books, see below)</p>
<p>You can configure how Storyteller handles metadata from book files during scans
using the Metadata Read Behavior setting. By default, Storyteller will merge
existing metadata with the metadata found in the book file. For instance, if you
have added an author to an ebook using Calibre, Storyteller will add that author
to the book in Storyteller, or if you have added a description to the book and
Storyteller did not yet have a description, it will be added. But if you change
the title of the epub, Storyteller will not override its title unless you have
set the behavior to always override.</p>
<p>We will work on making these settings easier to configure in the future, please
let us know what you would like to see in our
<a href="https://discord.gg/KhSvFqcrza" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</p>
<!-- -->
<figure style="width:100%;text-align:center"><img alt="A row on the books page showing a book with a missing file, and a button to replace the file" width="600" style="margin:auto" src="https://storyteller-platform.dev/assets/images/scanner-missing-file-4bdcc8d9b637ce0ff986ec31904d3d83.png"></figure>
<p>Important to know however, is that Storyteller will write metadata changes made
through the UI to your files immediately. In the future we will make this more
configurable.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-auto-import">Improved auto import<a href="https://storyteller-platform.dev/blog/20260525_scanner#improved-auto-import" class="hash-link" aria-label="Direct link to Improved auto import" title="Direct link to Improved auto import" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="A screenshot of the auto import settings page, showing the three tabs: watch, ignore, and auto-ignore, and a button for selecting the default import mode, which is set to &amp;quot;reference in place&amp;quot; by default" src="https://storyteller-platform.dev/assets/images/scanner-import-modes-4836617a28c31044084dc166297f76f6.png" width="2012" height="1394" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-stable-more-fast">More stable, more fast<a href="https://storyteller-platform.dev/blog/20260525_scanner#more-stable-more-fast" class="hash-link" aria-label="Direct link to More stable, more fast" title="Direct link to More stable, more fast" translate="no">​</a></h3>
<p>Previously it could take a while for Storyteller to pick up changes to your
files, and could just stop scanning if it encountered an error. Now it's more
stable and faster.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-flexible-folders">More flexible folders<a href="https://storyteller-platform.dev/blog/20260525_scanner#more-flexible-folders" class="hash-link" aria-label="Direct link to More flexible folders" title="Direct link to More flexible folders" translate="no">​</a></h3>
<p>Finally, you can now watch multiple folders for new books!</p>
<p>Previously you could also specify a folder to watch for specific Collections.
That setting has now been moved to this new import rules section for ease of
discovery, and you can now put books into multiple collections at once if you
want to.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="stricter-rules-better-discovery">Stricter rules, better discovery<a href="https://storyteller-platform.dev/blog/20260525_scanner#stricter-rules-better-discovery" class="hash-link" aria-label="Direct link to Stricter rules, better discovery" title="Direct link to Stricter rules, better discovery" translate="no">​</a></h3>
<p>While we already told you that
<a href="https://storyteller-platform.dev/docs/managing/adding#organizing-your-auto-import-folder" target="_blank" rel="noopener noreferrer" class="">Every book needs to be in its own folder</a>,
we actually never enforced this until now. This may break some of your existing
auto-import rules, but you shouldn't have been doing it like that to begin with!</p>
<p>With this stricter enforcement, we can now more easily match up new books added
to an existing folder. So now, if you already had a
<code>/Frankenstein/Frankenstein.epub</code> file, and you add a new
<code>/Frankenstein/Frankenstein.m4b</code> audiobook to it, Storyteller will now
automatically match the new book to the existing one, rather than creating a new
book. Nice!</p>
<p>If you drop in an additional <code>.epub</code> in there (which isn't a readaloud epub),
Storyteller will ignore it. If you try to scan a new folder which has &gt; 1 epub
in it, Storyteller will skip it and warn you about it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="import-modes">Import modes<a href="https://storyteller-platform.dev/blog/20260525_scanner#import-modes" class="hash-link" aria-label="Direct link to Import modes" title="Direct link to Import modes" translate="no">​</a></h3>
<p>You can configure <em>how</em> Storyteller imports books from these folders using the
import mode. This setting isn't new, it was added a while back by
<a href="https://tecosaur.net/" target="_blank" rel="noopener noreferrer" class="">tecosaur</a>
<a href="https://gitlab.com/storyteller-platform/storyteller/-/merge_requests/471" target="_blank" rel="noopener noreferrer" class="">MR</a>,
but now you can configure it for each folder individually.</p>
<p>There are four import modes to choose from:</p>
<ul>
<li class="">Reference in place: Storyteller will reference the file in the watch folder,
but not copy it to your libraries assets folder.</li>
<li class="">Copy to library: Storyteller will copy the file to your libraries assets
folder, leaving the original file in the watch folder. The original file will
be added as an ignore rule (see below)</li>
<li class="">Move to library: Storyteller will move the file to your libraries assets
folder.</li>
<li class="">Hard link to library: Storyteller will
<a href="https://en.wikipedia.org/wiki/Hard_link" target="_blank" rel="noopener noreferrer" class="">hard link</a> the file to your
libraries assets folder. The original file will be added as an ignore rule
(see below).</li>
</ul>
<p>The move, copy, and hard link modes are more for those who like to make
Storyteller the final arbiter of where files are stored, rather than having to
manage them yourself.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ignore-rules">Ignore rules<a href="https://storyteller-platform.dev/blog/20260525_scanner#ignore-rules" class="hash-link" aria-label="Direct link to Ignore rules" title="Direct link to Ignore rules" translate="no">​</a></h3>
<p>The other feature added in that MR was making Storyteller ignore books from
auto-impored folders that you deleted from your library. This was very useful,
but we didn't really have a way to undo this before. You can manage those ignore
rules here as well, in the auto-ignore tab. This is now also an explicit check
when deleting books.</p>
<p><img decoding="async" loading="lazy" alt="A of the new delete book model, saying &amp;quot;Are you sure you want to delete Kother Daramazov by Fyodor Dostoevsky? Library-owned files will be deleted. Files in your watch folders (reference imports) are left on disk.&amp;quot; With an unchecked checkbox at the bottom saying &amp;quot;Prevent this book from being re-imported&amp;quot;" src="https://storyteller-platform.dev/assets/images/scanner-delete-book-772d39d0d52a25ddb977e3eac279aa1d.png" width="760" height="546" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>There now also is no longer an option to keep any of the files in Storyteller's
assets folder around when deleting a book, so be really sure you want to delete
a book before doing so.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="richer-metadata">Richer metadata<a href="https://storyteller-platform.dev/blog/20260525_scanner#richer-metadata" class="hash-link" aria-label="Direct link to Richer metadata" title="Direct link to Richer metadata" translate="no">​</a></h2>
<p>As mentioned, Storyteller can now extract page counts and durations from ebooks
and audiobooks. While the page counts are a bit of a guess, they should be the
same as the ones in the Storyteller apps and web reader.</p>
<!-- -->
<figure><img alt="An image showing three rows of data, one for each of the three formats supported by Storyteller: audiobook, ebook, and readaloud. They now show the number of pages, duration, and file size." src="https://storyteller-platform.dev/assets/images/scanner-richer-metadata-d7323df289ffe68808cf9eefb3b18938.png"><figcaption style="text-align:center;font-size:0.8rem"><p>The duration discrepancy between the readaloud and audiobook can also be
used as an imperfect proxy for alignment quality. Here we see almost all of
the content from audiobook is aligned, the difference only being ~1.2%<!-- --> </p></figcaption></figure>
<p>You can also sort and filter by these fields in the library view (not yet in the
mobile apps, coming soon!), making it easier to find a book that matches your
current attention span.</p>
<p><img decoding="async" loading="lazy" alt="An image showing a library view of books sorted by duration, showing the longest books (The Leo Tolstoy Complete Collection at 186 hours) at the top" src="https://storyteller-platform.dev/assets/images/scanner-sorting-32cbc1171238277a33a2fa7bbab562f7.png" width="1716" height="1342" class="img_ev3q"></p>
<p>This also shows a new feature in the UI, namely dynamically showing you the
property you are sorting/filtering on (here the duration is shown rather than
the author).</p>
<p>For the those of you that prefer to match the page counts in these views with
the actual page counts in eg your physical book, you can manually set both page
count and duration for a book in the settings of that book. This will then be
used to for sorting and filtering.</p>]]></content>
        <author>
            <name>Thomas F. K. Jorna</name>
            <uri>https://tefkah.com</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[A new tool from Storyteller: stalign]]></title>
        <id>https://storyteller-platform.dev/blog/20260305_stalign</id>
        <link href="https://storyteller-platform.dev/blog/20260305_stalign"/>
        <updated>2026-03-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[It’s been a long time coming: there’s now a standalone Storyteller alignment]]></summary>
        <content type="html"><![CDATA[<p>It’s been a long time coming: there’s now a standalone Storyteller alignment
command line tool (and npm library)!</p>
<p>Continuing tefkah’s amazing work with <a class="" href="https://storyteller-platform.dev/blog/20260221_ghost_story">Ghost Story</a>,
we now publish <code>stalign</code> to npm as
<a href="https://npmjs.com/package/@storyteller-platform/align" target="_blank" rel="noopener noreferrer" class="">@storyteller-platform/align</a>
and to GitLab as
<a href="https://gitlab.com/storyteller-platform/storyteller/-/packages?orderBy=created_at&amp;sort=desc&amp;search%5B%5D=stalign" target="_blank" rel="noopener noreferrer" class="">stalign</a>.</p>
<!-- -->
<p>The packages published to the GitLab Package Registry are standalone executable
applications — this means that you don’t need Node.js installed to run them! You
<em>will</em> still need <code>ffmpeg</code> installed and available on your <code>PATH</code> in order for
the audio processing and transcription steps to run.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-stalign">What is <code>stalign</code>?<a href="https://storyteller-platform.dev/blog/20260305_stalign#what-is-stalign" class="hash-link" aria-label="Direct link to what-is-stalign" title="Direct link to what-is-stalign" translate="no">​</a></h2>
<p>This is a command line interface (CLI) for running just the alignment pipeline
that Storyteller uses to automatically align audiobooks and ebooks. It’s <em>also</em>
an npm package, and Storyteller uses it directly through this programmatic
interface. That means that when you run the CLI, you’re using exactly the same
code that Storyteller uses for alignment!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use-it">How to use it<a href="https://storyteller-platform.dev/blog/20260305_stalign#how-to-use-it" class="hash-link" aria-label="Direct link to How to use it" title="Direct link to How to use it" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://storyteller-platform.dev/blog/20260305_stalign#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<p>If you already have Node.js and npm installed, you can use <code>npx</code> to run the CLI.
Note that <code>stalign</code> requires at least Node.js v24 or higher:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--st-code-plain);--prism-background-color:var(--st-code-bg)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:var(--st-code-plain);background-color:var(--st-code-bg)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">npx @storyteller-platform/align </span><span class="token parameter variable" style="color:var(--st-code-variable)">--help</span><br></div></code></pre></div></div>
<p>If you want to use the standalone executable instead, so that you don’t have to
worry about Node.js versions, you can download the latest executable from
GitLab:
<a href="https://gitlab.com/storyteller-platform/storyteller/-/packages?orderBy=created_at&amp;sort=desc&amp;search%5B%5D=stalign" target="_blank" rel="noopener noreferrer" class="">https://gitlab.com/storyteller-platform/storyteller/-/packages?orderBy=created_at&amp;sort=desc&amp;search[]=stalign</a>.
Make sure you download the executable for your operating system and
architecture. On macOS and Linux, you can use <code>chmod +x ./stalign-&lt;os&gt;-&lt;arch&gt;</code>
to make the downloaded file executable. You can also place the file somewhere on
your path, e.g., <code>~/.local/bin</code>, and rename it to <code>stalign</code>. Then you can simply
run:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--st-code-plain);--prism-background-color:var(--st-code-bg)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:var(--st-code-plain);background-color:var(--st-code-bg)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">stalign </span><span class="token parameter variable" style="color:var(--st-code-variable)">--help</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage">Usage<a href="https://storyteller-platform.dev/blog/20260305_stalign#usage" class="hash-link" aria-label="Direct link to Usage" title="Direct link to Usage" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--st-code-plain);--prism-background-color:var(--st-code-bg)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:var(--st-code-plain);background-color:var(--st-code-bg)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">$ ~/Downloads/stalign-linux-x64 </span><span class="token parameter variable" style="color:var(--st-code-variable)">--help</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Usage: stalign process </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--parallel INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--codec TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--bitrate BITRATE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--max-length INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--no-progress</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--log-level TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--time</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       INPUT OUTPUT</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       stalign-linux-x64 transcribe </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--parallel INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--language LOCALE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">--engine/-e whisper.cpp </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--model/-m MODEL</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--threads INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--processors</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--cpu-override CPU_ENGINE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e whisper-server --whisper-server-url URL </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--whisper-server-api-key STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       openai-cloud </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-model STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-api-key STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-organization STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-base-url URL</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e google-cloud</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       --google-cloud-api-key STRING </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e microsoft-azure --azure-service-region STRING --azure-subscription-key STRING </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       amazon-transcribe --amazon-transcribe-region STRING --amazon-transcribe-access-key-id STRING --amazon-transcribe-secret-access-key STRING </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> deepgram --deepgram-api-key STRING </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--deepgram-model STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--no-progress</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--log-level TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--time</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> INPUT OUTPUT</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       stalign-linux-x64 markup </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--granularity/-g TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--language LOCALE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--no-progress</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--log-level TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--time</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> INPUT_PATH OUTPUT_PATH</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       stalign-linux-x64 align </span><span class="token parameter variable" style="color:var(--st-code-variable)">--transcriptions</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token parameter variable" style="color:var(--st-code-variable)">--output</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token parameter variable" style="color:var(--st-code-variable)">--audiobook</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token parameter variable" style="color:var(--st-code-variable)">--epub</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--reports </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--no-progress</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--log-level TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--time</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--language LOCALE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--granularity/-g TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       stalign-linux-x64 </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--processed-audio </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--transcriptions </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--markedup </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--parallel-transcodes INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--parallel-transcribes INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       </span><span class="token parameter variable" style="color:var(--st-code-variable)">--output</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--codec TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--bitrate BITRATE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--max-length INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">--engine/-e whisper.cpp </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--model/-m MODEL</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--threads INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--processors</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--cpu-override CPU_ENGINE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e whisper-server --whisper-server-url URL </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--whisper-server-api-key STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       openai-cloud </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-model STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-api-key STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-organization STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-base-url URL</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e google-cloud</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       --google-cloud-api-key STRING </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e microsoft-azure --azure-service-region STRING --azure-subscription-key STRING </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       amazon-transcribe --amazon-transcribe-region STRING --amazon-transcribe-access-key-id STRING --amazon-transcribe-secret-access-key STRING </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> deepgram --deepgram-api-key STRING </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--deepgram-model STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--granularity/-g TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--language LOCALE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token parameter variable" style="color:var(--st-code-variable)">--audiobook</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token parameter variable" style="color:var(--st-code-variable)">--epub</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--reports</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--no-progress</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--log-level TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--time</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       stalign-linux-x64 </span><span class="token builtin class-name" style="color:var(--st-code-function)">help</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">COMMAND</span><span class="token punctuation" style="color:var(--st-code-punctuation)">..</span><span class="token plain">.</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       stalign-linux-x64 completion </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token environment constant" style="color:var(--st-code-number)">SHELL</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">ARG</span><span class="token punctuation" style="color:var(--st-code-punctuation)">..</span><span class="token plain">.</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       stalign-linux-x64 completions </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token environment constant" style="color:var(--st-code-number)">SHELL</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">ARG</span><span class="token punctuation" style="color:var(--st-code-punctuation)">..</span><span class="token plain">.</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       stalign-linux-x64 </span><span class="token parameter variable" style="color:var(--st-code-variable)">--help</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       stalign-linux-x64 </span><span class="token parameter variable" style="color:var(--st-code-variable)">--version</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">A CLI to automatically align audiobooks and EPUB files, producing EPUBs with Media Overlays.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token builtin class-name" style="color:var(--st-code-function)">help</span><span class="token plain">                        Show </span><span class="token builtin class-name" style="color:var(--st-code-function)">help</span><span class="token plain"> information.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  completion                  Generate shell completion script or provide completions.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  completions                 Generate shell completion script or provide completions.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--help</span><span class="token plain">                      Show </span><span class="token builtin class-name" style="color:var(--st-code-function)">help</span><span class="token plain"> information.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--version</span><span class="token plain">                   Show version information.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  process                     Process audiobook files </span><span class="token keyword" style="color:var(--st-code-keyword)">for</span><span class="token plain"> transcription.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  transcribe                  Transcribe a directory of audiobook files.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  markup                      Mark up an EPUB </span><span class="token function" style="color:var(--st-code-function)">file</span><span class="token plain"> at the provided granularity level</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  align                       Run forced alignment to determine where each sentence</span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain">word is spoken </span><span class="token keyword" style="color:var(--st-code-keyword)">in</span><span class="token plain"> the audiobook and produce a new EPUB package with</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">                              Media Overlays and embedded audio.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --processed-audio </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--transcriptions</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--markedup</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --parallel-transcodes INTEGER   </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token number" style="color:var(--st-code-number)">1</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --parallel-transcribes INTEGER   </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token number" style="color:var(--st-code-number)">1</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--output</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --granularity, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-g</span><span class="token plain"> TYPE       </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">sentence</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: word, sentence</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--language</span><span class="token plain"> LOCALE           BCP </span><span class="token number" style="color:var(--st-code-number)">47</span><span class="token plain"> language tag representing the primary language of the audio </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">e.g. en-US</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --no-progress               Disable the progress bar</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --log-level TYPE            Log level. If enabled, will disable progress bar. </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">silent</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: silent, debug, info, warn, error</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--time</span><span class="token plain">                      Whether to print timing statistics</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Audio processing:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--codec</span><span class="token plain"> TYPE                The audio codec to transcode to. If unspecified, will copy audio data without transcoding. </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">copy</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: libopus,</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">                              lipmp3lame, aac, copy</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--bitrate</span><span class="token plain"> BITRATE           The audio bitrate to transcode to </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --max-length INTEGER        The maximum allowed length of a processed audio track, </span><span class="token keyword" style="color:var(--st-code-keyword)">in</span><span class="token plain"> minutes </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token number" style="color:var(--st-code-number)">120</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">whisper.cpp:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> whisper.cpp     </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: whisper.cpp</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --model, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-m</span><span class="token plain"> MODEL           The whisper model to use </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">tiny.en</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: tiny, tiny.en, tiny-q5_1, tiny.en-q5_1, tiny-q8_0, base, base.en, base-q5_1, </span><span class="token punctuation" style="color:var(--st-code-punctuation)">..</span><span class="token plain">.</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--threads</span><span class="token plain"> INTEGER            </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token number" style="color:var(--st-code-number)">4</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--processors</span><span class="token plain"> INTEGER        The number of processors to use </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">values greater than </span><span class="token number" style="color:var(--st-code-number)">1</span><span class="token plain"> may affect timing accuracy</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token number" style="color:var(--st-code-number)">1</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --cpu-override CPU_ENGINE   When provided, will use this whisper variant even </span><span class="token keyword" style="color:var(--st-code-keyword)">if</span><span class="token plain"> another is available </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: blas, cpu</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">whisper-server:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> whisper-server   </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: whisper-server</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --whisper-server-url URL</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --whisper-server-api-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">openai-cloud:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> openai-cloud    </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: openai-cloud</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --openai-model STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --openai-api-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --openai-organization STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --openai-base-url URL</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">google-cloud:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> google-cloud    </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: google-cloud</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --google-cloud-api-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">microsoft-azure:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> microsoft-azure   </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: microsoft-azure</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --azure-service-region STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --azure-subscription-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">amazon-transcribe:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> amazon-transcribe   </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: amazon-transcribe</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --amazon-transcribe-region STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --amazon-transcribe-access-key-id STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --amazon-transcribe-secret-access-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">deepgram:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> deepgram        </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: deepgram</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --deepgram-api-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --deepgram-model STRING      </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">nova-3</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Alignment:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--audiobook</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--epub</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--reports</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><br></div></code></pre></div></div>
<p><code>stalign</code> has four subcommands: <code>process</code>, <code>markup</code>, <code>transcribe</code>, and <code>align</code>.
It can also be run without specifying a subcommand, in which case the entire
alignment pipeline will be run on the input book files.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--st-code-plain);--prism-background-color:var(--st-code-bg)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:var(--st-code-plain);background-color:var(--st-code-bg)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">stalign </span><span class="token builtin class-name" style="color:var(--st-code-function)">help</span><span class="token plain"> process</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Usage: stalign process </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--parallel INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--codec TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--bitrate BITRATE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--max-length INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--no-progress</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--log-level TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--time</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       INPUT OUTPUT</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Process audiobook files </span><span class="token keyword" style="color:var(--st-code-keyword)">for</span><span class="token plain"> transcription.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--parallel</span><span class="token plain"> INTEGER          How many files to attempt to transcode </span><span class="token keyword" style="color:var(--st-code-keyword)">in</span><span class="token plain"> parallel. </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token number" style="color:var(--st-code-number)">1</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --no-progress               Disable the progress bar</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --log-level TYPE            Log level. If enabled, will disable progress bar. </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">silent</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: silent, debug, info, warn, error</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--time</span><span class="token plain">                      Whether to print timing statistics</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  INPUT</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  OUTPUT</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Audio processing:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--codec</span><span class="token plain"> TYPE                The audio codec to transcode to. If unspecified, will copy audio data without transcoding. </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">copy</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: libopus,</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">                              lipmp3lame, aac, copy</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--bitrate</span><span class="token plain"> BITRATE           The audio bitrate to transcode to </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --max-length INTEGER        The maximum allowed length of a processed audio track, </span><span class="token keyword" style="color:var(--st-code-keyword)">in</span><span class="token plain"> minutes </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token number" style="color:var(--st-code-number)">120</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><br></div></code></pre></div></div>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--st-code-plain);--prism-background-color:var(--st-code-bg)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:var(--st-code-plain);background-color:var(--st-code-bg)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">stalign </span><span class="token builtin class-name" style="color:var(--st-code-function)">help</span><span class="token plain"> markup</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Usage: stalign-linux-x64 markup </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--granularity/-g TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--language LOCALE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--no-progress</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--log-level TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--time</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> INPUT_PATH OUTPUT_PATH</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Mark up an EPUB </span><span class="token function" style="color:var(--st-code-function)">file</span><span class="token plain"> at the provided granularity level</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --granularity, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-g</span><span class="token plain"> TYPE       </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">sentence</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: word, sentence</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--language</span><span class="token plain"> LOCALE           BCP </span><span class="token number" style="color:var(--st-code-number)">47</span><span class="token plain"> language tag representing the primary language of the audio </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">e.g. en-US</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --no-progress               Disable the progress bar</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --log-level TYPE            Log level. If enabled, will disable progress bar. </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">silent</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: silent, debug, info, warn, error</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--time</span><span class="token plain">                      Whether to print timing statistics</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  INPUT_PATH</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  OUTPUT_PATH</span><br></div></code></pre></div></div>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--st-code-plain);--prism-background-color:var(--st-code-bg)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:var(--st-code-plain);background-color:var(--st-code-bg)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">stalign </span><span class="token builtin class-name" style="color:var(--st-code-function)">help</span><span class="token plain"> transcribe</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Usage: stalign transcribe </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--parallel INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--language LOCALE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">--engine/-e whisper.cpp </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--model/-m MODEL</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--threads INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--processors</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       INTEGER</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--cpu-override CPU_ENGINE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e whisper-server --whisper-server-url URL </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--whisper-server-api-key STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       openai-cloud </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-model STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-api-key STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-organization STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--openai-base-url URL</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e google-cloud</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       --google-cloud-api-key STRING </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e microsoft-azure --azure-service-region STRING --azure-subscription-key STRING </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/-e</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       amazon-transcribe --amazon-transcribe-region STRING --amazon-transcribe-access-key-id STRING --amazon-transcribe-secret-access-key STRING </span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain"> --engine/</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> deepgram --deepgram-api-key STRING </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--deepgram-model STRING</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--no-progress</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--log-level TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--time</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> INPUT OUTPUT</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Transcribe a directory of audiobook files.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--parallel</span><span class="token plain"> INTEGER          How many files to attempt to transcode </span><span class="token keyword" style="color:var(--st-code-keyword)">in</span><span class="token plain"> parallel. </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token number" style="color:var(--st-code-number)">1</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--language</span><span class="token plain"> LOCALE           BCP </span><span class="token number" style="color:var(--st-code-number)">47</span><span class="token plain"> language tag representing the primary language of the audio </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">e.g. en-US</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --no-progress               Disable the progress bar</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --log-level TYPE            Log level. If enabled, will disable progress bar. </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">silent</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: silent, debug, info, warn, error</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--time</span><span class="token plain">                      Whether to print timing statistics</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  INPUT</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  OUTPUT</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">whisper.cpp:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> whisper.cpp     </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: whisper.cpp</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --model, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-m</span><span class="token plain"> MODEL           The whisper model to use </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">tiny.en</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: tiny, tiny.en, tiny-q5_1, tiny.en-q5_1, tiny-q8_0, base, base.en, base-q5_1, </span><span class="token punctuation" style="color:var(--st-code-punctuation)">..</span><span class="token plain">.</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--threads</span><span class="token plain"> INTEGER            </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token number" style="color:var(--st-code-number)">4</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--processors</span><span class="token plain"> INTEGER        The number of processors to use </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">values greater than </span><span class="token number" style="color:var(--st-code-number)">1</span><span class="token plain"> may affect timing accuracy</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token number" style="color:var(--st-code-number)">1</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --cpu-override CPU_ENGINE   When provided, will use this whisper variant even </span><span class="token keyword" style="color:var(--st-code-keyword)">if</span><span class="token plain"> another is available </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: blas, cpu</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">whisper-server:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> whisper-server   </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: whisper-server</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --whisper-server-url URL</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --whisper-server-api-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">openai-cloud:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> openai-cloud    </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: openai-cloud</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --openai-model STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --openai-api-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --openai-organization STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --openai-base-url URL</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">google-cloud:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> google-cloud    </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: google-cloud</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --google-cloud-api-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">microsoft-azure:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> microsoft-azure   </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: microsoft-azure</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --azure-service-region STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --azure-subscription-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">amazon-transcribe:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> amazon-transcribe   </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: amazon-transcribe</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --amazon-transcribe-region STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --amazon-transcribe-access-key-id STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --amazon-transcribe-secret-access-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">deepgram:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --engine, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-e</span><span class="token plain"> deepgram        </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: deepgram</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --deepgram-api-key STRING</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --deepgram-model STRING      </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">nova-3</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><br></div></code></pre></div></div>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--st-code-plain);--prism-background-color:var(--st-code-bg)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:var(--st-code-plain);background-color:var(--st-code-bg)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">stalign </span><span class="token builtin class-name" style="color:var(--st-code-function)">help</span><span class="token plain"> align</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Usage: stalign align </span><span class="token parameter variable" style="color:var(--st-code-variable)">--transcriptions</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token parameter variable" style="color:var(--st-code-variable)">--output</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token parameter variable" style="color:var(--st-code-variable)">--audiobook</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token parameter variable" style="color:var(--st-code-variable)">--epub</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--reports </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--no-progress</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--log-level TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--time</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">       </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--language LOCALE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">--granularity/-g TYPE</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Run forced alignment to determine where each sentence</span><span class="token operator" style="color:var(--st-code-operator)">|</span><span class="token plain">word is spoken </span><span class="token keyword" style="color:var(--st-code-keyword)">in</span><span class="token plain"> the audiobook and produce a new EPUB package with Media Overlays and embedded audio.</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--transcriptions</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--output</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --no-progress               Disable the progress bar</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --log-level TYPE            Log level. If enabled, will disable progress bar. </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">silent</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: silent, debug, info, warn, error</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--time</span><span class="token plain">                      Whether to print timing statistics</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--language</span><span class="token plain"> LOCALE           BCP </span><span class="token number" style="color:var(--st-code-number)">47</span><span class="token plain"> language tag representing the primary language of the audio </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">e.g. en-US</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  --granularity, </span><span class="token parameter variable" style="color:var(--st-code-variable)">-g</span><span class="token plain"> TYPE       </span><span class="token punctuation" style="color:var(--st-code-punctuation)">[</span><span class="token plain">sentence</span><span class="token punctuation" style="color:var(--st-code-punctuation)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--st-code-punctuation)">(</span><span class="token plain">choices: word, sentence</span><span class="token punctuation" style="color:var(--st-code-punctuation)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">Alignment:</span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--audiobook</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--epub</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--st-code-plain)"><span class="token plain">  </span><span class="token parameter variable" style="color:var(--st-code-variable)">--reports</span><span class="token plain"> </span><span class="token environment constant" style="color:var(--st-code-number)">PATH</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="caveats">Caveats<a href="https://storyteller-platform.dev/blog/20260305_stalign#caveats" class="hash-link" aria-label="Direct link to Caveats" title="Direct link to Caveats" translate="no">​</a></h2>
<p>The <code>--granulariy</code> flag doesn’t currently do anything — support for word-level
granularity is coming soon!</p>
<p>There seems to be an issue with our macOS automated builds, and we haven’t
figured out Windows builds yet. In the meantime, you can still use <code>npx</code> to run
<code>stalign</code> on those platforms. We will have full OS support soon!</p>]]></content>
        <author>
            <name>Shane Friedman</name>
            <uri>https://smoores.dev</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[v2.7.0: A Reworked Transcription Engine]]></title>
        <id>https://storyteller-platform.dev/blog/20260221_ghost_story</id>
        <link href="https://storyteller-platform.dev/blog/20260221_ghost_story"/>
        <updated>2026-02-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hey there!]]></summary>
        <content type="html"><![CDATA[<p>Hey there!</p>
<p>We're extremely excited to announce the release of Storyteller v2.7.0! This
release completely reworks how Storyteller handles the most expensive part of
the alignment process: transcribing the audiobook.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>TL;DR</div><div class="admonitionContent_BuS1"><ul>
<li class="">To use GPU acceleration, you need to change your
<a class="" href="https://storyteller-platform.dev/docs/installation/gpu-configuration">Docker image to one with GPU support</a>,
removing the need for the time-consuming <code>whisper.cpp</code> build process everytime
you restart Storyteller</li>
<li class="">Added (experimental) support GPU acceleration for Intel (i)GPUs</li>
<li class="">New experimental <a class="" href="https://storyteller-platform.dev/docs/managing/aligning#turbo-mode">"Turbo mode"</a> setting
for faster local transcription</li>
<li class="">A dedicated <code>cli</code> tool,
<a class="" href="https://storyteller-platform.dev/docs/tutorials/offloading-transcription"><code>ghost-story</code></a> for offloading
transcription to a different machine</li>
<li class="">Much more efficient memory usage when using remote transcription services</li>
</ul></div></div>
<p>Read on for more details!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="background">Background<a href="https://storyteller-platform.dev/blog/20260221_ghost_story#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background" translate="no">​</a></h2>
<p>Since 2024, Storyteller has used the open source
<a href="https://github.com/echogarden-project/echogarden" target="_blank" rel="noopener noreferrer" class="">echogarden</a> project for the
transcription part of the alignment process with greate success! <code>echogarden</code> is
an extremely flexible and capable project, having built in support for
transcribing audio files locally using the open source
<a href="https://github.com/ggerganov/whisper.cpp" target="_blank" rel="noopener noreferrer" class="">whisper.cpp</a> project, or using
commercial Speech-to-Text (STT) services. But that's by far not all! It can also
translate files, TTS, speech-denoising, convert between audio formats, and more!</p>
<p>You may think: "Thomas, that sounds pretty nice, and I would love to see
[feature] used in Storyteller. Why do you like reinventing the wheel so much?"
Fair question, me!</p>
<p>Over the years we have ran into a few issues with <code>echogarden</code> that are
difficult to fix as a patch:</p>
<ul>
<li class="">Lot of small, random crashes</li>
<li class="">High memory usage</li>
<li class="">Some extra redundancies that made eg remote transcription much slower than it
could be</li>
</ul>
<p>To address all of these issues, we decided to fork <code>echogarden</code> and build our
own transcription library, called <code>ghost-story</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changes-to-storyteller">Changes to Storyteller<a href="https://storyteller-platform.dev/blog/20260221_ghost_story#changes-to-storyteller" class="hash-link" aria-label="Direct link to Changes to Storyteller" title="Direct link to Changes to Storyteller" translate="no">​</a></h2>
<p>For those interested, you can see a technical breakdown of the changes to
Storyteller <a href="https://storyteller-platform.dev/blog/20260221_ghost_story#technical-details" class="">here</a>. For most of you I reckon you are
interested in what this means for you using Storyteller.</p>
<p>Let's go over the changes one-by-one.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gpu-acceleration">GPU acceleration<a href="https://storyteller-platform.dev/blog/20260221_ghost_story#gpu-acceleration" class="hash-link" aria-label="Direct link to GPU acceleration" title="Direct link to GPU acceleration" translate="no">​</a></h3>
<p>Previously to use your AMD or NVIDIA GPU for transcription, you needed to simply
change a setting in the Storyteller UI, and then when the first transcription
task was run, Storyteller would clone and build the <code>whisper.cpp</code> project from
source, and then use that to transcribe the audio file. This process could take
several minutes and needed to be repeated after every restart of the container,
which isn't ideal! Even more, since it wasn't known in advance which GPU would
be available, Storyteller would need to install the appropriate CUDA or ROCm
toolkit for the GPU, which required Storyteller to run in root mode.</p>
<p>We now
<a href="https://gitlab.com/storyteller-platform/storyteller/-/blob/main/.gitlab/ci/whisper-build.yml" target="_blank" rel="noopener noreferrer" class="">build and host all the versions of <code>whisper.cpp</code> ourselves</a>,
and bundle them with specific tags of the Storyteller <code>Docker</code> image. This means
that you can now simply change your <code>Docker</code> image to one with GPU support, and
you are good to go!</p>
<p>Please see our updated
<a class="" href="https://storyteller-platform.dev/docs/installation/gpu-configuration">GPU acceleration tutorial</a> for more
information on how to set this up!</p>
<p>We now also support a wider variety of GPU architectures, including Intel
(i)GPUs, AMD GPUs, and NVIDIA GPUs. Again, see the above guide for more
information.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="turbo-mode">Turbo mode<a href="https://storyteller-platform.dev/blog/20260221_ghost_story#turbo-mode" class="hash-link" aria-label="Direct link to Turbo mode" title="Direct link to Turbo mode" translate="no">​</a></h3>
<p>You probably know that transcribing an audiobook can take quite a while, on the
order of several hours for a full length book, even with GPU acceleration. While
there were some ways to speed it up (like transcribing multiple audio tracks in
parallel), it was still a slow process.</p>
<p>In this release, we added a new feature we call "Turbo mode" to Storyteller when
transcribing locally, which splits uses <code>whisper.cpp</code>s ability to split up the
audio into even smaller chunks, and then transcribes them in parallel. The
results can be quite impressive! Early tests on eg an RTX 5070 Ti with a 12 hour
book took less than 5 minutes to transcribe.</p>
<p>While this feature has been built into <code>whisper.cpp</code> for a while, we hadn't
really used it before, as the most important result for Storyteller alignment
algorithm, the timestamped timeline of the transcribed text, ends up being
incorrect in a number of ways when using turbo mode. Part of the work of forking
<code>echogarden</code> was to add support for fixing these issues, which we think we have
succeeded in doing!</p>
<p>So please give it a try, but be aware that issues may still arise! Please report
any issues you encounter with turbo mode to our
<a href="https://discord.gg/KhSvFqcrza" target="_blank" rel="noopener noreferrer" class="">Discord</a> or
<a href="https://github.com/storyteller-platform/storyteller/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>, but only
report issues as an alignment issue if you are unable to get a consistent
Readaloud even with a value of 1!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="remote-transcription">Remote transcription<a href="https://storyteller-platform.dev/blog/20260221_ghost_story#remote-transcription" class="hash-link" aria-label="Direct link to Remote transcription" title="Direct link to Remote transcription" translate="no">​</a></h3>
<p>Many of you come to <a href="https://discord.gg/KhSvFqcrza" target="_blank" rel="noopener noreferrer" class="">our Discord</a> with the same
question, namely: "Is it possible to use my laptop/gaming PC to do the
transcription work for Storyteller?" That answer has been "yes!" for a while
now, but wasn't that easy to figure out.</p>
<p>We had a guide called
<a href="https://web.archive.org/web/20251215000000*/https://storyteller-platform.gitlab.io/storytell/docs/community-guides/using-gpu-accelerated-whisper" target="_blank" rel="noopener noreferrer" class="">"GPU Acceleration on MacOS"</a>
that explained how to do this, but it was</p>
<ol>
<li class="">unclear that it could be used for offloading transcription on <em>any</em> platform</li>
<li class="">quite tricky to set up, as it required compiling <code>whisper.cpp</code> from source</li>
<li class="">not easy to discover in the UI, as there wasn't a dedicated setting for it
(you needed to use the "OpenAI Whisper" setting, and then manually enter the
URL of the <code>whisper.cpp</code> server)</li>
</ol>
<p>This usecase should now be much easier and clearer to setup!</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="spin-up-a-ready-to-use-whispercpp-server-with-ghost-story">Spin up a ready-to-use <code>whisper.cpp</code> server with <code>ghost-story</code><a href="https://storyteller-platform.dev/blog/20260221_ghost_story#spin-up-a-ready-to-use-whispercpp-server-with-ghost-story" class="hash-link" aria-label="Direct link to spin-up-a-ready-to-use-whispercpp-server-with-ghost-story" title="Direct link to spin-up-a-ready-to-use-whispercpp-server-with-ghost-story" translate="no">​</a></h4>
<p>We have created a CLI tool,
<a class="" href="https://storyteller-platform.dev/docs/tutorials/offloading-transcription"><code>ghost-story</code></a>, which automatically
install and spin up a <code>whisper.cpp</code> server on the machine you are offloading
transcription to.</p>
<p>We have created a dedicated guide for
<a class="" href="https://storyteller-platform.dev/docs/tutorials/offloading-transcription">offloading transcription to a different machine</a>,
which explains how to configure Storyteller to use it.</p>
<p>Sadly <code>ghost-story</code> isn't yet available for Windows, but we are working on it!</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-dedicated-guide-for-offloading-transcription-to-a-different-machine">A dedicated guide for offloading transcription to a different machine<a href="https://storyteller-platform.dev/blog/20260221_ghost_story#a-dedicated-guide-for-offloading-transcription-to-a-different-machine" class="hash-link" aria-label="Direct link to A dedicated guide for offloading transcription to a different machine" title="Direct link to A dedicated guide for offloading transcription to a different machine" translate="no">​</a></h4>
<p>We have also updated the old guide for
<a class="" href="https://storyteller-platform.dev/docs/community-guides/remote-transcription-compiled-whisper">using GPU acceleration on MacOS</a>
to also include instructions for doing so on Windows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next?<a href="https://storyteller-platform.dev/blog/20260221_ghost_story#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>We're working on a number of other features and improvements for Storyteller,
including:</p>
<ul>
<li class="">Windows support for <code>ghost-story</code></li>
<li class="">A standalone Ghost Story desktop app, making remote transcription as easy as
installing an app!</li>
<li class="">Synced notes/annotations between devices and the web reader</li>
<li class="">Improvements to the alignment algorithm</li>
<li class="">Stability improvements to the web reader</li>
</ul>
<p>We're very excited about the future of Storyteller, we hope you are too!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="technical-details">Technical details<a href="https://storyteller-platform.dev/blog/20260221_ghost_story#technical-details" class="hash-link" aria-label="Direct link to Technical details" title="Direct link to Technical details" translate="no">​</a></h2>
<p>to follow!</p>]]></content>
        <author>
            <name>Thomas F. K. Jorna</name>
            <uri>https://tefkah.com</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[v2.6.0 with OPDS support]]></title>
        <id>https://storyteller-platform.dev/blog/20260106_opds</id>
        <link href="https://storyteller-platform.dev/blog/20260106_opds"/>
        <updated>2026-01-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Heya!]]></summary>
        <content type="html"><![CDATA[<p>Heya!</p>
<p>We're excited to announce the release of Storyteller v2.6.0! This release
includes support for <a href="https://opds.io/" target="_blank" rel="noopener noreferrer" class="">OPDS</a>, which allows you to browse and
download books from your library on devices that may not support the Storyteller
apps.</p>
<!-- -->
<p>Currently we only support <a href="https://specs.opds.io/opds-1.2" target="_blank" rel="noopener noreferrer" class="">OPDS v1.2</a>, but we
plan to support <a href="https://drafts.opds.io/opds-2.0" target="_blank" rel="noopener noreferrer" class="">v2.0</a> in the future.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-access">How to access<a href="https://storyteller-platform.dev/blog/20260106_opds#how-to-access" class="hash-link" aria-label="Direct link to How to access" title="Direct link to How to access" translate="no">​</a></h2>
<p>The OPDS feed is available at <code>https://&lt;storyteller-server&gt;/opds</code>. Just add it
to your OPDS client and you should be good to go!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication-methods">Authentication methods<a href="https://storyteller-platform.dev/blog/20260106_opds#authentication-methods" class="hash-link" aria-label="Direct link to Authentication methods" title="Direct link to Authentication methods" translate="no">​</a></h2>
<p>Storyteller implements the
<a href="https://opds-spec.org/specs/authentication/1.0/index.html" target="_blank" rel="noopener noreferrer" class="">OPDS Authentication 1.0</a>
specification. Compatible clients will allow you to login with OAuth for
instance.</p>
<p>At the time of writing, only
<a href="https://www.edrlab.org/software/thorium-reader/" target="_blank" rel="noopener noreferrer" class="">Thorium Reader</a> appears to
implement this specification, all other clients tested only support basic
authentication.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="settings">Settings<a href="https://storyteller-platform.dev/blog/20260106_opds#settings" class="hash-link" aria-label="Direct link to Settings" title="Direct link to Settings" translate="no">​</a></h2>
<p>There are three settings available for OPDS:</p>
<ul>
<li class=""><strong>Enable OPDS feed</strong>: Whether to enable the OPDS feed.</li>
<li class=""><strong>Enable pagination</strong>: Whether to enable pagination for the OPDS feed. Some
clients (like Boox PushRead) do not support pagination. You can disable this
to return all items in a single response.</li>
<li class=""><strong>Page size</strong>: The number of items per page in the OPDS feed.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="caveats">Caveats<a href="https://storyteller-platform.dev/blog/20260106_opds#caveats" class="hash-link" aria-label="Direct link to Caveats" title="Direct link to Caveats" translate="no">​</a></h2>
<p>Unfortunately, due to the nature of OPDS, while we can make your books available
on devices that don't support the Storyteller apps, we can't keep track of your
progress when you read books this way. For KOReader you could try using
<a href="https://github.com/cporcellijr/abs-kosync-bridge" target="_blank" rel="noopener noreferrer" class="">ABS-KoSync Bridge</a>, which
also syncs with Storyteller.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tested-clients">Tested clients<a href="https://storyteller-platform.dev/blog/20260106_opds#tested-clients" class="hash-link" aria-label="Direct link to Tested clients" title="Direct link to Tested clients" translate="no">​</a></h2>
<p>These are the clients we've tested at time of writing. See the
<a class="" href="https://storyteller-platform.dev/docs/reading/opds">OPDS documentation</a> for an up-to-date list of supported
clients.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="works">Works<a href="https://storyteller-platform.dev/blog/20260106_opds#works" class="hash-link" aria-label="Direct link to Works" title="Direct link to Works" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://www.edrlab.org/software/thorium-reader/" target="_blank" rel="noopener noreferrer" class="">Thorium Reader</a> Only one who
supports reading Readalouds and audiobooks.</li>
<li class=""><a href="https://cantook.app/" target="_blank" rel="noopener noreferrer" class="">Cantook</a></li>
<li class=""><a href="https://help.boox.com/hc/en-us/articles/10992026883732-PushRead" target="_blank" rel="noopener noreferrer" class="">Boox PushRead</a>
(Images may not work)</li>
<li class=""><a href="https://koreader.rocks/" target="_blank" rel="noopener noreferrer" class="">KOReader</a></li>
<li class=""><a href="https://yomu.app/" target="_blank" rel="noopener noreferrer" class="">Yomu</a></li>
<li class=""><a href="http://kybook-reader.com/" target="_blank" rel="noopener noreferrer" class="">KyBook</a></li>
<li class=""><a href="https://fbreader.org/" target="_blank" rel="noopener noreferrer" class="">FBReader</a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="Storteller&amp;#39;s OPDS feed in KOReader" src="https://storyteller-platform.dev/assets/images/opds-koreader-278df2d490f4f67b0582a92700e9eeb2.png" width="607" height="339" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Storteller&amp;#39;s OPDS feed in Thorium Reader" src="https://storyteller-platform.dev/assets/images/opds-thorium-daea9a2609879f54ecc9f8b681c55e49.png" width="1924" height="1352" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="does-not-work">Does not work<a href="https://storyteller-platform.dev/blog/20260106_opds#does-not-work" class="hash-link" aria-label="Direct link to Does not work" title="Direct link to Does not work" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://moonreader.app/" target="_blank" rel="noopener noreferrer" class="">MoonReader+</a> (Only tested on an older version, let
us know if you can confirm it works with a newer version)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting--feedback">Troubleshooting &amp; Feedback<a href="https://storyteller-platform.dev/blog/20260106_opds#troubleshooting--feedback" class="hash-link" aria-label="Direct link to Troubleshooting &amp; Feedback" title="Direct link to Troubleshooting &amp; Feedback" translate="no">​</a></h2>
<p>If you're having trouble accessing your library with OPDS, or if you want to see
another client added to the list, feel free to reach out to us on
<a href="https://discord.gg/KhSvFqcrza" target="_blank" rel="noopener noreferrer" class="">Discord</a> or open an issue on
<a href="https://gitlab.com/storyteller-platform/storyteller/-/issues" target="_blank" rel="noopener noreferrer" class="">GitLab</a>.</p>]]></content>
        <author>
            <name>Thomas F. K. Jorna</name>
            <uri>https://tefkah.com</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[@storyteller-platform/mobile v2.0.0]]></title>
        <id>https://storyteller-platform.dev/blog/storyteller-mobile-apps-v2</id>
        <link href="https://storyteller-platform.dev/blog/storyteller-mobile-apps-v2"/>
        <updated>2025-12-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Merry Christmas!]]></summary>
        <content type="html"><![CDATA[<p>Merry Christmas!</p>
<p>I’m <em>absolutely jazzed</em> (and not a little relieved) to announce the first v2
release of the Storyteller mobile apps! This has been a long time coming — the
new apps represent a vision that’s been in the works for 9 months, starting with
the first commit to the web v2 branch.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://storyteller-platform.dev/blog/storyteller-mobile-apps-v2#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<ul>
<li class="">Design refresh: new home screen and updated UI</li>
<li class="">Search for books</li>
<li class="">Support standalone audiobooks and ebooks!</li>
<li class="">Move to a browser-based login flow that supports OAuth login</li>
<li class="">Browse your server’s books even when you’re offline</li>
<li class="">View books by author, tag, collection, and series</li>
<li class="">Improved table of contents in listen mode for readaloud books</li>
<li class="">Log in to multiple servers at once</li>
<li class="">Edit and delete custom themes and fonts</li>
<li class="">Choose a custom readaloud color</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updating">Updating<a href="https://storyteller-platform.dev/blog/storyteller-mobile-apps-v2#updating" class="hash-link" aria-label="Direct link to Updating" title="Direct link to Updating" translate="no">​</a></h2>
<p>Once the apps are available in the app stores, you can install the new version.
Your app will automatically migrate on startup. If you run into any issues,
please reach out on GitLab or Discord!</p>
<p>Note: When you first upgrade to v2, you will be logged out of the app. Click on
the settings gear in the top right, click on Log in, and follow the auth flow to
log back in!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="design-refresh">Design refresh<a href="https://storyteller-platform.dev/blog/storyteller-mobile-apps-v2#design-refresh" class="hash-link" aria-label="Direct link to Design refresh" title="Direct link to Design refresh" translate="no">​</a></h2>
<div margin:="" borderradius:="" overflow:="">
<p><img decoding="async" loading="lazy" alt="A screenshot of the new home screen" src="https://storyteller-platform.dev/assets/images/mobile-v2-home-5e0957ebf130fbc3b6946de48066cc4c.png" width="1224" height="2700" class="img_ev3q"></p>
</div>
<p>The app has a new home screen, modeled after the web app’s home page. See your
books organized by status and collection. We’ve also made long lists of books
<em>much</em> snappier to load and scroll through.</p>
<p>Across the app, you’ll notice smaller UI improvements as well. Better spacing,
better sliders, better toggles, etc.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="search-for-books">Search for books<a href="https://storyteller-platform.dev/blog/storyteller-mobile-apps-v2#search-for-books" class="hash-link" aria-label="Direct link to Search for books" title="Direct link to Search for books" translate="no">​</a></h2>
<div margin:="" borderradius:="" overflow:="">
<p><img decoding="async" loading="lazy" alt="A screenshot of the new search bar" src="https://storyteller-platform.dev/assets/images/mobile-search-0e16b3a94e08835e70f6f2ce84936de0.png" width="1224" height="1454" class="img_ev3q"></p>
</div>
<p>You can now search for books from the home screen. You can search for books by
title, author, series, or tag.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-standalone-audiobooks-and-ebooks">Support for standalone audiobooks and ebooks<a href="https://storyteller-platform.dev/blog/storyteller-mobile-apps-v2#support-for-standalone-audiobooks-and-ebooks" class="hash-link" aria-label="Direct link to Support for standalone audiobooks and ebooks" title="Direct link to Support for standalone audiobooks and ebooks" translate="no">​</a></h2>
<p>You can finally read and listen to your standalone audiobooks and ebooks on the
Storyteller app! You can even download just the ebook for a readaloud if you’re
short on bandwidth, and then switch to the full readaloud later when you’re on
WiFi. We’ll keep your place!</p>
<p>Note: Switching between the standalone ebook and audiobook for a single book
will currently lose your place. In the future, we’ll be able to roughly keep
your position in this situation!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="browser-based-login-flow">Browser-based login flow<a href="https://storyteller-platform.dev/blog/storyteller-mobile-apps-v2#browser-based-login-flow" class="hash-link" aria-label="Direct link to Browser-based login flow" title="Direct link to Browser-based login flow" translate="no">​</a></h2>
<p>The Storyteller mobile apps now use your mobile browser to log in. This means
that if you’re logged in to the web app on your mobile device, clicking the Log
in button in the app will automatically log you in instantly!</p>
<p>It also means that you can use OAuth to log in to the mobile apps. Now that this
is available, a future web app release will include a setting that allows users
to disable non-OAuth login for their servers!</p>]]></content>
        <author>
            <name>Shane Friedman</name>
            <uri>https://smoores.dev</uri>
        </author>
    </entry>
</feed>