From 6cfbf09dc7dbe87f2e3a3703f9ceb41f4db7435e Mon Sep 17 00:00:00 2001 From: yaoboo Date: Sat, 22 Aug 2026 17:41:31 +0800 Subject: [PATCH 1/6] tools: add a transcript editor helper for correcting auto-captions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OpenScreen renders captions as a derived view of the transcript and offers no in-app way to edit caption text. Whisper often mis-transcribes spoken words (especially Chinese names/colloquial terms), and those errors land straight in the subtitles. Add a standalone zero-dependency Python helper under tools/ that lets you edit the transcript words (doc.transcripts[].words[].text) line by line, so captions — being a derived view — follow automatically. It auto-backs-up the project file before writing and never touches the JSON structure beyond the text field. It edits OpenScreen's own project JSON and does not modify, bundle, or fork OpenScreen. Includes an English usage README and a screenshot. --- tools/transcript-editor/README.md | 56 +++ tools/transcript-editor/docs/screenshot.png | Bin 0 -> 124210 bytes .../transcript_editor_server.py | 414 ++++++++++++++++++ 3 files changed, 470 insertions(+) create mode 100644 tools/transcript-editor/README.md create mode 100644 tools/transcript-editor/docs/screenshot.png create mode 100644 tools/transcript-editor/transcript_editor_server.py diff --git a/tools/transcript-editor/README.md b/tools/transcript-editor/README.md new file mode 100644 index 000000000..0dc0bd8c4 --- /dev/null +++ b/tools/transcript-editor/README.md @@ -0,0 +1,56 @@ +# Transcript Editor + +A tiny zero-dependency helper for manually correcting the **auto-transcribed subtitle text** that OpenScreen generates. + +> Whisper transcribes on-device, but it often mis-recognizes spoken words (especially Chinese names and colloquial terms), and those errors land directly in the subtitles. OpenScreen deliberately treats captions as a *derived view* of the transcript — there is no in-app UI to edit caption text directly. This helper fills that gap: it lets you edit the transcript words like a document, and the captions follow. + +![screenshot](docs/screenshot.png) + +## What it does + +- **Edit transcript words line by line.** Each token is a clean input box. Save, reopen OpenScreen, and the captions show your corrected text. +- **Auto-expanding inputs.** A long token (a whole sentence stored as one word) makes its box grow so you can read the full line without scrolling horizontally. +- **Clear junk tokens.** Whisper often emits placeholders like `(听不懂)` ("can't understand"). Click the ✕ to blank a token — it's then skipped in the captions. +- **Automatic backup.** Every save writes a `.bak-` beside the project file first, so a bad edit is always revertible. +- **Revert button.** Jump back to the on-disk version, discarding unsaved edits. +- **Multiple projects.** Auto-lists every project in your OpenScreen projects directory — pick one, edit, save. + +## Why it exists + +OpenScreen's captions are a **derived view** of the transcript (see [`src/lib/ai-edition/captions/settings.ts`](../../src/lib/ai-edition/captions/settings.ts): *"the transcript stays the single source of truth"*, *"nothing here stores caption text"*). To change caption text you change the underlying transcript words — `doc.transcripts[].words[].text`. That file (`.openscreen`) is structured JSON, and editing it by hand is both error-prone and tedious. This tool wraps that JSON in a clean per-line editing UI, so you never touch the JSON structure. + +This is a **standalone helper** — it reads and writes OpenScreen's own project JSON; it does **not** modify, bundle, or fork OpenScreen itself. + +## Usage + +1. **Fully quit OpenScreen** first (including the tray icon). Otherwise it will write stale data back over your edits on its next save. +2. Start the tool — a browser tab opens at `http://127.0.0.1:8765`: + + ```bash + python transcript_editor_server.py + ``` + +3. Pick a project in the dropdown, click **加载转写 (Load transcript)**. +4. Edit the boxes; click ✕ to blank a junk token. +5. Click **💾 保存修改 (Save)** (auto-backup) — then reopen OpenScreen to see the corrected captions. + +**Python standard library only.** No `pip install`, no Node, no npm. Works on Windows and macOS. + +### Overriding the projects directory + +By default the tool locates projects at `~/AppData/Roaming/openscreen/projects` (Windows) or `~/Library/Application Support/openscreen/projects` (macOS). Override with the env var `OPENSCREEN_PROJECTS_DIR` for a non-default install location: + +```bash +OPENSCREEN_PROJECTS_DIR="/path/to/projects" python transcript_editor_server.py +``` + +## Which file it edits + +- Each OpenScreen project is one `.openscreen` JSON file in its `projects/` directory. +- Caption text lives at `doc.transcripts[].words[].text` (one entry per word) and is the true source the captions render from. +- The tool edits those `words[].text` values and also syncs the matching `segments[].text`, keeping both layers consistent. + +## Notes + +- **Why subtitles look broken into few words?** That's OpenScreen's caption wrapping (`minWordsPerLine`/`maxWordsPerLine`), not this helper. This tool edits text only — line wrapping stays with OpenScreen's caption settings. +- The tool is intentionally narrow (YAGNI): it edits transcript text, nothing else. diff --git a/tools/transcript-editor/docs/screenshot.png b/tools/transcript-editor/docs/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..6763def3d4bc12255633e1a06019320f3050d61a GIT binary patch literal 124210 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 literal 0 HcmV?d00001 diff --git a/tools/transcript-editor/transcript_editor_server.py b/tools/transcript-editor/transcript_editor_server.py new file mode 100644 index 000000000..ab80a6e95 --- /dev/null +++ b/tools/transcript-editor/transcript_editor_server.py @@ -0,0 +1,414 @@ +# -*- coding: utf-8 -*- +"""OpenScreen 转写改字器 — 本地单文件工具 + +一个零依赖的本地网页小工具,用来编辑 OpenScreen 项目(.openscreen)里的 +自动转写(Whisper 转写的字幕文字)。它把一段段转写显示成干净的输入框, +改完保存会自动备份原文件并写回,重开 OpenScreen 即可看到修正后的字幕。 + +特点: +- 每个词一个可编辑输入框,长句子自动加宽,不用右滑就能看全。 +- 无效词(如 Whisper 的 "(听不懂)" 占位)可一键清空,字幕里会跳过它。 +- 保存前自动备份(.bak-<时间戳>),改坏了随时可回滚。 +- "撤销修改"按钮回到磁盘版本,放弃未保存的修改。 +- 零依赖:只用 Python 标准库,双击就能跑。 + +用法:python transcript_editor_server.py,浏览器打开 http://127.0.0.1:8765。 +也可以设置环境变量 OPENSCREEN_PROJECTS_DIR 覆盖 OpenScreen 项目目录 +(默认 ~/AppData/Roaming/openscreen/projects),用于非默认安装或其它系统。 +""" +import json +import os +import shutil +import time +import webbrowser +from http.server import BaseHTTPRequestHandler, HTTPServer +from urllib.parse import urlparse + +# OpenScreen 的项目文件目录。默认按平台惯例定位;可用环境变量覆盖, +# 这样非默认安装位置或其它平台(macOS ~/Library/Application Support/...)也能用。 +DEFAULT_PROJECTS_TRIES = [ + os.path.expanduser("~/AppData/Roaming/openscreen/projects"), + os.path.expanduser("~/Library/Application Support/openscreen/projects"), +] +PROJECTS_DIR = os.environ.get("OPENSCREEN_PROJECTS_DIR") or next( + (p for p in DEFAULT_PROJECTS_TRIES if os.path.isdir(p)), DEFAULT_PROJECTS_TRIES[0] +) +PORT = 8765 + +PAGE = r""" + + + +OpenScreen 转写改字器 + + + +
+

📝 OpenScreen 转写改字器

+ 改字 → 保存 → 重开 OpenScreen 即生效 +
+ +
⚠️ 编辑前请完全退出 OpenScreen(托盘图标也退出),否则它的旧数据会在下次保存时覆盖你的修改。保存会自动备份原文件。
+ +
+
+ + + + + + +
+
+
加载项目后在这里显示转写,每个词一个输入框,直接改字即可。
+
+ +
+ + + + +""" + + +def load_project(path): + """返回 (doc, segments_view, word_map, title, language)""" + with open(path, "r", encoding="utf-8") as f: + doc = json.load(f) + tr = (doc.get("transcripts") or [None])[0] + language = (tr or {}).get("language", "?") + title = (doc.get("project") or {}).get("title", os.path.basename(path)) + word_map = {} + segments = [] + if tr: + for w in tr.get("words") or []: + word_map[w["id"]] = w + for s in tr.get("segments") or []: + segments.append({ + "id": s["id"], + "startSec": s.get("startSec", 0), + "endSec": s.get("endSec", 0), + "wordIds": s.get("wordIds", []), + }) + return doc, segments, word_map, title, language + + +def save_words(path, words_by_id): + """把用户编辑的 words 写回;逐 segment 重建 text;备份原文件。""" + with open(path, "r", encoding="utf-8") as f: + doc = json.load(f) + tr = (doc.get("transcripts") or [None])[0] + if not tr: + raise ValueError("该项目没有 transcripts 数组") + new_words = {} + for item in words_by_id: + new_words[item["id"]] = item["text"] + touched = 0 + for w in tr.get("words") or []: + if w["id"] in new_words and new_words[w["id"]] != w.get("text", ""): + w["text"] = new_words[w["id"]] + touched += 1 + # 重建每个 segment 的 text(与 words 保持一致) + for s in tr.get("segments") or []: + parts = [new_words.get(wid, "") for wid in s.get("wordIds", [])] + s["text"] = " ".join(p for p in parts if p.strip()) + # 兼容旧字段 transcript(如果有) + old = doc.get("transcript") + if isinstance(old, dict) and old.get("words"): + for w in old["words"]: + if w["id"] in new_words and new_words[w["id"]] != w.get("text", ""): + w["text"] = new_words[w["id"]] + for s in old.get("segments") or []: + parts = [new_words.get(wid, "") for wid in s.get("wordIds", [])] + s["text"] = " ".join(p for p in parts if p.strip()) + backup = path + ".bak-" + time.strftime("%Y%m%d-%H%M%S") + shutil.copy2(path, backup) + with open(path, "w", encoding="utf-8") as f: + json.dump(doc, f, ensure_ascii=False, indent=2) + return os.path.basename(backup), touched + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *args): + pass + + def _send(self, obj, code=200): + body = json.dumps(obj, ensure_ascii=False).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json; charset=utf-8") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _read_json(self): + length = int(self.headers.get("Content-Length") or 0) + if length <= 0: + return {} + return json.loads(self.rfile.read(length).decode("utf-8")) + + def do_GET(self): + if urlparse(self.path).path in ("/", "/index.html"): + body = PAGE.encode("utf-8") + self.send_response(200) + self.send_header("Content-Type", "text/html; charset=utf-8") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + else: + self._send({"ok": False, "error": "not found"}, 404) + + def do_POST(self): + try: + data = self._read_json() + action = urlparse(self.path).path.rsplit("/", 1)[-1] + if action == "projects": + out = [] + if os.path.isdir(PROJECTS_DIR): + for fn in sorted(os.listdir(PROJECTS_DIR)): + if not fn.endswith(".openscreen"): + continue + p = os.path.join(PROJECTS_DIR, fn) + try: + with open(p, "r", encoding="utf-8") as f: + title = (json.load(f).get("project") or {}).get( + "title", fn + ) + except Exception: + title = fn + out.append({ + "path": p, + "name": fn, + "title": title, + "modified": time.strftime( + "%Y-%m-%d %H:%M", time.localtime(os.path.getmtime(p)) + ), + }) + self._send({"ok": True, "projects": out}) + elif action == "load": + path = data.get("path", "") + if not path or not os.path.isfile(path): + raise ValueError("文件不存在") + doc, segments, word_map, title, language = load_project(path) + self._send({ + "ok": True, + "title": title, + "language": language, + "segments": segments, + "words": word_map, + }) + elif action == "save": + path = data.get("path", "") + words = data.get("words", []) + if not words: + raise ValueError("没有收到修改内容") + backup, touched = save_words(path, words) + self._send({"ok": True, "backup": backup, "touched": touched}) + elif action == "export": + path = data.get("path", "") + with open(path, "r", encoding="utf-8") as f: + raw = f.read() + import base64 + b64 = base64.b64encode(raw.encode("utf-8")).decode("ascii") + self._send({"ok": True, "name": os.path.basename(path), "b64": b64}) + else: + self._send({"ok": False, "error": "unknown action"}, 404) + except Exception as e: + self._send({"ok": False, "error": str(e)}, 500) + + +def main(): + os.makedirs(PROJECTS_DIR, exist_ok=True) + server = HTTPServer(("127.0.0.1", PORT), Handler) + webbrowser.open("http://127.0.0.1:%d" % PORT) + print("OpenScreen 转写改字器运行中: http://127.0.0.1:%d (Ctrl+C 退出)" % PORT) + try: + server.serve_forever() + except KeyboardInterrupt: + pass + + +if __name__ == "__main__": + main() \ No newline at end of file From 5c0d5ff6be8d397e297c115fa547ff66f222cdd1 Mon Sep 17 00:00:00 2001 From: yaoboo Date: Sat, 22 Aug 2026 17:55:06 +0800 Subject: [PATCH 2/6] fix: address review feedback on transcript editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Collision-safe backup name: append nanosecond timestamp so two saves in the same second don't overwrite each other's backup. - Atomic save: write JSON to a temp file in the project dir, flush + fsync, then os.replace onto the live file so an interrupted dump can't corrupt the project. - Harden do_POST: require application/json Content-Type and a same-origin localhost Origin; for load/save/export resolve the path with realpath and reject anything outside PROJECTS_DIR (path-traversal guard). - Language-aware segment text rebuild: join zh/ja tokens with no separator (so '你好世界' stays '你好世界'), keep the existing space join for other languages. - Small cleanups: narrow the blind except, drop the unused load return. --- .../transcript_editor_server.py | 68 ++++++++++++++++--- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/tools/transcript-editor/transcript_editor_server.py b/tools/transcript-editor/transcript_editor_server.py index ab80a6e95..3d08a14fb 100644 --- a/tools/transcript-editor/transcript_editor_server.py +++ b/tools/transcript-editor/transcript_editor_server.py @@ -276,6 +276,15 @@ def load_project(path): return doc, segments, word_map, title, language +# 中文/日文的词之间不插空格("你好世界" 不能被 join 成 "你好 世界"), +# 其它语言保留空格分隔。 +def _join_segment_text(pieces, language): + kept = [p for p in pieces if p and p.strip()] + if not kept: + return "" + return "".join(kept) if (language or "").lower() in ("zh", "ja") else " ".join(kept) + + def save_words(path, words_by_id): """把用户编辑的 words 写回;逐 segment 重建 text;备份原文件。""" with open(path, "r", encoding="utf-8") as f: @@ -283,6 +292,7 @@ def save_words(path, words_by_id): tr = (doc.get("transcripts") or [None])[0] if not tr: raise ValueError("该项目没有 transcripts 数组") + language = tr.get("language") or (doc.get("transcript") or {}).get("language") or "" new_words = {} for item in words_by_id: new_words[item["id"]] = item["text"] @@ -294,7 +304,7 @@ def save_words(path, words_by_id): # 重建每个 segment 的 text(与 words 保持一致) for s in tr.get("segments") or []: parts = [new_words.get(wid, "") for wid in s.get("wordIds", [])] - s["text"] = " ".join(p for p in parts if p.strip()) + s["text"] = _join_segment_text(parts, language) # 兼容旧字段 transcript(如果有) old = doc.get("transcript") if isinstance(old, dict) and old.get("words"): @@ -303,11 +313,24 @@ def save_words(path, words_by_id): w["text"] = new_words[w["id"]] for s in old.get("segments") or []: parts = [new_words.get(wid, "") for wid in s.get("wordIds", [])] - s["text"] = " ".join(p for p in parts if p.strip()) - backup = path + ".bak-" + time.strftime("%Y%m%d-%H%M%S") + s["text"] = _join_segment_text(parts, language) + # 备份:加纳秒时间戳防同一秒两次保存互相覆盖;先写临时文件再原子替换, + # 避免 json.dump 写到一半中断导致项目文件损坏。 + backup = path + ".bak-" + time.strftime("%Y%m%d-%H%M%S-") + str(time.time_ns()) shutil.copy2(path, backup) - with open(path, "w", encoding="utf-8") as f: - json.dump(doc, f, ensure_ascii=False, indent=2) + temp_path = path + ".tmp-" + str(os.getpid()) + "-" + str(time.time_ns()) + try: + with open(temp_path, "w", encoding="utf-8") as f: + json.dump(doc, f, ensure_ascii=False, indent=2) + f.flush() + os.fsync(f.fileno()) + os.replace(temp_path, path) + finally: + if os.path.exists(temp_path): + try: + os.remove(temp_path) + except OSError: + pass return os.path.basename(backup), touched @@ -329,6 +352,28 @@ def _read_json(self): return {} return json.loads(self.rfile.read(length).decode("utf-8")) + def _check_request(self): + # 只接受来自本工具页面的同源 JSON 请求,防止外部网页跨站调用。 + content_type = (self.headers.get("Content-Type") or "").split(";", 1)[0].strip() + origin = self.headers.get("Origin") + if content_type != "application/json": + raise ValueError("请使用 application/json 提交") + if origin and origin != "http://127.0.0.1:%d" % PORT: + raise ValueError("拒绝跨站请求") + + @staticmethod + def _resolve_project_path(raw_path): + # 归一化并限制在 PROJECTS_DIR 内,防止路径穿越。 + root = os.path.realpath(PROJECTS_DIR) + path = os.path.realpath(raw_path) + try: + inside = os.path.commonpath([root, path]) == root + except ValueError: + inside = False + if not inside or not path.endswith(".openscreen"): + raise ValueError("无效的项目路径") + return path + def do_GET(self): if urlparse(self.path).path in ("/", "/index.html"): body = PAGE.encode("utf-8") @@ -342,6 +387,7 @@ def do_GET(self): def do_POST(self): try: + self._check_request() data = self._read_json() action = urlparse(self.path).path.rsplit("/", 1)[-1] if action == "projects": @@ -356,7 +402,7 @@ def do_POST(self): title = (json.load(f).get("project") or {}).get( "title", fn ) - except Exception: + except (OSError, ValueError): title = fn out.append({ "path": p, @@ -368,10 +414,10 @@ def do_POST(self): }) self._send({"ok": True, "projects": out}) elif action == "load": - path = data.get("path", "") - if not path or not os.path.isfile(path): + path = self._resolve_project_path(data.get("path", "")) + if not os.path.isfile(path): raise ValueError("文件不存在") - doc, segments, word_map, title, language = load_project(path) + _doc, segments, word_map, title, language = load_project(path) self._send({ "ok": True, "title": title, @@ -380,14 +426,14 @@ def do_POST(self): "words": word_map, }) elif action == "save": - path = data.get("path", "") + path = self._resolve_project_path(data.get("path", "")) words = data.get("words", []) if not words: raise ValueError("没有收到修改内容") backup, touched = save_words(path, words) self._send({"ok": True, "backup": backup, "touched": touched}) elif action == "export": - path = data.get("path", "") + path = self._resolve_project_path(data.get("path", "")) with open(path, "r", encoding="utf-8") as f: raw = f.read() import base64 From 27bc7582c47ff68a04d8c73b682aead921f96cb5 Mon Sep 17 00:00:00 2001 From: yaoboo Date: Sat, 22 Aug 2026 18:05:56 +0800 Subject: [PATCH 3/6] feat: support selecting any project transcript + normalize language code Address CodeRabbit review round 2: 1. Multi-transcript support. load_project/save_words no longer assume transcripts[0]. load_project now returns a transcript overview list (id, assetId, language, word/segment counts) plus the active index, and accepts an active_id. save_words accepts a transcript_id and updates only the matching transcript by id (falling back to the first when absent), keeping the legacy top-level transcript field in sync when it aliases the first entry. The UI gets a transcript selector shown when a project has more than one transcript; switching reloads that transcript and saving sends its id. 2. Language-code normalization. _join_segment_text now keys off the primary subtag (_language_primary: 'zh-CN' -> 'zh') so qualified codes like zh-CN / zh-TW / ja-JP use the no-space join and don't rewrite CJK segment text on save; other languages keep the space join. Verified against a two-transcript fixture (edit trB leaves trA intact, legacy field stays in sync) and a real project over HTTP (meta list, activeId, selector rendered). --- .../transcript_editor_server.py | 173 ++++++++++++++---- 1 file changed, 138 insertions(+), 35 deletions(-) diff --git a/tools/transcript-editor/transcript_editor_server.py b/tools/transcript-editor/transcript_editor_server.py index 3d08a14fb..d6cd4bc7f 100644 --- a/tools/transcript-editor/transcript_editor_server.py +++ b/tools/transcript-editor/transcript_editor_server.py @@ -97,6 +97,7 @@
+ @@ -112,6 +113,21 @@