High-performance offline voice input for Linux
简体中文 | English
Convert speech to text in real-time, input to any application via the Fcitx5 input method framework. Runs completely offline to protect your privacy.
- Offline Recognition - Based on Sherpa-onnx streaming bilingual model (Chinese/English), data never leaves your device
- Ultra-low Latency - End-to-end latency < 20ms for real-time transcription
- Transparent Floating Window - Borderless capsule UI with breathing animation, minimal workflow disruption
- Native Wayland Support - System shortcuts and text submission both support Wayland
- Focus Lock - Switch windows while recording, text still submits to the original window
- Model Options - Switch between int8 (fast) / standard (high accuracy) models
Ubuntu/Debian:
sudo dpkg -i nextalk_0.1.0-1_amd64.debFedora/CentOS/RHEL:
sudo rpm -i nextalk-0.1.0-1.x86_64.rpmFcitx5 will automatically restart after installation to load the plugin.
The app is triggered via system global hotkey, manual configuration required:
GNOME:
- Settings → Keyboard → View and Customize Shortcuts → Custom Shortcuts
- Click "Add Shortcut"
- Name:
Nextalk Voice Input - Command:
nextalk --toggle - Shortcut: Press
Alt+Space(recommended)
KDE Plasma:
- System Settings → Shortcuts → Custom Shortcuts
- Edit → New → Global Shortcut → Command/URL
- Trigger: Set to
Alt+Space - Action:
nextalk --toggle
- Launch App - Start Nextalk from app menu, or run
nextalk - Press Hotkey - Floating window appears and starts recording
- Speak - See recognized text in real-time
- Press Hotkey Again - Stop recording, text auto-inputs to current app
- Or Wait for Auto-submit - Text submits automatically after pause
First Run: The app will automatically download the speech recognition model (~200MB)
| Option | Description |
|---|---|
--toggle |
Toggle recording state (for system hotkey) |
audio |
Manage audio input device (interactive mode) |
audio <number> |
Set audio device by index number directly |
audio --list |
List available devices (machine-readable) |
audio default |
Reset to system default device |
--help |
Show help information |
--version |
Show version |
If Fcitx5 is not installed, the app automatically uses clipboard mode:
- Recognized text is copied to system clipboard
- UI shows "Copied to clipboard" prompt
- Manually paste (
Ctrl+V) to target application
The app supports system tray (on supported desktop environments), right-click menu provides:
- Show/Hide window
- Switch model version
- Audio input device - Select from available audio input devices
- Open config directory
- Exit app
Note: It's normal that GNOME desktop doesn't show tray icon, the app can still be used via
nextalk --togglecommand.
| Component | Requirement |
|---|---|
| OS | Linux (Ubuntu 22.04+ recommended) |
| Display Server | X11 or Wayland |
| Audio System | ALSA or PulseAudio |
| Input Method | Fcitx5 |
Switch via system tray menu:
| Version | Description |
|---|---|
int8 |
Quantized version, faster, smaller memory footprint (default) |
standard |
Standard version, higher recognition accuracy |
Advanced configuration: ~/.config/nextalk/settings.yaml
model:
custom_url: "" # Custom model download URL
type: int8 # Model version: int8 | standard
audio:
input_device: "default" # Audio input device: "default" or device nameAudio Device Selection:
- Use
"default"to use system default audio device - Specify device name (e.g.
"Built-in Audio Analog Stereo") to use a specific device - Use
nextalk audiocommand or system tray menu to select devices interactively
Hotkey Configuration: Hotkeys are configured through your desktop environment's native settings, not through this config file. See Configure Hotkey section for setup instructions.
# Ubuntu/Debian
sudo apt install fcitx5 fcitx5-dev libportaudio2 portaudio19-dev cmake build-essential
# Install Flutter: https://flutter.dev/docs/get-started/install/linux# Using Makefile (recommended)
make build
# Or build separately
make build-flutter # Flutter client
make build-addon # Fcitx5 pluginRecommended to use Docker build for cross-distribution compatibility:
# Incremental build (recommended)
make docker-build
# Full rebuild
make docker-rebuild
# Flutter only
make docker-build-flutter
# Plugin only
make docker-build-addonmake install-addon # User-level installation
make install-addon-system # System-level installation (requires sudo)make run # Development mode
make run-release # Release version./scripts/build-pkg.sh --deb # DEB package
./scripts/build-pkg.sh --rpm # RPM package
./scripts/build-pkg.sh --all # All formatsOutput in dist/ directory.
Ubuntu/Debian:
sudo dpkg -r nextalkFedora/CentOS/RHEL:
sudo rpm -e nextalkUser data is preserved at ~/.local/share/nextalk/, delete manually for complete cleanup.
nextalk/
├── voice_capsule/ # Flutter client
│ └── lib/
│ ├── main.dart # Entry point
│ ├── ffi/ # FFI bindings (sherpa, portaudio)
│ ├── services/ # Business logic
│ │ ├── asr/ # ASR engine abstraction
│ │ └── ... # Other services
│ ├── ui/ # Widget components
│ └── l10n/ # Internationalization
├── addons/fcitx5/ # Fcitx5 C++ plugin
├── docs/ # Design documents
├── scripts/ # Build scripts
├── libs/ # Precompiled dynamic libraries
├── packaging/ # DEB/RPM templates
└── Makefile # Build entry
Detailed architecture: docs/architecture.md
make test # Run tests
make analyze # Code analysis
make clean # Clean build
make help # Show all commandsGNOME desktop doesn't show system tray icons by default, this is normal. The app can still be used via command line:
nextalk --toggle # Toggle recording state
⚠️ Note: Installing AppIndicator extension is not recommended, may cause app crashes. If already installed and experiencing crashes, see next section.
If app crashes after installing AppIndicator extension, disable tray functionality:
NEXTALK_NO_TRAY=1 nextalkWhen configuring system shortcut:
env NEXTALK_NO_TRAY=1 /opt/nextalk/nextalk --toggle- Confirm hotkey is configured in system settings (command:
nextalk --toggle) - Confirm Nextalk app is running (check system tray)
- Test command line:
nextalk --toggle
Ensure Fcitx5 plugin is correctly installed:
ls ~/.local/lib/fcitx5/libnextalk.so
ls ~/.local/share/fcitx5/addon/nextalk.conf
fcitx5 -r # Restart Fcitx5If not using Fcitx5, the app will automatically use clipboard mode.
Configure custom download URL or use proxy:
# ~/.config/nextalk/settings.yaml
model:
custom_url: "https://your-mirror/model.tar.bz2"If you encounter "Audio device busy" error (e.g., when using EasyEffects), you can select a different audio input device:
Method 1: CLI Interactive Mode
nextalk audio # Enter interactive mode to select deviceMethod 2: CLI Direct Selection
nextalk audio --list # List available devices
nextalk audio 2 # Select device by index
nextalk audio default # Reset to system defaultMethod 3: System Tray Right-click tray icon → Audio Input Device → Select from available devices
Debug Commands:
nextalk audio --list # List devices detected by the app
pactl list sources # System-level debug commandContributions, bug reports, and suggestions are welcome!
- Fork this repository
- Create feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push branch (
git push origin feature/amazing-feature) - Create Pull Request
- Sherpa-onnx - High-performance offline speech recognition engine
- Fcitx5 - Modern input method framework
- Flutter - Cross-platform UI framework
Issue Feedback: GitHub Issues