mori-ear

全域熱鍵 → 錄音 → STT → 焦點視窗

Mori 宇宙的「耳朵」器官 — 極簡 Rust CLI。預設按一下開始、再按一下停止,講話中的停頓會先送去轉譯;獨立於 mori-desktop(身體 / GUI), 身體重啟時耳朵還在聽。

實測範圍:新的運作模式目前只在 Linux X11 實測。Windows 尚未實測,可能正常,也可能遇到問題;Wayland 與 macOS 也不列入這次新模式的實測保證。

快速開始

已經有 Rust?本機 whisper-server 可直接使用;需要雲端 fallback 或繁中 cleanup 時再設定 Groq API key。

cargo install --path . && mori-ear &

安裝路徑

兩種路徑,挑一個:預編譯 binary(快、不用 Rust 工具鍊)或從原始碼。

Windows · 預編譯

  1. (選用)設 Groq key:setx GROQ_API_KEY gsk_xxxxx
  2. Actions 抓最新 mori-ear-windows-x86_64.zip,解壓到固定路徑。
  3. install-autostart.ps1(會彈 UAC,點是)→ 登入後自動啟動。
  4. 立即啟動:Start-Process .\mori-ear.exe

注意:Windows 尚未實測新的 toggle、停頓分段與邊講邊貼流程。程式可能正常,也可能遇到問題。

從原始碼?→

Linux · 預編譯

  1. (選用)設 Groq key:
    export GROQ_API_KEY=gsk_xxxxx。X11 paste-back 另裝 xclip xdotool;Wayland 裝 wl-clipboard ydotool 並啟動 ydotoold
  2. Actionsmori-ear-linux-x86_64.tar.gz,解壓後 install -m 755 mori-ear ~/.local/bin/
  3. 登入自動啟動:./install-autostart.sh
  4. 立即啟動:mori-ear &
從原始碼?→

從原始碼建置

  1. Rust。Windows 加裝 MSVC C++ Build Tools(rustup-init 會提示);Linux 加 pkg-config libasound2-dev libx11-dev,再依 session 裝 paste-back 工具。
  2. git clone https://github.com/yazelin/mori-ear && cd mori-ear
  3. cargo install --path . — binary 進 ~/.cargo/bin/
  4. 依平台跑 scripts/install-autostart.{ps1,sh} 設登入自動啟動。
完整 README →

Linux 便利:ear 一鍵 wrapper

把「裝 / 啟 / 停 / 解除」收成一個指令 + GNOME 全域 toggle 快捷鍵。Linux + GNOME 主測;KDE / XFCE / Sway 自動 skip keybind 層,其他層照常 work。

git clone https://github.com/yazelin/mori-ear
cd mori-ear
ln -s "$PWD/scripts/ear.sh" ~/.local/bin/ear
ear install

ear install 自動跑 依賴檢查 + cargo install + XDG autostart + GNOME 快捷鍵 + 啟動 五層,idempotent — 已裝的會跳過。

使用

1

按一下 Ctrl+Alt+E

預設 toggle,開始錄音

2

講話

停頓就先分段送 STT

3

再按一下

尾巴完成 STT + cleanup LLM

4

字貼進焦點視窗

toggle 會逐段 live-paste

想用傳統按住說話、放開停止,可在 voice_input.hotkey_mode 設成 "hold"。hold 會用外部 yad 顯示預覽;因為按住熱鍵時的 keyboard grab,hold 不支援邊講邊貼,長句可在確認視窗編輯後送出。

特性

全域熱鍵

任何視窗按 Ctrl+Alt+E 就講話。可改 ~/.mori/ear.jsonhotkey 欄位。

自動貼回焦點視窗

Win32 clipboard + SendInput,Linux 走 xclip + xdotool。Terminal 自動偵測切 Ctrl+Shift+V。

雙 STT backend

auto 預設先走本機 whisper-server;不可用才 fallback Groq。也能用 local / groq 強制單一路徑。

繁中校正 LLM

Whisper 簡體輸出 + 偶爾幻覺出 YouTube 結尾語。cleanup LLM 二次處理,清掉雜訊、轉繁體。

停頓就先轉譯

錄音期間背景偵測尾巴靜音,將前段併行送去 STT;停止時通常只剩最後一小段需要等待。

Loopback HTTP service

預設在 127.0.0.1 提供 /inference,讓 AgentOS / mori-desktop 共用這顆耳朵的轉譯能力。

設定

~/.mori/ear.json(可選,partial merge — 沒寫的欄位使用預設;Groq key 也會從 ~/.mori/config.json / 環境變數補):

{
  "hotkey": "Ctrl+Alt+E",
  "backend": "auto",
  "language": "zh",
  "raw": false,
  "paste_back": true,
  "transcribe_timeout_secs": 90,
  "service": { "enabled": true, "port": 0 }
}

Batch / pipe 模式

不按熱鍵,直接餵音檔(wav / mp3 / m4a / flac / webm / ogg)轉文字到 stdout。跟 daemon 模式互不衝突。

本機 whisper-server 只吃可解碼的 WAV;backend=auto 餵其他格式時會在本機失敗後 fallback Groq,因此需要 Groq API key。

mori-ear --input recording.wav > out.txt
mori-ear --input clip.wav | translate -t en

Loopback 轉譯服務

mori-ear 不只是一個 hotkey daemon,也能作為 Mori 宇宙共用的 STT provider。daemon 預設開啟服務;mori-ear --serve 則只啟動服務,不註冊熱鍵。

服務發現

  • 只綁 127.0.0.1,不對外公開。
  • 實際 port 寫入 ~/.mori/mori-ear-server.json
  • AgentOS / mori-desktop 先用 GET / 驗活,再送轉譯。
  • 服務停止時會移除自己的 descriptor,避免 stale discovery。

POST /inference

  • 必填 multipart 欄位:file
  • 選填:languagepromptbackendcleanup
  • 回應:{"text":"..."}
  • cleanup=false / 0 / raw / none 可要求 raw output。

平台支援

環境 hotkey paste-back 備註
Windows 尚未實測 尚未實測 已有 Win32 SetClipboardData + SendInput Ctrl+V 路徑,但新模式尚未驗證,可能正常,也可能遇到問題
Linux X11 已實測 已實測 目前新運作模式的主要驗證環境;xclip + xdotool ctrl+v,Terminal 自動偵測切 +Shift
Linux Wayland 未實測 未實測 程式已有 GlobalShortcuts portal 與 wl-copy + ydotool 路徑,但新模式不在目前實測範圍;需要 ydotooldinput 群組
macOS 理論支援 理論支援 第一次跑要授權 Accessibility;paste-back 走 enigo text() 逐字 fallback