Skip to content

Releases

1.2.0

Choose a tag to compare

@github-actions github-actions released this 16 Sep 00:20
1.2.0
35d65d2
  • The notification sounds are now the extension's own, the same on every platform: 60 of them in 2.6 MB, generated for it with Stable Audio Open (a default and a handful of alternatives per event, the prompt and seed behind each kept in assets/sounds/prompts.json), loudness-matched and grouped by event in Configure Notification Sounds, with the actions first and the sounds below, next to a sound file of your own and the system sounds as before. The system libraries differ per platform, the Windows ones are quiet, and a name synced from another machine named nothing; a system name this machine does not have now plays the built-in sound for the event. The tool sound (for the tools in notifications.toolFilter, Bash unless changed) and the subagent sound are on by default, each with its own sound; the prompt sound stays a choice, as the person who submits a prompt is already looking at it. The feature is called notification sounds everywhere now; it was "completion sounds" in the menu and "notification" in the settings.
  • On Windows without ffplay, the neural engines play through one player kept for the session: it starts a file in under 100 ms, queues the parts of a streamed utterance as PCM on the audio device (winmm) so they play without a gap, pauses mid-word, and takes the volume. A PowerShell started for every file cost about 850 ms of silence per sentence and could do none of that, and playing a file per part through MediaPlayer left 35-90 ms of silence at every seam and up to 250 ms when the part arrived just in time, heard as a stutter every second once the engine streamed a part a second. The host starts at activation and stays for the session (starting it costs 1.5-2 s, which the first sentence after every quiet stretch used to pay). Where ffplay is installed it keeps its place, for its tempo.
  • Qwen3 on the PyTorch runtime generates faster than it speaks on an NVIDIA GPU (measured on a laptop: 0.75x realtime, from 1.65x slower than speech), so a message plays continuously from its first sentence, which starts about 1.5 s after the model is ready. The 15 steps that make each frame's codebooks are recorded once as a CUDA graph and replayed (the loop was bound by launching 6,500 GPU kernels per frame from Python, not by the GPU), and the codec decoder keeps its state between the parts of a sentence, so each part costs only its own frames; decoding the whole prefix and the voice's reference for every part had cost more than the generation itself once the generation was fast. The daemon warms up before it reports ready, so the first sentence is no slower than the second. Set Up the Best Voice recommends Qwen3 on a Windows or Linux machine with an NVIDIA driver, and Kokoro, which keeps up with Claude on any machine, where there is none; the cloning engines stay a choice away for a voice of your own.
  • Qwen3 on the PyTorch runtime speaks a whole message without pauses between its sentences, and starts sooner: the daemon generates the chunks queued together in one pass (a model step costs the same for eight sentences as for one, measured: seven sentences in 1.1 times the time of one), so every sentence after the first is ready by its turn where before each one was generated while the one before it played and the listener waited for the difference (measured on a laptop with an NVIDIA GPU: a five-sentence paragraph played in 31 s instead of 45, with no gap between sentences instead of 2-4 s each). The wait before the first sentence is a third shorter, because it was buffering the wall-clock shortfall in seconds of audio, which on an engine 1.9x slower than speech is 1.9 times what it needs. The streamed parts of a cloned voice are now decoded with the reference in front, as the whole utterance is: without it the opening seconds of a sentence decoded to other audio than the rest and the voice changed at the seam.
  • The first word arrives in seconds on Windows and Linux with Qwen3 (measured: the first audio 1.1 s after the request, then a part every 1.3 s, where the whole chunk took 14 s before). Its PyTorch runtime now streams: the frames the model has made so far are decoded and played while the rest generates (the codec decoder is causal, and it runs in float32 so every part decodes the same), a cancel ends the generation at once rather than after it, and each frame's codebooks are sampled directly instead of through a full generation pass per frame, which measured 20-25% faster. Off Apple Silicon its pace is planned from what that runtime delivers, and its chunks are sized so that the waits fall between sentences.
  • On Windows with an NVIDIA GPU, setting up Qwen3 or Chatterbox installs the build of PyTorch that uses it; the build PyPI ships there runs on the CPU, several times slower than speech, and nothing said so. An existing install that runs on the CPU is named in Check Setup and, when the engine loads, in a message; running the engine's setup again installs it for the GPU. Setting an engine up again for the GPU stops the running engine first: Windows cannot delete or overwrite the files a running daemon holds, so the reinstall failed part-way.
  • On Windows the built-in voice speaks through one PowerShell process kept for the session, instead of starting a PowerShell and the speech runtime for every sentence: sentences follow each other without the second or two of silence that cost, speech no longer falls behind Claude, and pausing now holds the sentence mid-word rather than after it. Exports of the built-in voice are rendered through the same process. Where that process cannot start, sentences are spoken the old way. A render for export does not start a speech host after the engine was replaced.
  • Every download says how far it is: the Kokoro and Piper archives, uv and a translation model report their bytes against the size the server names ("120 of 335 MB (35%)", with the bar following), and an engine install shows the packages uv is fetching by name and size with how much of what it has announced is done, where it used to show uv's last output line. A translation model is fetched by the extension itself rather than by the translation runtime, so it goes through the editor's proxy like every other download.
  • Translated tool announcements name the tool and the file: "Writing edit_design.py" went through the translator as a verb in front of a hidden file name, which one model rendered as "tag:" every time; the verb phrase is now translated on its own ("Writing the file") and the file name follows it as written. A sentence whose file names the model drops is no longer left in the source language: it is asked for on its own, and then with the names in the open, so the sentence is heard in the chosen language at the cost of a possibly misspelled name.
  • Designing a voice keeps every take. Each rendering comes out different, and "Try again" threw the previous one away; now every take stays in a list that plays each one as you move over it, with rows to render another take or to change the description (the takes so far are kept), and the name step comes back to the list rather than discarding the rendering. The newest take plays as the list opens.
  • Designing a voice for a language the designer cannot read now offers to install Chatterbox first, since it is what records the voice in that language; before, the design ran for minutes and then reported that the recording could not be made. Its first recording fetches Chatterbox's own weights (about 2.5 GB), and the notification now says so and shows how far the download is, where it used to say "recording the voice" for those minutes.
  • A voice of your own is auditioned with a sentence in the language it was made for, spoken as that language. Every voice read the same English sentence, and a voice designed for another language read it as if it were that language, which was heard as an accent the voice does not have.
  • The boxes a flow asks you to type into stay open when the window loses focus. Switching to another window to copy a voice description closed the box as "back", and the step before it closed the same way, so the language list was what you came back to.
  • A cloned voice whose reference recording has long pauses inside it (a designed voice's passage rendered with 0.7-0.85 s between its sentences) no longer swallows sentences: the model ended four in ten after two frames, having learnt from the reference that silence is followed by the end. The daemons hand the model a copy of the reference with pauses over 0.4 s shortened to 0.3 s and the edges trimmed; the profile's own recording is untouched.
  • Notification sounds play on Windows, at the volume set: the hook started its player detached, and a process started that way exited within 60 ms without playing (measured with a marker file), and the player it used ignored the volume. The player is now started by a launcher of its own with its window hidden, so it outlives the hook and plays to the end without a console window appearing; the hook waits about 200 ms for the launcher. A sound highlighted in the picker is auditioned through the player speech uses, so it is heard on the first highlight rather than after a process start.
  • Notification sounds play on Windows 11: the sound each event fell back to when the configured name was not found ("Windows Proceed") no longer ships there, so a machine set up from the defaults heard nothing. Each event now has a chain of sounds present on every Windows. And a Windows with no node installed, which is most of them, runs the hook through the editor's own runtime by way of a batch file the extension writes next to the hook script, rather than through a "node" that is not there.
  • Setting up Kokoro on Windows downloads again: the sherpa-onnx release renamed its Windows build ("win-x64-shared-MD-Release"; the plain name was a 404 on a fresh install), and the Linux ARM build ("linux-aarch64-shared-cpu").
  • Setting up Chatterbox on Windows and Linu...
Read more

1.1.0

Choose a tag to compare

@github-actions github-actions released this 11 Sep 20:53
1.1.0
6abd9c6
  • Export what was spoken to a file: the last message, or any part of what was played, as an MP3 (or M4A, Opus, FLAC, WAV), in the voice, at the rate and in the language it was heard. The sheet shows the size the file will be as the quality and the range are chosen, each sentence can be heard and left out, and the pauses between sentences are kept natural. The last 30 minutes of speech are kept for it (export.keepMinutes; 0 keeps nothing).
  • The menu rows "Set speech rate" and "Show spoken log", and a few other prompts, had lost words to the rename and read "runtime.speech"; they read as intended again.
  • Downloads (Kokoro, Piper voices, the private uv) go through the proxy VSCode is configured for (http.proxy), or the one in HTTPS_PROXY, HTTP_PROXY and NO_PROXY. On a machine that reaches the internet only through a proxy they failed with a connection error while the Python side worked.
  • On Linux under an editor whose Node cannot watch a directory tree (VSCode before 1.90), and on a machine out of inotify watches, transcripts are found by scanning instead. Before, a new session was never spoken there, and on the older editors the extension did not start at all.
  • Piper reads its text as UTF-8 on Windows; a sentence with an accent or another script in it was mispronounced from the system code page. The system voice's PowerShell reads its text the same way.
  • A ~/.claude/settings.json that cannot be parsed (a byte order mark from an editor, a stray comma) is left alone rather than replaced by the completion-sound hooks, and the hook script reads a file with a byte order mark.
  • The install command offered for ffmpeg names the package manager on the machine (apt, dnf, pacman, zypper, Homebrew) rather than always apt, and on Windows says to restart VSCode afterwards, which a winget install needs before the program is found.
  • Piper is found on disk rather than by running it, which no longer stalls activation for a Python start-up; probes and archive tools no longer flash a console window on Windows; and a microphone recording stopped early on Windows is complete rather than empty (ffmpeg there cannot be asked to stop through a pipe, so it is stopped the hard way and its header repaired).

1.0.1

Choose a tag to compare

@github-actions github-actions released this 10 Sep 00:12
1.0.1
40ab71b
  • The store page shows the two diagrams as pictures. The Marketplace has no mermaid renderer, so both arrived as a wall of flowchart LR text where a diagram was meant to be.
  • Switching to "speak every session" no longer loses the first line written at that moment. The position of a file being skipped was moved forward by a check that could finish after the switch, and whatever arrived in between was stepped over.
  • Easier to find: the extension is listed under AI and Chat rather than AI and Other, and the search terms it answers to now include the names of the engines it installs.

1.0.0

Choose a tag to compare

@github-actions github-actions released this 09 Sep 23:31
1.0.0
ae66401

First public release.

  • Settings you set while this was called Claude Voice are carried over: the extension had to be renamed, so claudeVoice.* became claudeCodeTts.*, and each value moves to its new name the first time this version starts.
  • Speaks Claude Code's replies aloud and announces its tool calls ("Bash: run tests"), reading prose and never code.
  • Five local speech engines: the system voice, which needs no setup, and Kokoro, Piper, Qwen3 and Chatterbox, each installed from inside the extension when you want it. "Set Up the Best Voice" picks the one that suits this machine and the languages you listen to.
  • A voice of your own, recorded in ten seconds, taken from audio or video you already have, or described in words and rendered locally. Voices can be backed up to a file and imported again.
  • 23 languages in a voice you create, and translation of everything into the one you prefer, on this machine.
  • Completion sounds through Claude Code's own hooks, so they play whether or not the editor is speaking, with a sound per event.
  • Everything is local: no cloud speech, no telemetry, no account, no API key. Model downloads are the only network use, and each one is asked for first.
  • "Storage and Cleanup" measures what has been downloaded, marks what the current settings need, and frees the rest; "Remove Everything Claude Code TTS Added" undoes the installation.
  • Keyboard shortcuts for the whole of it, a status bar menu, and one-word control from a terminal (echo mute > ~/.claude/claude-code-tts-control).