90 lines
3.1 KiB
Bash
Executable File
90 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 强制 Handy 使用中文 SenseVoice:杀进程 → 重置 settings_store → 启动 → 校验日志
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
|
||
SETTINGS="$HOME/Library/Application Support/com.pais.handy/settings_store.json"
|
||
LOG="$HOME/Library/Logs/com.pais.handy/handy.log"
|
||
HANDY_PASTE="${SCRIPT_DIR}/handy_paste_karuo_asr.sh"
|
||
MODELS="$HOME/Library/Application Support/com.pais.handy/models"
|
||
|
||
echo "① 结束所有 Handy 进程(可执行文件名是 handy 小写)…"
|
||
killall -9 handy 2>/dev/null || true
|
||
killall -9 Handy 2>/dev/null || true
|
||
sleep 2
|
||
pgrep -lf '[Hh]andy' | rg -v 'rg|grep' && { echo "仍有 handy 进程,请菜单栏退出 Handy"; exit 1; } || true
|
||
|
||
echo "② 解锁并重写配置(不用 uchg,避免 Tauri Store 写失败导致仍用内存旧配置)…"
|
||
chflags nouchg "$SETTINGS" 2>/dev/null || true
|
||
[[ -f "$SETTINGS" ]] && cp "$SETTINGS" "${SETTINGS}.bak.$(date +%Y%m%d_%H%M%S)"
|
||
|
||
python3 << PY
|
||
import json
|
||
from pathlib import Path
|
||
|
||
paste = "${HANDY_PASTE}"
|
||
models = Path("${MODELS}")
|
||
if not (models / "sense-voice-int8").is_dir():
|
||
raise SystemExit("缺少 sense-voice-int8,请先下载中文模型")
|
||
|
||
p = Path("${SETTINGS}")
|
||
if p.exists():
|
||
d = json.loads(p.read_text())
|
||
else:
|
||
d = {}
|
||
s = d.get("settings") or {}
|
||
|
||
s["bindings"] = s.get("bindings") or {}
|
||
for bid, name, desc, bind in [
|
||
("transcribe", "语音转写", "简体中文转写并粘贴(卡若纠错)", "command_left+1"),
|
||
("transcribe_with_post_process", "转写并润色", "默认勿用", "option+shift+1"),
|
||
("cancel", "取消录音", "取消当前录音", "escape"),
|
||
]:
|
||
b = s["bindings"].setdefault(bid, {"id": bid})
|
||
b["name"] = name
|
||
b["description"] = desc
|
||
b["current_binding"] = bind
|
||
b.setdefault("default_binding", bind)
|
||
|
||
s["push_to_talk"] = True
|
||
s["app_language"] = "zh-Hans"
|
||
s["selected_language"] = "zh-Hans"
|
||
s["selected_model"] = "sense-voice-int8"
|
||
s["translate_to_english"] = False
|
||
s["post_process_enabled"] = False
|
||
s["post_process_selected_prompt_id"] = None
|
||
s["ort_accelerator"] = "coreml"
|
||
s["whisper_accelerator"] = "coreml"
|
||
s["mute_while_recording"] = False
|
||
s["paste_method"] = "external_script"
|
||
s["external_script_path"] = paste
|
||
s["debug_mode"] = True
|
||
s["log_level"] = "debug"
|
||
|
||
d["settings"] = s
|
||
p.write_text(json.dumps(d, indent=2, ensure_ascii=False) + "\n")
|
||
print("OK 配置:", s["selected_model"], s["selected_language"], s["bindings"]["transcribe"]["current_binding"])
|
||
PY
|
||
|
||
chmod +x "${HANDY_PASTE}"
|
||
|
||
# 禁用 Parakeet
|
||
pk="${MODELS}/parakeet-tdt-0.6b-v3-int8"
|
||
off="${MODELS}/_disabled_parakeet-tdt-0.6b-v3-int8"
|
||
[[ -d "$pk" && ! -d "$off" ]] && mv "$pk" "$off" && echo "已禁用 parakeet"
|
||
|
||
echo "③ 启动 Handy…"
|
||
open -a Handy
|
||
sleep 5
|
||
|
||
echo "④ 校验启动日志(须含 sense-voice / zh-Hans)…"
|
||
if [[ -f "$LOG" ]]; then
|
||
tail -80 "$LOG" | rg -i "Found existing settings|sense-voice|parakeet|selected_language|command_left\+1|option\+1" || true
|
||
fi
|
||
|
||
echo ""
|
||
echo "✅ 请在本机:按住 ⌘1 说「卡若帮我改一下 skill」"
|
||
echo " 历史里应出现中文;勿在 Handy 设置里改回 Parakeet/auto。"
|
||
echo " 若仍英文:把 handy.log 最后 50 行发我。"
|