Table of Contents
1. I wanted to hear long replies away from the screen
Ask Claude Code to do something, and it often returns a careful explanation: what changed, why, and what it checked. I appreciate that. Reading every response to the end, at my desk, can still get tiring.
Having it read aloud seemed like the obvious answer. In the environment I used, though, long Japanese responses started to sound hurried, and I could not choose a voice that suited me. Keeping up with the delivery became harder than following the explanation.
That led me to build nagara, a small voice player that lives in the Mac menu bar. Copy an AI reply, an article, or a passage from a novel; listen in a voice you chose; pause; go back one sentence when you miss something. The name comes from nagara-giki, Japanese for listening while doing something else. It is open source under the MIT license.[1]
My previous app, nobetsu, puts spoken Japanese into other apps. This one runs in the other direction, bringing written text to my ears. Both began with a small piece of everyday friction.
2. Speaking to an agent and choosing how to listen
Claude Code was the starting point, but I am not claiming that its Japanese speech is universally poor. The hurried delivery describes my experience. I have not isolated whether it is specific to Japanese or whether it originates in speech generation or playback.
Voice input and output are also easy to confuse. The Claude Code documentation describes “/voice” as dictation: speech becomes text in the prompt. That is a separate question from how to listen to the response.[2]
With Codex, I also wanted to continue an ordinary text-based task by listening in a voice I liked. There is an important current detail: as of September 4, 2026, OpenAI documents ChatGPT Voice for working with Codex tasks. Availability depends on factors including the account and rollout. It would be inaccurate to say that Codex has no voice features.[3]
My requirement extends beyond starting a conversation. I want a finished piece of text to be available, then choose the voice, speed, and moment to listen. The same applies to a long browser article or a novel I am following. I would like the voice itself to be part of the pleasure, as it is with a narrated book.
There are existing options. The VS Code extension Response Narrator, for example, offers playback and pause controls, voice and speed selection, and manual playback.[4] The combination I wanted in nagara was use outside the editor, a choice of local Japanese voice models, and replies that collect quietly.
The text can stay the same while I choose when to listen and whose voice to hear. AI replies and novels can share that entry point.
3. Let AivisSpeech make the voice
nagara does not build a speech synthesis model. Its job is to receive text, prepare it for listening, and play it. It asks AivisSpeech, running as a separate process, to create the voice over HTTP.
AivisSpeech provides expressive Japanese speech synthesis and lets users add voice models from AivisHub. Models can offer different speaking styles as well as different voices. nagara builds its voice menu by querying the engine’s “/speakers” endpoint, so speaker names do not need to be hard-coded into the app.[5][6]
One of the underlying technologies is Style-Bert-VITS2, a project based on Bert-VITS2 that adds control over emotion and speaking style. AivisSpeech Engine uses AIVMX files to package model data and related information, and runs inference with ONNX Runtime. That removes the PyTorch dependency and supports CPU inference.[7][8]
The benefit is more personal than a single score for “human-like speech.” It is the ability to choose a voice I want to spend a long passage with: perhaps calm, perhaps a little brighter. Naturalness and pronunciation depend on the model and the text, so a passage you actually read is a useful first test.
The default synthesis endpoint is “127.0.0.1:10101” on your own Mac. This lets you use it without sending the narration text to an external cloud TTS service. It does not mean that initial model downloads and every other network operation disappear. VOICEVOX is also supported by configuring the endpoint and speaker. AivisSpeech provides a VOICEVOX-compatible API, but some parameters have different meanings.[8]
4. Use the text that already arrived
Separating input from playback gives the app a straightforward structure.
Claude Code Stop hook ─┐
Text from the CLI ─────┼→ nagara input → history
Copied text ──────────┘ ↓ press play
clean → split → synthesize → play
The Claude Code integration uses a Stop hook when the response finishes. It receives the path to the conversation transcript, extracts the latest assistant text from the JSONL records, and sends that to nagara. It does not read the terminal screen, which keeps progress displays and tool results out of the narration input.[9][6]
There is no need to ask the LLM to output the entire response again each time I want to hear it. The text has already arrived. Playing it avoids the tokens and waiting involved in regenerating the body, as well as the possibility of getting a paraphrase instead.[10]
Another important step is preparing visual Markdown for listening. Fenced code blocks are skipped by default; links keep their visible text. Table separator rows disappear, and cells are joined with commas. Heading and emphasis markers are removed. This is rule-based cleanup, not an LLM summary.
Some information is inevitably less useful in audio. Table relationships become harder to follow, and skipped code cannot convey implementation details. I would not use it to finish a code review through audio alone. I can listen to the explanation, then return to the screen where I need to inspect something.
5. Build playback around going back one sentence
The player is written in Swift around AVAudioEngine. Synthesized audio goes through AVAudioPlayerNode, then AVAudioUnitTimePitch. Speed changes happen when the audio plays, rather than when it is generated.[11][12]
Baking the speed into the synthesis API’s “speedScale” would require generating new audio to change that setting. Changing it in the player preserves pitch and lets me adjust speed while listening. The default choices span 1.0× to 1.5×. I kept the normal menu within that range because the sound became muddy when stretched to slower speeds. This is a nagara default, not an Apple API limit.[10]
Navigation also works in sentences rather than fifteen-second jumps. When I miss an explanation, landing in the middle of a sentence is unhelpful. nagara splits text at Japanese sentence-ending punctuation, newlines, and similar boundaries, then makes those chunks the playback units. Long sentences are divided further at commas or other suitable points, so “sentence” is really shorthand for a short, sentence-oriented chunk.
That also helps with waiting. Playback can begin when the first sentence is ready, while synthesis prepares the next ones as playback advances. The look-ahead window in the code is three sentences. Engine startup and synthesis still take time; the improvement is that an entire long response need not finish synthesizing before anything plays.[11]
Sentence-sized playback units give navigation and synthesis look-ahead a shared structure. This is a conceptual illustration.
There is another small detail in the asynchronous work. Stopping or moving between sentences increments a generation counter. Late synthesis results and playback-completion callbacks from an older generation are ignored. Otherwise, audio being prepared in the background could interfere after the user has already moved on.
Most of this is invisible in the interface. It is still needed to make ordinary actions—going back, stopping, choosing another passage—behave as expected. The distance between making sound and making a useful everyday tool often lives in those details.
6. It has arrived, but it is not playing
The feature that mattered most in use was less about the sound than the fact that autoplay is off by default. Claude Code replies arrive in history, and the menu-bar icon shows how many are unplayed. I start playback when I want to listen.
Speaking after every response interrupts other work and thoughts. Selecting and copying a long answer every time is tedious too. Separating collection from playback avoids both. The current history is held in memory while the app runs; it is not an archive that survives app restarts.[6]
The agent decides when a reply arrives. I decide when to hear it. Automatic collection does not require automatic playback.
I kept the app’s interaction with macOS narrow too. nagara does not scan the screen; it reads text handed to it. Hotkeys use Carbon’s RegisterEventHotKey, and the clipboard is read when the user invokes that operation. The app does not require Input Monitoring or Accessibility permissions. Copying text provides an alternative in apps that do not expose the right-click service.[10]
AivisSpeech is started when needed. By default, nagara closes an engine it launched after fifteen minutes of inactivity, while leaving an engine the user had already opened out of that automatic cleanup. An app that stays around all day should interfere with other work as little as possible.[6]
7. Start with one passage you already read
The current build targets Apple Silicon Macs running macOS 26 or later. Install AivisSpeech and a voice model separately, then build using the repository instructions. A development environment including Xcode Command Line Tools is required; this is not yet a download-one-app installation experience.[13]
After setup, two shortcuts are enough to begin. Copy text and press Control+Option+C to read it. Press Control+Option+P to play or pause. Start with one article or AI response that you can copy as text.
The included installer connects automatic collection from Claude Code. Automatic Codex collection is not implemented at the revision checked for this article, although copied text and the CLI already work. Media-key support and seeking to an arbitrary timestamp are also absent. The AivisSpeech window may briefly appear during startup. Since the app is built around Japanese voice models, it is not an obvious out-of-the-box choice for someone primarily listening to long English passages.[1]
nagara’s MIT license is separate from the terms of a chosen voice model. If you publish generated speech in a video or stream, check that model’s conditions for commercial use, attribution, and other requirements. AivisHub models can have different terms, including ACML and its noncommercial variant.[14] The software is provided without warranty.
However capable text-generating agents become, the time spent receiving their work is still mine. Some things are best read; others can go to my ears. I want to choose that transition, and the voice that comes with it. That is why I built nagara.
Explore nagara’s source and setup instructions on GitHub
References
- [1]nagara README, checked September 4, 2026. Source review baseline: commit 7f11917. Motivation, features, and limitations describe that revision. ↩
- [2]Claude Code: Voice dictation, documenting speech-to-text input. ↩
- [3]OpenAI: ChatGPT Voice, checked September 4, 2026. Documents voice conversations for Codex tasks and account, rollout, and workspace dependencies. ↩
- [4]Response Narrator: developer’s product description, including playback controls, manual mode, and voice and speed selection. ↩
- [5]AivisSpeech, official application and voice-model information. ↩
- [6]nagara source and Stop hook, including Aivis, Ingest, History, Sanitizer, and Settings. ↩
- [7]Style-Bert-VITS2, explaining speaking-style and emotion control. ↩
- [8]AivisSpeech Engine, documenting AIVMX, ONNX Runtime, and differences from the VOICEVOX API. ↩
- [9]Claude Code: Hooks reference, including Stop and transcript_path. ↩
- [10]nagara DESIGN.md, explaining playback, controls, and permission choices. ↩
- [11]nagara Player.swift, implementing three-sentence look-ahead, playback rate, and generation counters. ↩
- [12]Apple Developer: AVAudioUnitTimePitch, the audio unit for playback-rate and pitch processing. ↩
- [13]nagara build.sh, targeting arm64-apple-macos26.0 using Swift and system frameworks. ↩
- [14]Aivis Project: ACML and AivisHub. Check the license and individual conditions of each model. ↩

NEW NOVEL 2026/08/01
Clouded Glass
Polishing is not about force.
Volume two of The World Became Slightly Farther Away.Five stories that can also be read as a starting point.
View on Amazon
Jijoden.com
Your life is worth writing.
There is a truer self you can tell only to AI.Gather fragments of memory into a single story.
Take a LookRelated Articles
Building nobetsu: IME Bypass and Differential Injection for Japanese Dictation That Keeps Going
Built-in macOS Dictation already inserts Japanese as you speak. nobetsu exists to bypass the IME and Live Conversion path that can stall during long sessions, then safely inject changing converted text by differential updates. This article opens that design with measurements, diagrams, and source code.
You Don’t Have to Abandon Claude Desktop: The Practical Case for Claude Code CLI, Subagents, and Agent Teams
Subagents work in Claude Desktop's Code tab, so what still makes the CLI different? This practical guide explains CLI-only Agent Teams, Unix pipes, shell-environment continuity, which model and effort level each teammate and Subagent inherits, local-only configuration, Git exclusions, and copy-ready reviewer and log-watcher agents for ordinary Claude subscribers.
Is Claude's Bypass Permissions Mode Actually Dangerous? Auto Mode, Enterprise Risk, and Safer Claude Code Operations
A source-based guide to Claude Code's Manual, Accept Edits, Plan, Auto, Don't Ask, and Bypass Permissions modes, including Desktop, CLI, Cowork, and an enterprise decision framework.
Why AGENTS.md Won by Standardizing Almost Nothing — The 18-Month End of the AI Coding Rules War
Why did a landscape of tool-specific instruction files converge on AGENTS.md, a standard with no required fields? This evidence-based history follows its path from Amp's singular AGENT.md to Linux Foundation stewardship, rule-sync tools, invisible-Unicode attacks, and a practical 2026 setup.
Why the Benchmark King Breaks Code in the Field: The Real Reason Google Antigravity Isn't Catching On
Why does Google Antigravity cause regressions in the field? We explore the overwhelming cost performance of its $20 monthly plan and the mystery of why Google is lagging behind in AI coding agents, separating model intelligence from product quality.
