AI systems25 min read
Whisper Architecture: From Audio Waveform to Text
Follow Whisper from the raw waveform to the final text: the encoder, the decoder, the self-KV and cross-KV caches, and the decoding loop.
The goal: understand Whisper from the highest level down to the internal transformer operations. That includes the encoder, the decoder, the self-KV cache, the cross-KV cache, the decoding loop, and why these components matter for performance.
I use simple English first, then build up to the implementation details. The diagrams are important, because Whisper is easier to understand as a sequence of data transformations than as a collection of neural-network terms. If you prefer to watch, the video above walks through the same architecture.
Executive summary
Whisper is an automatic speech recognition (ASR) model. It converts spoken audio into text.
The most important idea is this: Whisper has two main neural-network parts.
- Encoder: listens to the audio and converts it into a representation of what was heard.
- Decoder: uses that representation to generate text, one token at a time.
- 1. Input audioWaveform: speech as a sequence of numbers
- 2. Audio encoderConverts audio features into audio representations
- 3. Text decoderPredicts the next text token using attention and cached K/V values
- 4. Output textTokens are converted back into readable words and punctuation
The decoder uses two kinds of attention:
| Attention mechanism | What it looks at | What its KV cache stores |
|---|---|---|
| Self-attention | Previously generated text tokens and the current token | Keys and values derived from text-token representations |
| Cross-attention | The audio representation produced by the encoder | Keys and values derived from encoder output |
These caches solve different problems. Self-KV grows as text is generated. Cross-KV is reusable for the same encoder output and a compatible decoding setup.
That distinction is central to understanding Whisper’s performance, and to my work on running Whisper inside a trusted execution environment (TEE).
The complete architecture
- Raw audio waveform16,000 samples per second in standard Whisper preprocessing
- Audio preprocessingResampling if needed → log-Mel spectrogram
- A. Audio encoderConvolutional layers → positional information + Transformer encoder blocks → encoder output: audio features H
- Audio features go to cross-attention
- B. Text decoderPrevious text tokens + current token → masked self-attention + Self-KV → cross-attention + Cross-KV from H → feed-forward network + output projection
- Next-token probabilities → selected token
↺ Repeat the decoder step until an end condition is reached.
What happens to the data?
Each stage changes the form of the data.
| Stage | Input | Output | Purpose |
|---|---|---|---|
| Audio sampling | Physical sound | Numeric waveform | Represent sound digitally |
| Log-Mel transform | Waveform | Time-frequency features | Make useful acoustic patterns visible to the model |
| Encoder | Acoustic features | Context-aware audio vectors | Represent speech sounds and their context |
| Decoder | Tokens and encoder output | Next-token scores | Predict the transcription |
| Token decoding | Token IDs | Text | Produce readable output |
Audio preprocessing: how sound becomes numbers
A computer does not hear words directly. It receives a waveform: a long sequence of numbers that represents changes in air pressure.
Step 1: The waveform
Imagine someone says: “The server is running.” The microphone records the sound as a changing signal.
In standard Whisper preprocessing, audio is resampled to 16 kHz. This means 16,000 samples represent each second of audio. For 30 seconds:
That gives 480,000 waveform samples for a mono recording.
Step 2: The log-Mel spectrogram
Whisper does not send all those raw samples directly into the transformer encoder. It converts the audio into a log-Mel spectrogram. Think of it as a heat map:
- Horizontal axis: time.
- Vertical axis: frequency bands.
- Brightness or colour intensity: strength of the sound in a frequency band.
The standard Whisper configuration uses 80 Mel-frequency channels, with a 25 ms analysis window and a 10 ms stride. A 30-second input produces 3,000 time frames before the encoder’s convolutional downsampling.
Why use a spectrogram? The waveform tells us how the signal changes. The spectrogram makes frequency patterns over time easier for the neural network to process.
Step 3: Convolutional downsampling
Whisper’s encoder starts with two one-dimensional convolutional layers.
- Log-Mel features80 channels × 3,000 time frames
- Conv1 + GELUExtract local patterns
- Conv2 + GELUReduce the time dimension by about 2×
- Encoder input1,500 time positions × model hidden dimension
The encoder therefore processes 1,500 positions for a full 30-second input, rather than 3,000 spectrogram frames. This is a major reduction in sequence length.
The audio encoder: understanding the sound
The encoder’s job is to convert the spectrogram into useful representations of the audio. It does not need to decide the exact text token at every position. Instead, it creates representations that the decoder can use to generate the transcription.
- Log-Mel features after convolution
- Add sinusoidal positional embeddingsTell the model where each audio position occurs
- Transformer encoder blocksMulti-head self-attention → feed-forward network
- Audio representation HContext-aware vectors for the audio
What does encoder self-attention do?
Suppose the speaker says: “I deposited money into the bank.” A local sound may be unclear. The surrounding audio can help the model interpret it. Self-attention lets an audio position use information from other positions in the same audio sequence. For example:
- A sound at one position can use information from nearby sounds.
- It can also use information from a later position.
- The encoder can combine information from different parts of the audio.
Unlike the decoder’s masked self-attention, the encoder’s self-attention can normally examine both earlier and later audio positions.
What is the encoder output?
For a full 30-second input in Whisper Tiny.en:
This represents 1,500 audio positions, each with 384 numerical features. The actual tensor also includes a batch dimension.
The encoder processes the audio once for a given input. Its output then becomes the memory that the text decoder reads through cross-attention.
The decoder: generating the transcript
The decoder is an autoregressive transformer. Autoregressive means that it generates an output sequence step by step. It predicts the next token from the tokens already generated and the encoder’s audio representation. Consider the example “The server is running.” A simplified generation sequence might look like this:
- Step 0: initial promptstart of task · language · transcribe
- Step 1The
- Step 2The server
- Step 3The server is
- Step 4 and onwardThe server is running.
This is a simplified illustration. Actual Whisper tokens can represent subword pieces, punctuation, timestamps, or task markers. A single word may need more than one token.
Inside each decoder block
Every standard Whisper decoder block contains three main operations:
- Masked self-attention: uses the generated text prefix and Self-KV.
- Cross-attention: uses the encoder output and Cross-KV.
- Feed-forward network: processes the combined representation.
Each operation also uses residual connections and layer normalization. This pattern repeats across the decoder layers. Each layer has its own attention projections and its own K/V tensors.
The decoder must combine two types of evidence:
- Text context: what has already been generated?
- Audio context: what does the original recording support?
Self-attention supplies the first. Cross-attention supplies the second.
Attention, Query, Key and Value: the foundation of KV caching
Before explaining the caches, we need to understand what attention does. Imagine a library.
- Query (Q): the question you ask.
- Key (K): the label used to identify relevant information.
- Value (V): the actual information you retrieve.
Attention compares a query with keys. It uses the comparison scores to decide how much information to take from each value.
The mathematical operation
For one attention head:
X_q: input used to generate queries.X_k: input used to generate keys and values.W_Q, W_K, W_V: learned projection matrices.d_k: dimension of each attention head.
- Query (Q)What information is needed now?
- Keys (K)Which stored positions are relevant?
- Values (V)What information should be retrieved?
- Attention outputA weighted combination of values, based on query-key similarity
The same basic attention operation is used for both self-attention and cross-attention. The difference is the source of X_q and X_k.
What does multi-head attention mean?
Instead of performing just one attention calculation, Whisper divides the hidden representation into multiple attention heads. Each head can learn different relationships. For example, one head might focus on nearby positions, while another might learn longer-range relationships. These are illustrative possibilities, not fixed roles. The outputs of the heads are combined and passed through another learned projection.
Self-KV cache: remembering the generated text
The problem without a cache
Suppose Whisper has generated the tokens The → server → is → running. When it generates the next token, a basic implementation could process the entire prefix again: process The, process server, process is, process running, and calculate all the attention projections again. This repeats work that was already completed, and the repeated work grows as the transcript gets longer.
The solution: Self-KV
For each decoder layer, Whisper stores the keys and values calculated for the text tokens it has already processed. When a new token arrives, Whisper calculates its new K/V entries and appends them to the cache.
V1
V1K2
V2
V1K2
V2K3
V3
What is actually stored?
For each decoder layer:
- The key projection of each processed text position.
- The value projection of each processed text position.
The cache does not normally store the final predicted word as its K/V entry. It stores numerical representations calculated from the decoder’s hidden states. It also does not need to cache the query in the standard K/V caching design, because the query is calculated for the current decoding step.
What happens at the next token?
Suppose the cache already contains K/V entries for The server is. The decoder receives the next input token, calculates its query, key and value, then uses:
The semicolon represents concatenation along the sequence dimension. The new query can attend to the earlier keys and the current key. It then retrieves information from the corresponding values.
The cache saves the need to recalculate the old tokens’ K/V projections. It does not remove the attention calculation against the cached keys and values.
Why is decoder self-attention masked?
During generation, Whisper must not use future text tokens that have not been generated yet. For example, when it predicts is, it cannot use the future token running. The causal mask prevents attention to future positions.
| Query token | The | server | is |
|---|---|---|---|
| The | Allowed | Blocked | Blocked |
| server | Allowed | Allowed | Blocked |
| is | Allowed | Allowed | Allowed |
During incremental inference, Whisper usually processes only the newly available decoder token after the initial prompt. The cached prefix supplies the historical K/V entries. The OpenAI implementation uses hooks to append Self-KV entries and uses the cached K/V values on later decoding steps.
Cross-KV cache: remembering the encoded audio
Cross-KV is different. It stores information derived from the audio encoder output, not the generated text.
Why does the decoder need cross-attention?
Imagine Whisper has generated “The server” and needs to predict what comes next. Self-attention tells it what the previous text says. But previous text alone is not enough. The decoder also needs to consult the recording to decide whether the speaker said is, was, or something else. Cross-attention provides this connection to the audio.
Where do Cross-K and Cross-V come from?
The encoder produces the audio representation H. Each decoder layer has its own cross-attention key and value projections:
The exact matrices differ by decoder layer. These projections are calculated for the encoder output and cached. On later decoding steps, the decoder reuses the same Cross-KV tensors while it uses new queries derived from the evolving text.
- Audio encoder output HFixed for the current encoded audio
- Cross-attention K/V projectionsPerformed separately in each decoder layer
- Cross-K and Cross-VAudio keys and audio values
- Reuse on each decoder stepNew text query + cached audio K/V
Why can Cross-KV be reused?
The audio representation is fixed for a particular encoder result. The decoder’s generated text changes, but the audio representation does not change because another text token is generated. So for the same audio encoder output and a compatible model setup, the decoder can reuse the same Cross-KV tensors instead of projecting the entire audio representation again on every token step.
Pay attention to the exact condition: the reuse is valid only when the cached projections correspond to the encoder output and model weights being used. If the audio is re-encoded into a different representation, the previous Cross-KV is not automatically valid.
What changes during generation?
| Property | Self-KV | Cross-KV |
|---|---|---|
| Source | Decoder hidden states for text tokens | Encoder output for audio |
| Created from | Text-token processing | Audio representations |
| Changes on each new text token? | Yes, new entries are appended | No, not for the same encoder output |
| Sequence dimension | Grows with the decoded prefix | Fixed for the current encoder output |
| Primary benefit | Avoids repeating old text K/V projections | Avoids repeating audio K/V projections |
| Must be refreshed when | Starting a new incompatible decoding context | The underlying encoded audio or projection setup changes |
An important implementation detail
The two caches may share the same dictionary in the reference implementation, but they are not one interchangeable cache. The OpenAI code distinguishes them through the attention modules and the shape and reuse logic:
- Self-attention K/V entries are extended as the text prefix grows.
- Cross-attention K/V entries are computed from the encoder output and reused.
This detail matters when you read the actual source code. A cache dictionary is just the container. The meaning of a cache entry depends on which layer and projection produced it.
Self-KV versus Cross-KV: one complete example
Suppose the audio says “Transfer the money tomorrow.” Whisper encodes the audio once, then starts decoding.
- InitialisationThe encoder processes the audio and creates H. Cross-KV is computed, so audio K/V are available to every decoder layer.
- Generation step 1Prefix: task prompt. Self-KV: prompt entries are created. Cross-KV: reused. Output: “Transfer” (illustrative tokenization).
- Generation step 2Prefix: task prompt + “Transfer”. Self-KV: append entries for the new input. Cross-KV: reused. Output: “the”.
- Generation step 3Prefix: task prompt + “Transfer the”. Self-KV: append again. Cross-KV: reused. Output: “money”.
- Later stepsThe same pattern continues until the decoder emits an end-of-task token or reaches a stopping limit.
The key distinction is not that one cache is important and the other is not. Both reduce repeated computation, but they preserve different information.
Inside one decoder layer: where the caches are used
Here is how the two caches connect to the actual computation inside a decoder block.
The model uses residual connections, so each sublayer adds its transformed result to its input. Layer normalization keeps the numerical values well behaved. The feed-forward network uses two learned linear transformations with a GELU activation between them.
A subtle but important point about queries
At a given decoding step:
- The current token produces a new self-attention query.
- The current token also produces a cross-attention query.
- The Self-KV cache supplies the accumulated text keys and values.
- The Cross-KV cache supplies the keys and values derived from the audio.
The queries are not shared between the two attention operations. Each attention module has its own learned projection matrices.
Whisper model sizes and architecture dimensions
Whisper uses the same general encoder-decoder design across several model sizes. The number of layers, attention heads and hidden dimensions changes. The table lists the standard OpenAI model configurations. Values are per model, not per batch.
| Model | Encoder layers | Decoder layers | Hidden dimension | Attention heads | Parameters (approx.) |
|---|---|---|---|---|---|
| Tiny | 4 | 4 | 384 | 6 | 39 million |
| Base | 6 | 6 | 512 | 8 | 74 million |
| Small | 12 | 12 | 768 | 12 | 244 million |
| Medium | 24 | 24 | 1,024 | 16 | 769 million |
| Large | 32 | 32 | 1,280 | 20 | 1.55 billion |
The standard OpenAI tiny.en configuration uses the Tiny-sized architecture. Its English-only vocabulary differs from the multilingual vocabulary, but the broad architecture is the same.
What do these dimensions mean in practice?
For tiny.en:
- Encoder hidden dimension: 384.
- Encoder attention heads: 6.
- Decoder hidden dimension: 384.
- Decoder attention heads: 6.
- Encoder layers: 4.
- Decoder layers: 4.
- Audio context length: 1,500 positions for a standard 30-second input.
- Text context limit: 448 positions.
Each attention head has a dimension of:
A single Self-K tensor at one decoder layer contains a sequence dimension, six heads, and 64 features per head, conceptually:
Similarly, Cross-KV has an audio sequence dimension:
Here, B is the batch size and T_text is the number of cached text positions. The reference implementation stores K/V in a layout that is first represented as batch × sequence × hidden dimension, then reshapes it into attention heads during computation.
These shapes explain why the two caches behave differently. Self-KV grows along the text dimension, while Cross-KV stays fixed along the audio dimension for a given encoded audio input.
Why Whisper has task tokens
Whisper is not limited to transcribing English speech into plain text. It supports several related tasks through a shared model. Special tokens tell the decoder what kind of output is expected.
| Token or token family | Purpose |
|---|---|
| Start-of-transcript token | Starts a transcription or related task sequence |
| Language token | Identifies the target or detected language |
| Task token | Distinguishes transcription from translation |
| No-timestamps token | Requests text output without timestamp tokens |
| Timestamp tokens | Represent time positions in the output |
| End-of-task token | Signals the end of a decoding task |
| No-speech token | Helps identify audio with no speech |
For example, a multilingual transcription prompt can conceptually contain start of transcript → language → transcribe → text. A translation prompt instead signals the translation task. Whisper then generates English text from the speech, even if the source audio is in another language. These are special tokens in the model vocabulary, not ordinary words. The exact prompt sequence depends on the task and decoding options.
Why this matters for KV caching
The initial prompt is also processed by the decoder, and its token representations contribute entries to Self-KV. So the cache is not limited to the words in the transcript. It can also contain entries for the task prompt and other preceding tokens.
How the complete decoding loop works
The model does not generate the entire transcript in one decoder step. The usual inference process is iterative.
- Audio input → log-Mel preprocessing
- Run the encoder → audio representation H
- Create the decoder prompt and compute decoder K/VSelf-KV stores text K/V. Cross-KV stores audio K/V.
- Predict the next token
- End token or limit reached?No → append the selected token, compute K/V for the new text input, and predict again. Yes → return the generated tokens.
- Convert tokens to text
↺ Steps 4 and 5 repeat for every new token.
The loop, in simple terms
- Convert the audio into a log-Mel spectrogram.
- Run the encoder to produce audio features.
- Prepare the initial task prompt.
- Run the decoder and initialise the caches.
- Predict the next token.
- Select a token with the configured decoding strategy.
- If generation is not complete, feed the new token into the next decoder step.
- Append new Self-KV entries and reuse Cross-KV.
- Continue until the task ends or a decoding limit is reached.
- Convert the generated tokens into the final output.
Whisper can use greedy decoding or beam search, depending on the configuration. With beam search, it may keep multiple candidate sequences. The implementation must keep the corresponding Self-KV state aligned with the selected candidate sequences.
KV cache memory: how much space does it need?
Caching reduces repeated computation, but it uses memory. This is an important trade-off.
A simple formula
For a standard multi-head attention layer, the combined size of its K and V tensors is approximately:
B: batch size.L: number of layers.T: sequence length.d: hidden dimension.s: bytes per stored element.- The factor 2 represents Key and Value.
This is a simplified formula for one cache type. It assumes the same hidden dimension and sequence length across layers.
Example: Whisper Tiny.en
Assume batch size B = 1, four decoder layers, hidden dimension d = 384, FP16 cache elements (s = 2 bytes), 100 text positions in Self-KV and 1,500 audio positions in Cross-KV.
| Cache | Estimated size | Calculation |
|---|---|---|
| Self-KV | 0.59 MiB | 4 layers × 100 positions × 384 features × 2 (K and V) × 2 bytes |
| Cross-KV | 8.79 MiB | 4 layers × 1,500 positions × 384 features × 2 (K and V) × 2 bytes |
These estimates exclude the encoder output itself, model weights, temporary attention tensors, allocator overhead and other runtime memory.
Why KV caching improves performance
Without caching, the decoder may repeatedly project the same historical text and audio representations into K/V tensors. With caching:
- Previously processed text K/V can be reused.
- Audio K/V projections can be reused for the same encoder output.
- The decoder can process only the newest text token in incremental generation.
However, the decoder still performs attention calculations against cached entries. The cache reduces repeated projection work, not every operation in attention.
| Operation | With KV caching |
|---|---|
| Recompute old text K/V projections | Avoided during normal incremental decoding |
| Recompute audio K/V projections every token | Avoided for a compatible, unchanged encoder output |
| Calculate the current token’s queries | Still required |
| Attend over historical text K/V | Still required |
| Attend over encoded audio K/V | Still required |
| Run feed-forward networks for the current token | Still required |
There is another trade-off: caching uses memory bandwidth and storage. If the cache is too large, moving and reading the cached tensors can become expensive. This matters especially when inference runs across separate processes, devices or protected environments.
Whisper in my SGX/TEE research
My work on native-sgx-whisper makes one distinction particularly important: reusing a cache is not the same as reusing a valid cache. Here is the relevant data path.
- Audio input
- EncoderCreates the representation for the current audio input or chunk
- Cross-KVDerived from the current encoder output
- Decoder + Self-KVGenerates the text token by token
- Transcript
This is a conceptual architecture. It does not imply that every component runs inside the same enclave, or that cache contents are automatically protected during every transfer. That depends on the actual implementation and trust boundaries.
Cross-KV reuse: the critical constraint
Consider two different audio chunks:
- Chunk A: seconds 0 to 30.
- Chunk B: seconds 20 to 50.
Even though they overlap for ten seconds, their encoder outputs are not automatically interchangeable. The encoder can use context across positions, so a different chunk boundary can change the representation of even overlapping audio. Therefore, Cross-KV for Chunk A cannot be assumed valid for Chunk B.
Self-KV reuse: a different constraint
Self-KV represents the decoder’s previous hidden states. Suppose the decoder generated a prefix for Chunk A. It is tempting to reuse that Self-KV for Chunk B, because some words may be the same. That is not automatically correct. The hidden states depend on the decoder context, including the token prefix and positions. If the prefix, the token positions or the decoding state changes, old Self-KV may no longer represent the required state. The same words do not guarantee the same cached representations.
Can an existing KV cache be reused?
Why this matters for my performance experiments
For a Whisper Tiny.en pipeline, separate these potential costs:
| Cost | What to measure |
|---|---|
| Encoder recomputation | How often the same audio is encoded again |
| Cross-KV projection | Time spent producing audio K/V tensors |
| Cross-KV reads | Time and data volume spent reading cached audio K/V |
| Self-KV projection | Work for new decoder positions |
| Self-KV reads | Time spent accessing historical text K/V |
| State transfer | Time spent moving state between protected components |
| Decoding | Time spent on attention, feed-forward computation and token selection |
A cache reuse optimization should also be tested for transcript equivalence or quality. A faster output that changes the transcription is not an equivalent optimization.
My earlier experiments found that the skip_encode/KV reuse path caused transcript divergence. The right conclusion is that this tested reuse path was not correct for the tested conditions, not that all Cross-KV caching is unsafe. The reference Whisper implementation itself uses Cross-KV caching for unchanged audio features. The issue is whether the particular state being reused is valid.
Training versus inference
Whisper’s architecture is easier to understand if we separate training from inference.
Training
During training, the model is given audio and the corresponding reference text. The decoder learns to predict the next token from the preceding reference tokens and the encoder output. For example:
- Audio: a recording of someone speaking.
- Reference:
The server is running. - Decoder input: a shifted version of the reference token sequence.
- Training target: the next token at each position.
The model compares its predicted token probabilities with the reference targets, and the training loss is used to update the model weights. The full target sequence can be processed in parallel with causal masking.
Inference
During inference, the correct transcript is not available in advance. The decoder must select its own next token, then use that token as part of the next input. It predicts one step at a time, updates Self-KV and reuses Cross-KV for the same encoded audio. This is why incremental decoding and KV caching are particularly useful during inference.
Technical definition tree
Use this tree as a reference when you read Whisper source code or papers.
Whisper ASR
├── Audio preprocessing
│ ├── Waveform
│ ├── Log-Mel spectrogram
│ └── Convolutional downsampling
├── Audio encoder
│ ├── Positional embeddings
│ ├── Multi-head self-attention
│ └── Audio representation H
├── Text decoder
│ ├── Token embeddings
│ ├── Masked self-attention
│ │ └── Self-KV cache
│ ├── Cross-attention
│ │ └── Cross-KV cache
│ ├── Feed-forward network
│ └── Vocabulary logits
└── Decoding and postprocessing
├── Greedy or beam search
├── Special-token handling
└── Text and optional timestampsKey technical terms
| Term | Tiny definition | Why it matters |
|---|---|---|
| Transformer | A neural network that uses attention | Core of Whisper’s encoder and decoder |
| Attention | A weighted lookup of relevant information | Connects audio and text context |
| Query | The current information request | Changes with the current decoder representation |
| Key | A representation used to calculate relevance | Stored in the K cache |
| Value | The information retrieved by attention | Stored in the V cache |
| Self-attention | Attention within one sequence | The decoder uses it for text history |
| Cross-attention | Attention from one sequence to another | Connects generated text with audio |
| KV cache | Stored key and value tensors | Avoids repeating some projections |
| Causal mask | A rule that blocks future tokens | Prevents future-text leakage during generation |
| Logits | Scores for possible next tokens | Used to select the next output |
| Autoregressive decoding | Generating tokens one step at a time | Explains the decoding loop |
| Encoder output | Learned audio representations | Source of Cross-KV |
Final mental model
Remember these three pictures.
Audio → Encoder → Audio representationsIt converts sound into representations that the decoder can consult.Text prefix → Self-KV → grows with each new positionIt avoids repeating old text key and value projections.Encoder output → Cross-KV → reused for the same audioIt avoids repeating the audio key and value projections at each step.The single most important distinction:
- Self-KV: derived from decoder text states. Its sequence length grows as the decoder processes more tokens.
- Cross-KV: derived from encoder audio states. Its sequence length stays fixed for the same encoder output.
- Neither cache replaces attention. Both let attention reuse previously computed K/V tensors.
The next step is to trace these operations in OpenAI’s implementation:
model.py: encoder, decoder, attention projections and cache hooks.decoding.py: incremental decoding, token selection and cache lifecycle.
Confidence and sources
I have high confidence in the architecture and in the distinction between Self-KV and Cross-KV. These descriptions are consistent with the original Whisper paper and the OpenAI reference implementation. The cache memory figures are illustrative calculations, not measured runtime values. Whether cache reuse is valid across protected execution components depends on the actual encoder input, decoder state, model configuration and implementation.
- Radford et al., “Robust Speech Recognition via Large-Scale Weak Supervision” (the Whisper paper).
- openai/whisper reference implementation.
- My video walkthrough of the Whisper architecture.
Signup for Updates:
I promise to only email you cool shit. Draft chapters, progress updates, sneak peaks at illustrations I'm working on. Stuff like that.