Speech Recognition (ASR)
Transcribe audio files to text locally with the coli CLI — multilingual, with optional AI polish, fully offline, no API key.
Transcribe audio files to text using coli asr. It runs entirely on your machine through local speech recognition models, so it needs no ListenHub API key and no internet connection once the models are downloaded.
No ListenHub API key required. This skill is local-only — it does not call the ListenHub API. It needs the coli CLI, which is a separate tool from listenhub. See Prerequisites below.
Trigger
Invoke this skill with /asr, or use any of these phrases:
| Phrase | Language |
|---|---|
transcribe / transcribe this | English |
ASR | English |
转录 / 识别音频 | Chinese |
语音转文字 | Chinese |
把这段音频转成文字 | Chinese |
Prerequisites
This skill depends on the coli CLI, not the listenhub CLI. Install it once:
npm install -g @marswave/coliOptional but recommended: install ffmpeg to support compressed formats (MP4, M4A, AAC, and similar):
# macOS
brew install ffmpeg
# Ubuntu / Debian
sudo apt install ffmpegWAV files transcribe without ffmpeg. Other formats need it for decoding.
First-run model download
The recognition models are not bundled with the CLI. On your first transcription, coli automatically downloads the model it needs (roughly 60 MB) to ~/.coli/models/. This happens once per model and takes a moment — the AI tells you it is downloading if the model is not present yet. Every later run reuses the cached model and starts immediately.
After the download, transcription is fully offline. No audio leaves your machine, and no network call is made.
Quick Example
Transcribe this file: meeting.m4aThe AI checks prerequisites, reads your config, confirms the model and polish settings, and runs the transcription locally. The result appears directly in the conversation.
Models
The skill ships with two recognition models. Pick based on the languages in your audio and whether you want extra signals like emotion.
| Model | Languages | Detects emotion / events | Notes |
|---|---|---|---|
sensevoice (default) | Chinese, English, Japanese, Korean, Cantonese | Yes | Recommended for multilingual content or when the language is unknown |
whisper-tiny.en | English only | No | Smaller, English-only model |
Use sensevoice unless your audio is reliably English and you want the lighter model. sensevoice is the default and the better general-purpose choice — it covers five languages and returns the language, emotion, and audio-event signals described below.
Detected metadata
When you run with JSON output, sensevoice returns more than the transcript text. The result includes:
lang— the detected spoken languageemotion— the detected emotional tone of the speechevent— detected non-speech audio events (for example background sounds)duration— the audio length in seconds
The AI surfaces lang, emotion, and duration alongside the transcript, and writes them into the Markdown export header. whisper-tiny.en returns the transcript and duration but does not produce emotion or event detection.
AI polish
Polish is a post-processing pass on the raw transcript, applied by the AI after coli returns the text. It is enabled by default.
| Mode | What you get |
|---|---|
| Polish on (default) | The AI rewrites the raw transcript to fix punctuation, remove filler words, and improve readability — without changing meaning, summarizing, or paraphrasing |
| Polish off | The exact raw transcript as returned by the model, unedited |
The raw transcript is always preserved. Even with polish on, you can ask the AI to show the original unedited text. To turn polish off for a single transcription, say so in the request (for example "transcribe interview.wav, no polish"); to change the default, reconfigure the skill.
Output
The transcript appears inline in the conversation, followed by the detected metadata:
Transcription complete
{transcript text}
─────────────────
lang: {lang} · emotion: {emotion} · duration: {duration}sIf polish is on, the polished version is shown and marked as AI-refined.
Markdown export
After presenting the result, the AI offers to save the transcript as a Markdown file in your current working directory:
{audio-filename}-transcript.mdThe file contains the transcript (the polished version when polish is on) under a front-matter header recording the source file, date, model, duration, and detected language:
---
source: meeting.m4a
date: 2026-06-25
model: sensevoice
duration: 312s
lang: zh
---
{transcript text}Configuration
Settings are stored per project in .listenhub/asr/config.json and created automatically on first use with sensible defaults (sensevoice, polish on). You don't need to configure anything to get started. To change defaults, ask the AI to reconfigure; it walks you through the model and polish choices and saves your answers.
| Setting | Default | Options |
|---|---|---|
model | sensevoice | sensevoice, whisper-tiny.en |
polish | true | true, false |
CLI Command
The skill drives the coli asr command. JSON output is used so the AI can read the detected metadata:
# Transcribe with JSON output (returns text, lang, emotion, event, duration)
coli asr -j --model sensevoice "meeting.m4a"
# English-only, lighter model
coli asr -j --model whisper-tiny.en "talk.wav"Run coli asr --help for the current set of flags supported by your installed version.
Composability
This skill produces transcript text that you can pass directly to other skills in the same conversation:
- Transcribe a recorded interview, then feed it into
/podcastas reference material - Transcribe a voice memo, then use it as input for
/explainer
See Composing Skills for more chained workflows.
API Reference
None. This skill makes no API calls — it uses the local coli asr command only.