# danilchugaev/voice-to-text-obsidian-plugin architecture

> Architecture diagram of the GitHub repository danilchugaev/voice-to-text-obsidian-plugin, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/danilchugaev/voice-to-text-obsidian-plugin
- Repository: https://github.com/danilchugaev/voice-to-text-obsidian-plugin

## Overview

This Obsidian plugin records microphone audio and appends a Vosk transcription to the open note. The main workflow is documented and visible in `src/main.ts` and `src/transcribe.py`; the README also documents the required FFmpeg, Python, Vosk, and model dependencies. The graph separates capture, audio conversion, recognition, and note insertion, while grouping shared orchestration and support code. External dependency wiring follows the sampled calls; no other feature branch is documented.

Main entry points: [`src/main.ts`](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts) (Plugin orchestration), [`src/transcribe.py`](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/transcribe.py) (Vosk transcription), [`src/logger.ts`](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/logger.ts) (File logger), [`src/locales.ts`](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/locales.ts) (Localized messages)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interaction["Obsidian interaction"]
  node_plugin["Plugin orchestration<br/>[main.ts]"]
  node_record_ui["Record button<br/>[main.ts]"]
  node_note_editor["Note editor<br/>[main.ts]"]
  node_notice["Status notices<br/>[main.ts]"]
end

subgraph group_audio["Audio processing"]
  node_capture["Microphone capture<br/>[main.ts]"]
  node_webm_save["Save WebM audio<br/>[main.ts]"]
  node_convert["Convert to WAV<br/>[main.ts]"]
end

subgraph group_recognition["Speech recognition"]
  node_invoke_vosk["Run transcription<br/>[main.ts]"]
  node_transcribe_script["Vosk transcription<br/>[transcribe.py]"]
end

subgraph group_support["Plugin support"]
  node_logger["File logger<br/>[logger.ts]"]
  node_locales["Localized messages<br/>[locales.ts]"]
end

node_user(("User"))
node_obsidian["Obsidian editor"]
node_microphone["Microphone"]
node_webm_file["Temporary WebM"]
node_ffmpeg["FFmpeg"]
node_wav_file["Temporary WAV"]
node_vosk["Vosk recognizer"]
node_model["Vosk model"]
node_log_file["Plugin log files"]

node_obsidian -->|"dispatches file-open"| node_plugin
node_plugin -->|"adds button"| node_record_ui
node_obsidian -->|"registers command"| node_plugin
node_user -->|"clicks to record"| node_record_ui
node_user -->|"invokes command"| node_plugin
node_record_ui -->|"starts transcription"| node_plugin
node_plugin -->|"calls"| node_capture
node_capture -->|"requests audio"| node_microphone
node_capture -->|"returns audio"| node_plugin
node_plugin -->|"calls"| node_webm_save
node_webm_save -->|"writes audio"| node_webm_file
node_plugin -->|"calls"| node_convert
node_convert -->|"runs conversion"| node_ffmpeg
node_convert -->|"reads audio"| node_webm_file
node_convert -->|"writes WAV"| node_wav_file
node_plugin -->|"calls"| node_invoke_vosk
node_invoke_vosk -->|"runs Python"| node_transcribe_script
node_transcribe_script -->|"reads WAV"| node_wav_file
node_transcribe_script -->|"loads model"| node_model
node_transcribe_script -->|"recognizes speech"| node_vosk
node_invoke_vosk -->|"returns text"| node_plugin
node_plugin -->|"inserts transcription"| node_note_editor
node_note_editor -->|"updates note"| node_obsidian
node_plugin -->|"shows completion or error"| node_notice
node_plugin -->|"gets messages"| node_locales
node_plugin -->|"logs events"| node_logger
node_logger -->|"appends and rotates"| node_log_file

click node_plugin "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts"
click node_record_ui "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts"
click node_note_editor "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts"
click node_capture "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts"
click node_webm_save "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts"
click node_convert "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts"
click node_invoke_vosk "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts"
click node_transcribe_script "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/transcribe.py"
click node_logger "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/logger.ts"
click node_locales "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/locales.ts"
click node_notice "https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_plugin,node_record_ui,node_note_editor,node_notice,node_user toneBlue
class node_capture,node_webm_save,node_convert toneAmber
class node_invoke_vosk,node_transcribe_script toneMint
class node_logger,node_locales toneRose
class node_obsidian,node_microphone,node_webm_file,node_ffmpeg,node_wav_file,node_vosk,node_model,node_log_file toneIndigo
```

## Components

### Obsidian interaction

- [Plugin orchestration](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts): `src/main.ts`
- [Record button](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts): `src/main.ts`
- [Note editor](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts): `src/main.ts`
- [Status notices](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts): `src/main.ts`

### Audio processing

- [Microphone capture](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts): `src/main.ts`
- [Save WebM audio](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts): `src/main.ts`
- [Convert to WAV](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts): `src/main.ts`

### Speech recognition

- [Run transcription](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/main.ts): `src/main.ts`
- [Vosk transcription](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/transcribe.py): `src/transcribe.py`

### Plugin support

- [File logger](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/logger.ts): `src/logger.ts`
- [Localized messages](https://github.com/danilchugaev/voice-to-text-obsidian-plugin/blob/master/src/locales.ts): `src/locales.ts`

### Other components

- **User**
- **Obsidian editor**
- **Microphone**
- **Temporary WebM**
- **FFmpeg**
- **Temporary WAV**
- **Vosk recognizer**
- **Vosk model**
- **Plugin log files**

## Connections

- Obsidian editor → Plugin orchestration: dispatches file-open
- Plugin orchestration → Record button: adds button
- Obsidian editor → Plugin orchestration: registers command
- User → Record button: clicks to record
- User → Plugin orchestration: invokes command
- Record button → Plugin orchestration: starts transcription
- Plugin orchestration → Microphone capture: calls
- Microphone capture → Microphone: requests audio
- Microphone capture → Plugin orchestration: returns audio
- Plugin orchestration → Save WebM audio: calls
- Save WebM audio → Temporary WebM: writes audio
- Plugin orchestration → Convert to WAV: calls
- Convert to WAV → FFmpeg: runs conversion
- Convert to WAV → Temporary WebM: reads audio
- Convert to WAV → Temporary WAV: writes WAV
- Plugin orchestration → Run transcription: calls
- Run transcription → Vosk transcription: runs Python
- Vosk transcription → Temporary WAV: reads WAV
- Vosk transcription → Vosk model: loads model
- Vosk transcription → Vosk recognizer: recognizes speech
- Run transcription → Plugin orchestration: returns text
- Plugin orchestration → Note editor: inserts transcription
- Note editor → Obsidian editor: updates note
- Plugin orchestration → Status notices: shows completion or error
- Plugin orchestration → Localized messages: gets messages
- Plugin orchestration → File logger: logs events
- File logger → Plugin log files: appends and rotates
