diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 19df738..508c0c9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -106,9 +106,9 @@ jobs: - name: 构建 deb 与 rpm env: - MELOASR_VERSION: ${{ needs.update-flake-lock.outputs.version }} - MELOASR_DEB_ARCH: ${{ matrix.deb_arch }} - MELOASR_ELECTRON_APP_DIR: ${{ matrix.electron_app_dir }} + TAMA_ASR_VERSION: ${{ needs.update-flake-lock.outputs.version }} + TAMA_ASR_DEB_ARCH: ${{ matrix.deb_arch }} + TAMA_ASR_ELECTRON_APP_DIR: ${{ matrix.electron_app_dir }} run: | pnpm install --frozen-lockfile pnpm run package:deb @@ -165,17 +165,17 @@ jobs: env: CACHIX_CACHE_NAME: ${{ vars.CACHIX_CACHE_NAME }} run: | - nix build ".#packages.${{ matrix.system }}.meloasr" + nix build ".#packages.${{ matrix.system }}.tama-asr" store_path="$(readlink -f result)" cachix push "$CACHIX_CACHE_NAME" "$store_path" cachix pin --keep-revisions 1 "$CACHIX_CACHE_NAME" \ - "meloasr-${{ matrix.system }}" "$store_path" - printf '%s\n' "$store_path" > "meloasr-${{ matrix.system }}.txt" + "tama-asr-${{ matrix.system }}" "$store_path" + printf '%s\n' "$store_path" > "tama-asr-${{ matrix.system }}.txt" - uses: actions/upload-artifact@v4 with: name: nix-build-${{ matrix.system }} - path: meloasr-${{ matrix.system }}.txt + path: tama-asr-${{ matrix.system }}.txt publish-release: name: 创建 GitHub Release @@ -218,7 +218,7 @@ jobs: with: tag_name: v${{ needs.update-flake-lock.outputs.version }} target_commitish: ${{ needs.update-flake-lock.outputs.commit_sha }} - name: MeloASR ${{ needs.update-flake-lock.outputs.version }} + name: TamaASR ${{ needs.update-flake-lock.outputs.version }} body_path: release-notes.md files: release/* fail_on_unmatched_files: true diff --git a/.github/workflows/update-nix-cache.yml b/.github/workflows/update-nix-cache.yml index f4727d6..71e1b93 100644 --- a/.github/workflows/update-nix-cache.yml +++ b/.github/workflows/update-nix-cache.yml @@ -87,8 +87,8 @@ jobs: env: CACHIX_CACHE_NAME: ${{ vars.CACHIX_CACHE_NAME }} run: | - nix build ".#packages.${{ matrix.system }}.meloasr" + nix build ".#packages.${{ matrix.system }}.tama-asr" store_path="$(readlink -f result)" cachix push "$CACHIX_CACHE_NAME" "$store_path" cachix pin --keep-revisions 1 "$CACHIX_CACHE_NAME" \ - "meloasr-${{ matrix.system }}" "$store_path" + "tama-asr-${{ matrix.system }}" "$store_path" diff --git a/AGENTS.md b/AGENTS.md index a16b330..7710875 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,8 +1,8 @@ -# MeloASR 维护约定 +# TamaASR 维护约定 ## 项目范围 -MeloASR 是仅面向 Linux 的 Fcitx5 桌面语音输入工具。项目名为 `MeloASR`,分发包名为 `meloasr`,当前版本为 `0.1.17`。 +TamaASR 是仅面向 Linux 的 Fcitx5 桌面语音输入工具。项目名为 `TamaASR`,分发包名为 `tama-asr`,当前版本为 `1.0.0`。 不得恢复 Windows、PowerShell 或 Tauri 输出路径。发行版差异只能存在于依赖说明和打包配置,不能进入语音输入核心逻辑。 @@ -44,7 +44,7 @@ MeloASR 是仅面向 Linux 的 Fcitx5 桌面语音输入工具。项目名为 `M ## Fcitx5 与本地协议 -- Socket:`$XDG_RUNTIME_DIR/meloasr/fcitx5.sock`;目录 `0700`,Socket `0600`; +- Socket:`$XDG_RUNTIME_DIR/tama-asr/fcitx5.sock`;目录 `0700`,Socket `0600`; - JSONL 协议版本:2; - `sessionId` 隔离轮次,`revision` 单调递增; - `text` 永远是当前完整文本; diff --git a/CHANGELOG.md b/CHANGELOG.md index 14a673e..f6e7a75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ 本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 的格式。 +## [1.0.0] - 2026-09-01 + +### 变更 + +- 项目更名为 TamaASR,分发包名改为 `tama-asr`,并迁移应用标识、Fcitx5 addon、本地 Socket、持久会话、桌面入口及安装路径。 +- 将仓库地址更新为 ,并为 deb、RPM 和 Arch 包声明替换旧包的关系。 + ## [0.1.17] - 2026-09-01 ### 变更 diff --git a/CLAUDE.md b/CLAUDE.md index a16b330..7710875 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,8 +1,8 @@ -# MeloASR 维护约定 +# TamaASR 维护约定 ## 项目范围 -MeloASR 是仅面向 Linux 的 Fcitx5 桌面语音输入工具。项目名为 `MeloASR`,分发包名为 `meloasr`,当前版本为 `0.1.17`。 +TamaASR 是仅面向 Linux 的 Fcitx5 桌面语音输入工具。项目名为 `TamaASR`,分发包名为 `tama-asr`,当前版本为 `1.0.0`。 不得恢复 Windows、PowerShell 或 Tauri 输出路径。发行版差异只能存在于依赖说明和打包配置,不能进入语音输入核心逻辑。 @@ -44,7 +44,7 @@ MeloASR 是仅面向 Linux 的 Fcitx5 桌面语音输入工具。项目名为 `M ## Fcitx5 与本地协议 -- Socket:`$XDG_RUNTIME_DIR/meloasr/fcitx5.sock`;目录 `0700`,Socket `0600`; +- Socket:`$XDG_RUNTIME_DIR/tama-asr/fcitx5.sock`;目录 `0700`,Socket `0600`; - JSONL 协议版本:2; - `sessionId` 隔离轮次,`revision` 单调递增; - `text` 永远是当前完整文本; diff --git a/README.md b/README.md index 3ccb694..88a4484 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# MeloASR +# TamaASR 大模型的进步推动了自然语言处理的进化,语音输入正在成为主流。在其它桌面平台下,微信输入法,豆包输入法,千问输入法等支持语音输入甚至以此为卖点的新兴中文输入法层出不穷。 而在linux下,相关领域却长期空白,现有实现主要聚焦于以下几种类型: @@ -11,7 +11,7 @@ api调用——调用各大ai厂商的语音转文字api。显然,该方案最 因此,本项目使用了一种全新的思路:在后台运行一个electron应用,并在里面登录千问,元宝等网页版对话作为后端,实时抓取语音输入到输入框中的结果,并传递给fcitx5,从而让linux用户也用上高质量的语音输入。 -简而言之,MeloASR 是面向 Linux/Fcitx5 的桌面语音输入工具。应用使用受支持网页平台自身的录音、流式识别、纠错、断句和标点能力,并把网页编辑器中的当前完整文本实时同步到活动的 Fcitx5 InputContext。 +简而言之,TamaASR 是面向 Linux/Fcitx5 的桌面语音输入工具。应用使用受支持网页平台自身的录音、流式识别、纠错、断句和标点能力,并把网页编辑器中的当前完整文本实时同步到活动的 Fcitx5 InputContext。 当前后端: @@ -31,7 +31,7 @@ api调用——调用各大ai厂商的语音转文字api。显然,该方案最 网页后端适配器 → Electron 后端窗口与登录会话 → 会话状态机 - → $XDG_RUNTIME_DIR/meloasr/fcitx5.sock + → $XDG_RUNTIME_DIR/tama-asr/fcitx5.sock → Fcitx5 常驻 addon → 当前应用的 preedit / commit ``` diff --git a/flake.nix b/flake.nix index 16503b9..3570a21 100644 --- a/flake.nix +++ b/flake.nix @@ -1,5 +1,5 @@ { - description = "MeloASR — web-backed voice input for Fcitx5"; + description = "TamaASR — web-backed voice input for Fcitx5"; inputs.nixpkgs.url = "github:Melorise/nixpkgs/nixos-unstable"; @@ -12,13 +12,13 @@ let pkgs = import nixpkgs { inherit system; }; in { default = pkgs.callPackage ./packaging/nix/package.nix { }; - meloasr = self.packages.${system}.default; + tama-asr = self.packages.${system}.default; }); apps = forAllSystems (system: { default = { type = "app"; - program = "${self.packages.${system}.default}/bin/meloasr"; + program = "${self.packages.${system}.default}/bin/tama-asr"; }; }); diff --git a/linux/fcitx5/CMakeLists.txt b/linux/fcitx5/CMakeLists.txt index 962f1d1..a462272 100644 --- a/linux/fcitx5/CMakeLists.txt +++ b/linux/fcitx5/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(meloasr-fcitx5 VERSION 0.1.17 LANGUAGES CXX) +project(tama-asr-fcitx5 VERSION 1.0.0 LANGUAGES CXX) include(GNUInstallDirs) include(CTest) @@ -8,16 +8,16 @@ find_package(Fcitx5Core 5.0 REQUIRED) find_package(Fcitx5Utils 5.0 REQUIRED) find_package(nlohmann_json 3.2 REQUIRED) -add_library(meloasr MODULE voiceinput.cpp) -target_compile_features(meloasr PRIVATE cxx_std_20) -target_compile_options(meloasr PRIVATE -Wall -Wextra -Wpedantic) -target_link_libraries(meloasr PRIVATE Fcitx5::Core Fcitx5::Utils nlohmann_json::nlohmann_json) -set_target_properties(meloasr PROPERTIES PREFIX "lib") +add_library(tama-asr MODULE voiceinput.cpp) +target_compile_features(tama-asr PRIVATE cxx_std_20) +target_compile_options(tama-asr PRIVATE -Wall -Wextra -Wpedantic) +target_link_libraries(tama-asr PRIVATE Fcitx5::Core Fcitx5::Utils nlohmann_json::nlohmann_json) +set_target_properties(tama-asr PROPERTIES PREFIX "lib") -set(MELOASR_LIBRARY_PATH "${FCITX_INSTALL_ADDONDIR}/libmeloasr") -configure_file(meloasr.conf.in meloasr.conf @ONLY) -install(TARGETS meloasr LIBRARY DESTINATION "${FCITX_INSTALL_ADDONDIR}") -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/meloasr.conf" DESTINATION "${FCITX_INSTALL_PKGDATADIR}/addon") +set(TAMA_ASR_LIBRARY_PATH "${FCITX_INSTALL_ADDONDIR}/libtama-asr") +configure_file(tama-asr.conf.in tama-asr.conf @ONLY) +install(TARGETS tama-asr LIBRARY DESTINATION "${FCITX_INSTALL_ADDONDIR}") +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tama-asr.conf" DESTINATION "${FCITX_INSTALL_PKGDATADIR}/addon") if(BUILD_TESTING) add_executable(protocolsession_test protocolsession_test.cpp) diff --git a/linux/fcitx5/README.md b/linux/fcitx5/README.md index 0ed28b6..4d02cae 100644 --- a/linux/fcitx5/README.md +++ b/linux/fcitx5/README.md @@ -1,4 +1,4 @@ -# MeloASR Fcitx5 addon +# TamaASR Fcitx5 addon 该 addon 作为 Fcitx5 常驻 Module 工作,不需要切换到独立输入法。 @@ -18,8 +18,8 @@ fcitx5 -r 安装文件: ```text -~/.local/lib/fcitx5/libmeloasr.so -~/.local/share/fcitx5/addon/meloasr.conf +~/.local/lib/fcitx5/libtama-asr.so +~/.local/share/fcitx5/addon/tama-asr.conf ``` -本地协议使用 `$XDG_RUNTIME_DIR/meloasr/fcitx5.sock`,目录权限 `0700`,Socket 权限 `0600`。协议版本为 2,支持 `configure` 动态快捷键和 `activate` 悬浮球启动请求。 +本地协议使用 `$XDG_RUNTIME_DIR/tama-asr/fcitx5.sock`,目录权限 `0700`,Socket 权限 `0600`。协议版本为 2,支持 `configure` 动态快捷键和 `activate` 悬浮球启动请求。 diff --git a/linux/fcitx5/install-user.sh b/linux/fcitx5/install-user.sh index 66cd331..e06662e 100755 --- a/linux/fcitx5/install-user.sh +++ b/linux/fcitx5/install-user.sh @@ -17,4 +17,4 @@ rm -f -- \ "${HOME}/.local/lib/fcitx5/libvoiceinput.so" \ "${HOME}/.local/share/fcitx5/addon/voiceinput.conf" -echo "已安装 MeloASR Fcitx5 插件,请重启 Fcitx5。" +echo "已安装 TamaASR Fcitx5 插件,请重启 Fcitx5。" diff --git a/linux/fcitx5/meloasr.conf.in b/linux/fcitx5/meloasr.conf.in deleted file mode 100644 index 3cb7c2f..0000000 --- a/linux/fcitx5/meloasr.conf.in +++ /dev/null @@ -1,14 +0,0 @@ -[Addon] -Name=MeloASR -Name[zh_CN]=MeloASR -Comment=Connect MeloASR web backends to the active input context -Comment[zh_CN]=将 MeloASR 网页后端连接到当前输入上下文 -Type=SharedLibrary -Library=@MELOASR_LIBRARY_PATH@ -Category=Module -Version=0.1.17 -OnDemand=False -Configurable=False - -[Addon/Dependencies] -0=core:5.0.0 diff --git a/linux/fcitx5/tama-asr.conf.in b/linux/fcitx5/tama-asr.conf.in new file mode 100644 index 0000000..578eaa2 --- /dev/null +++ b/linux/fcitx5/tama-asr.conf.in @@ -0,0 +1,14 @@ +[Addon] +Name=TamaASR +Name[zh_CN]=TamaASR +Comment=Connect TamaASR web backends to the active input context +Comment[zh_CN]=将 TamaASR 网页后端连接到当前输入上下文 +Type=SharedLibrary +Library=@TAMA_ASR_LIBRARY_PATH@ +Category=Module +Version=1.0.0 +OnDemand=False +Configurable=False + +[Addon/Dependencies] +0=core:5.0.0 diff --git a/linux/fcitx5/voiceinput.cpp b/linux/fcitx5/voiceinput.cpp index 8e164f9..4d48937 100644 --- a/linux/fcitx5/voiceinput.cpp +++ b/linux/fcitx5/voiceinput.cpp @@ -35,7 +35,7 @@ namespace { constexpr int kProtocolVersion = 2; constexpr std::size_t kMaxBufferBytes = 1024 * 1024; -#define MELOASR_DIAGNOSTIC_INFO if (!diagnosticLogging_) {} else FCITX_INFO() +#define TAMA_ASR_DIAGNOSTIC_INFO if (!diagnosticLogging_) {} else FCITX_INFO() class VoiceInputAddon final : public fcitx::AddonInstance { public: @@ -53,7 +53,7 @@ public: fcitx::EventType::InputContextFocusOut, fcitx::EventWatcherPhase::PostInputMethod, [this](fcitx::Event &event) { - MELOASR_DIAGNOSTIC_INFO << "MeloASR:InputContext focusOut,取消当前会话 active=" + TAMA_ASR_DIAGNOSTIC_INFO << "TamaASR:InputContext focusOut,取消当前会话 active=" << session_.active() << " awaiting=" << awaitingStart_; cancelForContext(static_cast(event).inputContext()); }); @@ -68,7 +68,7 @@ public: fcitx::EventType::InputContextReset, fcitx::EventWatcherPhase::PostInputMethod, [this](fcitx::Event &event) { - MELOASR_DIAGNOSTIC_INFO << "MeloASR:InputContext reset,取消当前会话 active=" + TAMA_ASR_DIAGNOSTIC_INFO << "TamaASR:InputContext reset,取消当前会话 active=" << session_.active() << " awaiting=" << awaitingStart_; cancelForContext(static_cast(event).inputContext()); }); @@ -79,7 +79,7 @@ public: auto *context = static_cast(event).inputContext(); if (context == focusedInputContext_) focusedInputContext_ = nullptr; if (context == inputContext_) { - MELOASR_DIAGNOSTIC_INFO << "MeloASR:InputContext destroyed,取消当前会话"; + TAMA_ASR_DIAGNOSTIC_INFO << "TamaASR:InputContext destroyed,取消当前会话"; sendControl("request-cancel"); resetLocalState(false); } @@ -118,7 +118,7 @@ private: if (action == VoiceKeyAction::Start) { event.filterAndAccept(); - MELOASR_DIAGNOSTIC_INFO << "网页语音输入:快捷键按下 held=" << held_ + TAMA_ASR_DIAGNOSTIC_INFO << "网页语音输入:快捷键按下 held=" << held_ << " awaiting=" << awaitingStart_ << " active=" << session_.active(); if (!ensureConnected()) { @@ -132,7 +132,7 @@ private: if (action == VoiceKeyAction::Stop) { event.filterAndAccept(); - MELOASR_DIAGNOSTIC_INFO << "网页语音输入:快捷键松开 awaiting=" << awaitingStart_ + TAMA_ASR_DIAGNOSTIC_INFO << "网页语音输入:快捷键松开 awaiting=" << awaitingStart_ << " active=" << session_.active(); held_ = false; if (awaitingStart_ || session_.active()) sendControl("request-stop"); @@ -143,7 +143,7 @@ private: if (event.key().check(FcitxKey_Escape)) { event.filterAndAccept(); - MELOASR_DIAGNOSTIC_INFO << "MeloASR:录音中收到 Escape,取消当前会话"; + TAMA_ASR_DIAGNOSTIC_INFO << "TamaASR:录音中收到 Escape,取消当前会话"; sendControl("request-cancel"); clearPreedit(); resetLocalState(false); @@ -151,7 +151,7 @@ private: } // 用户开始键盘输入时,立即取消语音会话,并让该按键继续交给原输入法。 - MELOASR_DIAGNOSTIC_INFO << "MeloASR:录音中收到其它按键,取消当前会话 key=" + TAMA_ASR_DIAGNOSTIC_INFO << "TamaASR:录音中收到其它按键,取消当前会话 key=" << event.key().toString() << " rawKey=" << event.rawKey().toString() << " repeat=" << event.rawKey().states().test(fcitx::KeyState::Repeat); sendControl("request-cancel"); @@ -163,7 +163,7 @@ private: if (!context || !context->hasFocus()) return false; if (!context->inputPanel().clientPreedit().empty() || !context->inputPanel().preedit().empty()) { - FCITX_WARN() << "MeloASR:当前输入法存在未提交文本,本轮未启动"; + FCITX_WARN() << "TamaASR:当前输入法存在未提交文本,本轮未启动"; return false; } inputContext_ = context; @@ -179,12 +179,12 @@ private: if (probe > 0 || (probe < 0 && (errno == EAGAIN || errno == EWOULDBLOCK))) { return true; } - MELOASR_DIAGNOSTIC_INFO << "网页语音输入:检测到失效的 Electron Socket,立即重连"; + TAMA_ASR_DIAGNOSTIC_INFO << "网页语音输入:检测到失效的 Electron Socket,立即重连"; handleDisconnect(); } const char *runtimeDir = std::getenv("XDG_RUNTIME_DIR"); if (!runtimeDir || !*runtimeDir) return false; - const std::string socketPath = std::string(runtimeDir) + "/meloasr/fcitx5.sock"; + const std::string socketPath = std::string(runtimeDir) + "/tama-asr/fcitx5.sock"; const int fd = ::socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); if (fd < 0) return false; sockaddr_un address{}; @@ -267,11 +267,11 @@ private: awaitingStart_ || session_.active()) return; fcitx::Key candidate(message["shortcut"].get()); if (!candidate.isValid() || !candidate.hasModifier()) { - FCITX_WARN() << "MeloASR:拒绝无效快捷键"; + FCITX_WARN() << "TamaASR:拒绝无效快捷键"; return; } trigger_ = std::move(candidate); - MELOASR_DIAGNOSTIC_INFO << "MeloASR:快捷键已更新为 " << trigger_.toString(); + TAMA_ASR_DIAGNOSTIC_INFO << "TamaASR:快捷键已更新为 " << trigger_.toString(); return; } if (type == "activate") { @@ -285,7 +285,7 @@ private: if (!message.contains("sessionId") || !message["sessionId"].is_string()) return; session_.start(message["sessionId"].get()); awaitingStart_ = false; - MELOASR_DIAGNOSTIC_INFO << "网页语音输入:会话开始,clientPreedit=" + TAMA_ASR_DIAGNOSTIC_INFO << "网页语音输入:会话开始,clientPreedit=" << inputContext_->capabilityFlags().test(fcitx::CapabilityFlag::Preedit); // 新会话尚无文本;重复发布空 preedit 会使部分 frontend 立刻 reset。 return; @@ -293,7 +293,7 @@ private: if (type == "cancel") { const std::string incoming = message.value("sessionId", std::string()); if (!incoming.empty() && !session_.matches(incoming)) return; - MELOASR_DIAGNOSTIC_INFO << "MeloASR:收到 Electron cancel,sessionIdEmpty=" + TAMA_ASR_DIAGNOSTIC_INFO << "TamaASR:收到 Electron cancel,sessionIdEmpty=" << incoming.empty() << " message=" << message.value("message", std::string()); clearPreedit(); @@ -306,7 +306,7 @@ private: const std::int64_t incomingRevision = message["revision"].get(); if (!session_.accept(message.value("sessionId", std::string()), incomingRevision)) return; currentText_ = message["text"].get(); - MELOASR_DIAGNOSTIC_INFO << "网页语音输入:收到 " << type << " revision=" + TAMA_ASR_DIAGNOSTIC_INFO << "网页语音输入:收到 " << type << " revision=" << incomingRevision << " bytes=" << currentText_.size(); setPreedit(currentText_); if (type == "finish") { @@ -374,7 +374,7 @@ private: } void handleDisconnect() { - MELOASR_DIAGNOSTIC_INFO << "MeloASR:Electron Socket 断开,取消当前会话 active=" + TAMA_ASR_DIAGNOSTIC_INFO << "TamaASR:Electron Socket 断开,取消当前会话 active=" << session_.active() << " awaiting=" << awaitingStart_; clearPreedit(); resetLocalState(false); diff --git a/package.json b/package.json index 044da4f..3f7ca30 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { - "name": "meloasr", - "productName": "MeloASR", - "version": "0.1.17", + "name": "tama-asr", + "productName": "TamaASR", + "version": "1.0.0", "private": true, "packageManager": "pnpm@11.21.0", - "author": "MeloASR contributors", + "author": "TamaASR contributors", "description": "基于网页语音识别后端和 Fcitx5 的 Linux 实时语音输入工具", "main": "dist/main/index.js", "scripts": { diff --git a/packaging/README.md b/packaging/README.md index 30ae87a..f7b8017 100644 --- a/packaging/README.md +++ b/packaging/README.md @@ -1,11 +1,13 @@ # Linux 分发打包 -MeloASR 0.1.17 的系统包由两部分组成: +TamaASR 1.0.0 的系统包由两部分组成: -- Electron 应用安装到 `/opt/meloasr`,命令入口为 `/usr/bin/meloasr`; +- Electron 应用安装到 `/opt/tama-asr`,命令入口为 `/usr/bin/tama-asr`; - Fcitx5 常驻 addon 由目标发行版中的 CMake/Fcitx5 开发包编译,并安装到该环境报告的 addon 目录。 -安装包同时提供桌面入口、项目图标和 `/etc/xdg/autostart/meloasr.desktop`,因此安装后的默认行为是随桌面会话启动。设置页关闭自启动时,应用需要在用户级 autostart 目录写入覆盖项,不能删除系统包所属文件。 +安装包同时提供桌面入口、项目图标和 `/etc/xdg/autostart/tama-asr.desktop`,因此安装后的默认行为是随桌面会话启动。设置页关闭自启动时,应用需要在用户级 autostart 目录写入覆盖项,不能删除系统包所属文件。 + +`tama-asr` 1.0.0 的 deb、RPM 和 Arch 元数据均声明替换旧 `meloasr` 包;通过对应发行版的包管理器安装新包时,旧应用、Fcitx5 addon 和桌面文件会一并卸载。 ## 统一构建契约 @@ -15,7 +17,7 @@ deb、rpm 和 Arch 配置期望项目提供: pnpm run build:linux:dir ``` -该命令应在 `release/linux-unpacked/` 生成可直接运行的 Electron 目录,并且主程序名必须是 `meloasr`。仓库提供的 `electron-builder.yml` 只生成这一中间目录;deb/rpm/Arch 的系统文件仍由各自脚本管理,避免用安装钩子复制未被包管理器追踪的 Fcitx5 文件。 +该命令应在 `release/linux-unpacked/` 生成可直接运行的 Electron 目录,并且主程序名必须是 `tama-asr`。仓库提供的 `electron-builder.yml` 只生成这一中间目录;deb/rpm/Arch 的系统文件仍由各自脚本管理,避免用安装钩子复制未被包管理器追踪的 Fcitx5 文件。 主项目可将脚本定义为: @@ -40,7 +42,7 @@ pnpm run build:linux:dir packaging/deb/build-deb.sh ``` -产物位于 `packaging/out/meloasr_0.1.17_.deb`。依赖名称按 Debian/Ubuntu 系列填写,但尚未在各发行版完成安装验证。 +产物位于 `packaging/out/tama-asr_1.0.0_.deb`。依赖名称按 Debian/Ubuntu 系列填写,但尚未在各发行版完成安装验证。 ## rpm diff --git a/packaging/arch/PKGBUILD b/packaging/arch/PKGBUILD index bfd31f1..ba0b795 100644 --- a/packaging/arch/PKGBUILD +++ b/packaging/arch/PKGBUILD @@ -1,16 +1,19 @@ -pkgname=meloasr -pkgver=0.1.17 +pkgname=tama-asr +pkgver=1.0.0 pkgrel=1 pkgdesc='Web-backed voice input for Fcitx5' arch=('x86_64') -url='https://github.com/Melorise/MeloASR' +url='https://github.com/Melorise/TamaASR' license=('MPL2') depends=('fcitx5' 'gtk3' 'nss' 'libxss' 'mesa' 'alsa-lib') +conflicts=('meloasr') +provides=('meloasr') +replaces=('meloasr') makedepends=('nodejs' 'pnpm' 'cmake' 'gcc' 'nlohmann-json') source=("${pkgname}-${pkgver}.tar.gz::${url}/archive/refs/tags/v${pkgver}.tar.gz") sha256sums=('SKIP') -_source_dir="MeloASR-${pkgver}" +_source_dir="TamaASR-${pkgver}" build() { cd "${srcdir}/${_source_dir}" @@ -31,17 +34,17 @@ check() { package() { cd "${srcdir}/${_source_dir}" - install -d "${pkgdir}/opt/meloasr" - cp -a release/linux-unpacked/. "${pkgdir}/opt/meloasr/" - install -Dm755 packaging/assets/meloasr-wrapper "${pkgdir}/usr/bin/meloasr" - install -Dm644 packaging/assets/meloasr.desktop \ - "${pkgdir}/usr/share/applications/meloasr.desktop" - install -Dm644 packaging/assets/meloasr-autostart.desktop \ - "${pkgdir}/etc/xdg/autostart/meloasr.desktop" - install -Dm644 packaging/assets/meloasr.metainfo.xml \ - "${pkgdir}/usr/share/metainfo/meloasr.metainfo.xml" + install -d "${pkgdir}/opt/tama-asr" + cp -a release/linux-unpacked/. "${pkgdir}/opt/tama-asr/" + install -Dm755 packaging/assets/tama-asr-wrapper "${pkgdir}/usr/bin/tama-asr" + install -Dm644 packaging/assets/tama-asr.desktop \ + "${pkgdir}/usr/share/applications/tama-asr.desktop" + install -Dm644 packaging/assets/tama-asr-autostart.desktop \ + "${pkgdir}/etc/xdg/autostart/tama-asr.desktop" + install -Dm644 packaging/assets/tama-asr.metainfo.xml \ + "${pkgdir}/usr/share/metainfo/tama-asr.metainfo.xml" install -Dm644 src/assets/logo.png \ - "${pkgdir}/usr/share/pixmaps/meloasr.png" + "${pkgdir}/usr/share/pixmaps/tama-asr.png" DESTDIR="${pkgdir}" cmake --install build/fcitx5 } diff --git a/packaging/arch/README.md b/packaging/arch/README.md index 0897167..47b16c7 100644 --- a/packaging/arch/README.md +++ b/packaging/arch/README.md @@ -4,8 +4,8 @@ ```bash curl --fail --location --remote-name \ - https://github.com/Melorise/MeloASR/releases/download/v0.1.17/PKGBUILD + https://github.com/Melorise/TamaASR/releases/download/v1.0.0/PKGBUILD makepkg --syncdeps --cleanbuild ``` -`PKGBUILD` 会根据 `pkgver` 直接下载 GitHub Release 标签对应的源码归档,无需手动下载、重命名或放置源码包。源码地址固定为 `https://github.com/Melorise/MeloASR/archive/refs/tags/v${pkgver}.tar.gz`,因此同一份 `PKGBUILD` 可以重复构建该版本。 +`PKGBUILD` 会根据 `pkgver` 直接下载 GitHub Release 标签对应的源码归档,无需手动下载、重命名或放置源码包。源码地址固定为 `https://github.com/Melorise/TamaASR/archive/refs/tags/v${pkgver}.tar.gz`,因此同一份 `PKGBUILD` 可以重复构建该版本。 diff --git a/packaging/assets/meloasr-autostart.desktop b/packaging/assets/meloasr-autostart.desktop deleted file mode 100644 index 8752ab9..0000000 --- a/packaging/assets/meloasr-autostart.desktop +++ /dev/null @@ -1,12 +0,0 @@ -[Desktop Entry] -Type=Application -Name=MeloASR -Comment=Start MeloASR when signing in -Comment[zh_CN]=登录桌面后启动 MeloASR -Exec=meloasr --autostart -Icon=meloasr -Terminal=false -X-GNOME-Autostart-enabled=true -X-KDE-autostart-after=panel -NoDisplay=true - diff --git a/packaging/assets/meloasr-wrapper b/packaging/assets/meloasr-wrapper deleted file mode 100755 index fc2acd1..0000000 --- a/packaging/assets/meloasr-wrapper +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec /opt/meloasr/meloasr --ozone-platform=x11 "$@" diff --git a/packaging/assets/tama-asr-autostart.desktop b/packaging/assets/tama-asr-autostart.desktop new file mode 100644 index 0000000..d5c2971 --- /dev/null +++ b/packaging/assets/tama-asr-autostart.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Name=TamaASR +Comment=Start TamaASR when signing in +Comment[zh_CN]=登录桌面后启动 TamaASR +Exec=tama-asr --autostart +Icon=tama-asr +Terminal=false +X-GNOME-Autostart-enabled=true +X-KDE-autostart-after=panel +NoDisplay=true diff --git a/packaging/assets/tama-asr-wrapper b/packaging/assets/tama-asr-wrapper new file mode 100755 index 0000000..f65c724 --- /dev/null +++ b/packaging/assets/tama-asr-wrapper @@ -0,0 +1,2 @@ +#!/bin/sh +exec /opt/tama-asr/tama-asr --ozone-platform=x11 "$@" diff --git a/packaging/assets/meloasr.desktop b/packaging/assets/tama-asr.desktop similarity index 83% rename from packaging/assets/meloasr.desktop rename to packaging/assets/tama-asr.desktop index 0b5d8b5..cb5df7b 100644 --- a/packaging/assets/meloasr.desktop +++ b/packaging/assets/tama-asr.desktop @@ -1,10 +1,10 @@ [Desktop Entry] Type=Application -Name=MeloASR +Name=TamaASR Comment=Web-backed voice input for Fcitx5 Comment[zh_CN]=基于网页后端的 Fcitx5 语音输入工具 -Exec=meloasr -Icon=meloasr +Exec=tama-asr +Icon=tama-asr Terminal=false Categories=Utility;Accessibility; StartupNotify=false diff --git a/packaging/assets/meloasr.metainfo.xml b/packaging/assets/tama-asr.metainfo.xml similarity index 72% rename from packaging/assets/meloasr.metainfo.xml rename to packaging/assets/tama-asr.metainfo.xml index a345700..44607f7 100644 --- a/packaging/assets/meloasr.metainfo.xml +++ b/packaging/assets/tama-asr.metainfo.xml @@ -1,21 +1,22 @@ - io.github.meloasr.MeloASR - MeloASR + io.github.melorise.TamaASR + TamaASR Web-backed voice input for Fcitx5 基于网页后端的 Fcitx5 语音输入工具 CC0-1.0 MPL-2.0 -

MeloASR connects supported web speech-recognition backends to the active Fcitx5 input context.

-

MeloASR 将支持的网页语音识别后端连接到当前 Fcitx5 输入上下文。

+

TamaASR connects supported web speech-recognition backends to the active Fcitx5 input context.

+

TamaASR 将支持的网页语音识别后端连接到当前 Fcitx5 输入上下文。

- https://github.com/Melorise/MeloASR - meloasr.desktop + https://github.com/Melorise/TamaASR + tama-asr.desktop - meloasr + tama-asr + diff --git a/packaging/deb/build-deb.sh b/packaging/deb/build-deb.sh index e62560b..45ca8e5 100755 --- a/packaging/deb/build-deb.sh +++ b/packaging/deb/build-deb.sh @@ -2,9 +2,9 @@ set -euo pipefail project_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)" -version="${MELOASR_VERSION:-0.1.17}" -arch="${MELOASR_DEB_ARCH:-$(dpkg --print-architecture)}" -app_dir="${1:-${MELOASR_ELECTRON_APP_DIR:-${project_dir}/release/linux-unpacked}}" +version="${TAMA_ASR_VERSION:-1.0.0}" +arch="${TAMA_ASR_DEB_ARCH:-$(dpkg --print-architecture)}" +app_dir="${1:-${TAMA_ASR_ELECTRON_APP_DIR:-${project_dir}/release/linux-unpacked}}" work_dir="${project_dir}/packaging/out/deb-root" output_dir="${project_dir}/packaging/out" @@ -21,4 +21,4 @@ sed \ mkdir -p "${output_dir}" dpkg-deb --root-owner-group --build "${work_dir}" \ - "${output_dir}/meloasr_${version}_${arch}.deb" + "${output_dir}/tama-asr_${version}_${arch}.deb" diff --git a/packaging/deb/control.in b/packaging/deb/control.in index 13fa7a9..ab621d8 100644 --- a/packaging/deb/control.in +++ b/packaging/deb/control.in @@ -1,11 +1,13 @@ -Package: meloasr +Package: tama-asr Version: @VERSION@ Section: sound Priority: optional Architecture: @ARCH@ -Maintainer: MeloASR contributors +Maintainer: TamaASR contributors Installed-Size: @INSTALLED_SIZE@ Depends: fcitx5, libc6, libstdc++6, libgtk-3-0, libnss3, libxss1, libgbm1, libasound2 | libasound2t64 +Conflicts: meloasr +Replaces: meloasr Description: Web-backed voice input for Fcitx5 - MeloASR hosts supported web speech-recognition backends and sends their + TamaASR hosts supported web speech-recognition backends and sends their live corrected text to the active Fcitx5 input context. diff --git a/packaging/electron-builder.yml b/packaging/electron-builder.yml index 2a59326..128fb74 100644 --- a/packaging/electron-builder.yml +++ b/packaging/electron-builder.yml @@ -1,5 +1,5 @@ -appId: io.github.meloasr.MeloASR -productName: MeloASR +appId: io.github.melorise.TamaASR +productName: TamaASR asar: true directories: @@ -16,6 +16,6 @@ extraResources: linux: target: - dir - executableName: meloasr + executableName: tama-asr icon: src/assets/logo.png category: Utility diff --git a/packaging/nix/package.nix b/packaging/nix/package.nix index c6e1661..6629618 100644 --- a/packaging/nix/package.nix +++ b/packaging/nix/package.nix @@ -16,7 +16,7 @@ let pnpm = pnpm_11; in stdenv.mkDerivation (finalAttrs: { - pname = "meloasr"; + pname = "tama-asr"; version = (builtins.fromJSON (builtins.readFile ../../package.json)).version; src = ../..; @@ -67,24 +67,24 @@ stdenv.mkDerivation (finalAttrs: { installPhase = '' runHook preInstall - appDir="$out/share/meloasr/app" + appDir="$out/share/tama-asr/app" mkdir -p "$appDir" "$out/bin" "$out/share/applications" \ "$out/share/pixmaps" "$out/share/metainfo" \ "$out/etc/xdg/autostart" cp package.json "$appDir/" cp -r dist "$appDir/" - install -Dm644 packaging/assets/meloasr.desktop \ - "$out/share/applications/meloasr.desktop" - install -Dm644 packaging/assets/meloasr-autostart.desktop \ - "$out/etc/xdg/autostart/meloasr.desktop" - install -Dm644 packaging/assets/meloasr.metainfo.xml \ - "$out/share/metainfo/meloasr.metainfo.xml" + install -Dm644 packaging/assets/tama-asr.desktop \ + "$out/share/applications/tama-asr.desktop" + install -Dm644 packaging/assets/tama-asr-autostart.desktop \ + "$out/etc/xdg/autostart/tama-asr.desktop" + install -Dm644 packaging/assets/tama-asr.metainfo.xml \ + "$out/share/metainfo/tama-asr.metainfo.xml" install -Dm644 src/assets/logo.png \ - "$out/share/pixmaps/meloasr.png" + "$out/share/pixmaps/tama-asr.png" cmake --install build/fcitx5 - makeWrapper ${electron}/bin/electron "$out/bin/meloasr" \ + makeWrapper ${electron}/bin/electron "$out/bin/tama-asr" \ --add-flags "$appDir" runHook postInstall @@ -92,9 +92,9 @@ stdenv.mkDerivation (finalAttrs: { meta = { description = "Web-backed voice input for Fcitx5"; - homepage = "https://github.com/Melorise/MeloASR"; + homepage = "https://github.com/Melorise/TamaASR"; license = lib.licenses.mpl20; - mainProgram = "meloasr"; + mainProgram = "tama-asr"; platforms = lib.platforms.linux; }; }) diff --git a/packaging/rpm/build-rpm.sh b/packaging/rpm/build-rpm.sh index 117795c..7490b19 100755 --- a/packaging/rpm/build-rpm.sh +++ b/packaging/rpm/build-rpm.sh @@ -2,8 +2,8 @@ set -euo pipefail project_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)" -version="${MELOASR_VERSION:-0.1.17}" -app_dir="${1:-${MELOASR_ELECTRON_APP_DIR:-${project_dir}/release/linux-unpacked}}" +version="${TAMA_ASR_VERSION:-1.0.0}" +app_dir="${1:-${TAMA_ASR_ELECTRON_APP_DIR:-${project_dir}/release/linux-unpacked}}" stage_dir="${project_dir}/packaging/out/rpm-root" top_dir="${project_dir}/packaging/out/rpmbuild" @@ -14,19 +14,19 @@ command -v rpmbuild >/dev/null || { rm -rf -- "${stage_dir}" "${top_dir}" "${project_dir}/packaging/scripts/stage-linux.sh" "${app_dir}" "${stage_dir}" -addon_file="$(find "${stage_dir}/usr" -type f -path '*/fcitx5/libmeloasr.so' \ +addon_file="$(find "${stage_dir}/usr" -type f -path '*/fcitx5/libtama-asr.so' \ -printf '/usr/%P\n' -quit)" if [[ -z "${addon_file}" ]]; then echo "未在安装根目录中找到 Fcitx5 addon。" >&2 exit 1 fi mkdir -p "${top_dir}"/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} -tar -C "${stage_dir}" -czf "${top_dir}/SOURCES/meloasr-root.tar.gz" . +tar -C "${stage_dir}" -czf "${top_dir}/SOURCES/tama-asr-root.tar.gz" . rpmbuild -bb \ --define "_topdir ${top_dir}" \ - --define "meloasr_version ${version}" \ - --define "meloasr_addon_file ${addon_file}" \ - "${project_dir}/packaging/rpm/meloasr-binary.spec" + --define "tama_asr_version ${version}" \ + --define "tama_asr_addon_file ${addon_file}" \ + "${project_dir}/packaging/rpm/tama-asr-binary.spec" find "${top_dir}/RPMS" -type f -name '*.rpm' -exec cp -f {} "${project_dir}/packaging/out/" \; diff --git a/packaging/rpm/meloasr-binary.spec b/packaging/rpm/tama-asr-binary.spec similarity index 51% rename from packaging/rpm/meloasr-binary.spec rename to packaging/rpm/tama-asr-binary.spec index 3d4ba3b..09f637a 100644 --- a/packaging/rpm/meloasr-binary.spec +++ b/packaging/rpm/tama-asr-binary.spec @@ -1,19 +1,21 @@ -Name: meloasr -Version: %{meloasr_version} +Name: tama-asr +Version: %{tama_asr_version} Release: 1%{?dist} Summary: Web-backed voice input for Fcitx5 License: MPL-2.0 -URL: https://github.com/Melorise/MeloASR -Source0: meloasr-root.tar.gz +URL: https://github.com/Melorise/TamaASR +Source0: tama-asr-root.tar.gz Requires: fcitx5 Requires: gtk3 Requires: nss Requires: libXScrnSaver Requires: mesa-libgbm +Obsoletes: meloasr < 1.0.0 +Provides: meloasr = %{version}-%{release} %description -MeloASR hosts supported web speech-recognition backends and sends their live +TamaASR hosts supported web speech-recognition backends and sends their live corrected text to the active Fcitx5 input context. %prep @@ -26,47 +28,50 @@ tar -C %{buildroot} -xzf %{SOURCE0} %files %defattr(-,root,root,-) -/opt/meloasr -/usr/bin/meloasr -%{meloasr_addon_file} -/usr/share/applications/meloasr.desktop -/usr/share/pixmaps/meloasr.png -/usr/share/metainfo/meloasr.metainfo.xml -/usr/share/fcitx5/addon/meloasr.conf -/etc/xdg/autostart/meloasr.desktop +/opt/tama-asr +/usr/bin/tama-asr +%{tama_asr_addon_file} +/usr/share/applications/tama-asr.desktop +/usr/share/pixmaps/tama-asr.png +/usr/share/metainfo/tama-asr.metainfo.xml +/usr/share/fcitx5/addon/tama-asr.conf +/etc/xdg/autostart/tama-asr.desktop %changelog -* Tue Sep 01 2026 MeloASR contributors - 0.1.17-1 +* Tue Sep 01 2026 TamaASR contributors - 1.0.0-1 +- Rename the package and replace the legacy meloasr package on upgrade. + +* Tue Sep 01 2026 TamaASR contributors - 0.1.17-1 - Replace the application and tray icons; use one icon for ready and one for all not-ready states. -* Wed Aug 26 2026 MeloASR contributors - 0.1.16-1 +* Wed Aug 26 2026 TamaASR contributors - 0.1.16-1 - Migrate dependency installation and build commands from npm to pnpm. -* Wed Aug 26 2026 MeloASR contributors - 0.1.15-1 +* Wed Aug 26 2026 TamaASR contributors - 0.1.15-1 - Download the Arch package source directly from the matching GitHub release tag. -* Wed Aug 26 2026 MeloASR contributors - 0.1.14-1 +* Wed Aug 26 2026 TamaASR contributors - 0.1.14-1 - Cache the active web editor for the duration of each speech session. -* Mon Aug 24 2026 MeloASR contributors - 0.1.13-1 +* Mon Aug 24 2026 TamaASR contributors - 0.1.13-1 - Create the settings renderer only when it is opened and destroy it on close. -* Sun Aug 23 2026 MeloASR contributors - 0.1.12-1 +* Sun Aug 23 2026 TamaASR contributors - 0.1.12-1 - Disable Electron GPU acceleration for background web renderers. -* Sun Aug 23 2026 MeloASR contributors - 0.1.11-1 +* Sun Aug 23 2026 TamaASR contributors - 0.1.11-1 - Release only the selected speech backend renderer. - Keep the overlay as a non-interactive session status indicator. -* Sun Aug 23 2026 MeloASR contributors - 0.1.10-1 +* Sun Aug 23 2026 TamaASR contributors - 0.1.10-1 - Restore the Nix npm configuration hook before building the application. -* Sun Aug 23 2026 MeloASR contributors - 0.1.9-1 +* Sun Aug 23 2026 TamaASR contributors - 0.1.9-1 - Fix multi-architecture package staging and RPM addon file ownership. - Fix Nix derivation configuration phase. -* Sun Aug 23 2026 MeloASR contributors - 0.1.8-1 +* Sun Aug 23 2026 TamaASR contributors - 0.1.8-1 - Fix Fcitx5 addon compatibility with Ubuntu 24.04. -* Sun Aug 23 2026 MeloASR contributors - 0.1.7-1 +* Sun Aug 23 2026 TamaASR contributors - 0.1.7-1 - Initial package diff --git a/packaging/scripts/stage-linux.sh b/packaging/scripts/stage-linux.sh index 25b0978..6cac436 100755 --- a/packaging/scripts/stage-linux.sh +++ b/packaging/scripts/stage-linux.sh @@ -2,9 +2,9 @@ set -euo pipefail project_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)" -app_dir="${1:-${MELOASR_ELECTRON_APP_DIR:-${project_dir}/release/linux-unpacked}}" +app_dir="${1:-${TAMA_ASR_ELECTRON_APP_DIR:-${project_dir}/release/linux-unpacked}}" stage_dir="${2:-${project_dir}/packaging/out/root}" -addon_build_dir="${MELOASR_ADDON_BUILD_DIR:-${project_dir}/packaging/out/fcitx5-build}" +addon_build_dir="${TAMA_ASR_ADDON_BUILD_DIR:-${project_dir}/packaging/out/fcitx5-build}" if [[ "${app_dir}" != /* ]]; then app_dir="${project_dir}/${app_dir}" @@ -16,30 +16,30 @@ if [[ ! -d "${app_dir}" ]]; then exit 1 fi -if [[ ! -x "${app_dir}/meloasr" ]]; then - echo "Electron 解包目录中没有可执行文件 meloasr:${app_dir}" >&2 +if [[ ! -x "${app_dir}/tama-asr" ]]; then + echo "Electron 解包目录中没有可执行文件 tama-asr:${app_dir}" >&2 exit 1 fi install -d \ - "${stage_dir}/opt/meloasr" \ + "${stage_dir}/opt/tama-asr" \ "${stage_dir}/usr/bin" \ "${stage_dir}/usr/share/applications" \ "${stage_dir}/usr/share/pixmaps" \ "${stage_dir}/usr/share/metainfo" \ "${stage_dir}/etc/xdg/autostart" -cp -a "${app_dir}/." "${stage_dir}/opt/meloasr/" -install -Dm755 "${project_dir}/packaging/assets/meloasr-wrapper" \ - "${stage_dir}/usr/bin/meloasr" -install -Dm644 "${project_dir}/packaging/assets/meloasr.desktop" \ - "${stage_dir}/usr/share/applications/meloasr.desktop" -install -Dm644 "${project_dir}/packaging/assets/meloasr-autostart.desktop" \ - "${stage_dir}/etc/xdg/autostart/meloasr.desktop" -install -Dm644 "${project_dir}/packaging/assets/meloasr.metainfo.xml" \ - "${stage_dir}/usr/share/metainfo/meloasr.metainfo.xml" +cp -a "${app_dir}/." "${stage_dir}/opt/tama-asr/" +install -Dm755 "${project_dir}/packaging/assets/tama-asr-wrapper" \ + "${stage_dir}/usr/bin/tama-asr" +install -Dm644 "${project_dir}/packaging/assets/tama-asr.desktop" \ + "${stage_dir}/usr/share/applications/tama-asr.desktop" +install -Dm644 "${project_dir}/packaging/assets/tama-asr-autostart.desktop" \ + "${stage_dir}/etc/xdg/autostart/tama-asr.desktop" +install -Dm644 "${project_dir}/packaging/assets/tama-asr.metainfo.xml" \ + "${stage_dir}/usr/share/metainfo/tama-asr.metainfo.xml" install -Dm644 "${project_dir}/src/assets/logo.png" \ - "${stage_dir}/usr/share/pixmaps/meloasr.png" + "${stage_dir}/usr/share/pixmaps/tama-asr.png" cmake -S "${project_dir}/linux/fcitx5" -B "${addon_build_dir}" \ -DCMAKE_BUILD_TYPE=Release \ diff --git a/src/backends/definitions.ts b/src/backends/definitions.ts index 64c5201..dc00b16 100644 --- a/src/backends/definitions.ts +++ b/src/backends/definitions.ts @@ -5,7 +5,7 @@ export const qianwenDefinition: BackendDefinition = Object.freeze({ label: '千问', url: 'https://www.qianwen.com/', origins: Object.freeze(['https://www.qianwen.com']), - partition: 'persist:meloasr-qianwen', + partition: 'persist:tama-asr-qianwen', editorSelector: '[data-slate-editor="true"][contenteditable="true"], [role="textbox"][contenteditable="true"]' }); @@ -14,7 +14,7 @@ export const yuanbaoDefinition: BackendDefinition = Object.freeze({ label: '元宝', url: 'https://yuanbao.tencent.com/', origins: Object.freeze(['https://yuanbao.tencent.com']), - partition: 'persist:meloasr-yuanbao', + partition: 'persist:tama-asr-yuanbao', editorSelector: '.ql-editor[contenteditable="true"], [contenteditable="true"][role="textbox"]' }); diff --git a/src/main/auto-start-service.ts b/src/main/auto-start-service.ts index c8aee19..2123258 100644 --- a/src/main/auto-start-service.ts +++ b/src/main/auto-start-service.ts @@ -5,7 +5,7 @@ import path from 'node:path'; import { resolveAutoStartAction } from './auto-start-policy'; export class AutoStartService { - private readonly filePath = path.join(os.homedir(), '.config', 'autostart', 'meloasr.desktop'); + private readonly filePath = path.join(os.homedir(), '.config', 'autostart', 'tama-asr.desktop'); apply(enabled: boolean): void { const action = resolveAutoStartAction(app.isPackaged, enabled); @@ -15,7 +15,7 @@ export class AutoStartService { fs.writeFileSync(this.filePath, [ '[Desktop Entry]', 'Type=Application', - 'Name=MeloASR', + 'Name=TamaASR', 'Hidden=true', '' ].join('\n'), { mode: 0o644 }); diff --git a/src/main/backend-manager.ts b/src/main/backend-manager.ts index 60f56de..8b238e7 100644 --- a/src/main/backend-manager.ts +++ b/src/main/backend-manager.ts @@ -54,13 +54,13 @@ export class BackendManager extends EventEmitter { skipTaskbar: true, width: 1280, height: 840, - title: `${definition.label} · MeloASR`, + title: `${definition.label} · TamaASR`, backgroundColor: '#ffffff', icon: path.join(app.getAppPath(), 'dist', 'assets', 'logo.png'), webPreferences: { partition: definition.partition, preload: path.join(__dirname, '..', 'preload', 'backend.js'), - additionalArguments: [`--meloasr-backend=${id}`], + additionalArguments: [`--tama-asr-backend=${id}`], nodeIntegration: false, contextIsolation: true, sandbox: true, diff --git a/src/main/fcitx-bridge.ts b/src/main/fcitx-bridge.ts index 9099eb8..962e41b 100644 --- a/src/main/fcitx-bridge.ts +++ b/src/main/fcitx-bridge.ts @@ -8,7 +8,7 @@ const MAX_LINE_BYTES = 1024 * 1024; export function defaultSocketPath(env: NodeJS.ProcessEnv = process.env): string { if (!env.XDG_RUNTIME_DIR) throw new Error('缺少 XDG_RUNTIME_DIR,无法创建 Fcitx5 本地 Socket'); - return path.join(env.XDG_RUNTIME_DIR, 'meloasr', 'fcitx5.sock'); + return path.join(env.XDG_RUNTIME_DIR, 'tama-asr', 'fcitx5.sock'); } export class JsonLineDecoder { diff --git a/src/main/index.ts b/src/main/index.ts index d94dfe1..26671fc 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -9,7 +9,7 @@ import { SettingsWindow } from './settings-window'; import { TrayController } from './tray-controller'; import type { BackendStatusPayload, Point } from '../shared/contracts'; -app.setName('MeloASR'); +app.setName('TamaASR'); app.disableHardwareAcceleration(); app.commandLine.appendSwitch('disable-gpu'); const singleInstance = app.requestSingleInstanceLock(); @@ -18,7 +18,7 @@ if (!singleInstance) { app.quit(); } else { void app.whenReady().then(bootstrap).catch((error) => { - console.error('[MeloASR 启动失败]', error); + console.error('[TamaASR 启动失败]', error); app.quit(); }); } @@ -36,8 +36,8 @@ async function bootstrap(): Promise { const overlay = new OverlayController(settings); await overlay.create(); const sessions = new SessionController(backends, bridge, overlay); - const repositoryUrl = process.env.MELOASR_REPOSITORY_URL?.trim() || - 'https://github.com/Melorise/MeloASR'; + const repositoryUrl = process.env.TAMA_ASR_REPOSITORY_URL?.trim() || + 'https://github.com/Melorise/TamaASR'; const settingsWindow = new SettingsWindow(settings, backends, overlay, sessions, repositoryUrl); registerIpc({ settings, autoStart, bridge, backends, overlay, sessions, settingsWindow }); const tray = new TrayController( @@ -164,7 +164,7 @@ function registerIpc(services: Services): void { if (typeof payload?.backend !== 'string' || !backends.senderIsActive(event, payload.backend)) return; if (!settings.get().diagnosticLogging) return; const { backend, stage, ...details } = payload; - console.info(`[MeloASR 网页诊断] backend=${backend} stage=${stage || 'unknown'} ${JSON.stringify(details)}`); + console.info(`[TamaASR 网页诊断] backend=${backend} stage=${stage || 'unknown'} ${JSON.stringify(details)}`); }); } diff --git a/src/main/session-controller.ts b/src/main/session-controller.ts index 82eb044..6abedb0 100644 --- a/src/main/session-controller.ts +++ b/src/main/session-controller.ts @@ -72,7 +72,7 @@ export class SessionController extends EventEmitter { cancel(message = '语音输入已取消'): void { if (!['starting', 'recording', 'stopping'].includes(this.state)) return; - console.warn(`[MeloASR 会话取消] state=${this.state} reason=${message}`); + console.warn(`[TamaASR 会话取消] state=${this.state} reason=${message}`); this.generation += 1; this.stopRequestedDuringStart = false; this.backends.activePage()?.webContents.send('backend-control', { @@ -104,7 +104,7 @@ export class SessionController extends EventEmitter { } backendError(message: string): void { - console.error(`[MeloASR 后端错误] state=${this.state} reason=${message}`); + console.error(`[TamaASR 后端错误] state=${this.state} reason=${message}`); if (this.bridge.activeSession) this.bridge.cancel(); else this.bridge.rejectStart(message); this.state = 'idle'; this.mirroredText = ''; @@ -127,7 +127,7 @@ export class SessionController extends EventEmitter { } private notify(message: string): void { - if (Notification.isSupported()) new Notification({ title: 'MeloASR', body: message }).show(); + if (Notification.isSupported()) new Notification({ title: 'TamaASR', body: message }).show(); } private emitState(): void { diff --git a/src/main/settings-window.ts b/src/main/settings-window.ts index 9c821d0..e3a7ac6 100644 --- a/src/main/settings-window.ts +++ b/src/main/settings-window.ts @@ -37,7 +37,7 @@ export class SettingsWindow { minWidth: 560, minHeight: 560, show: false, - title: 'MeloASR 设置', + title: 'TamaASR 设置', autoHideMenuBar: true, icon: path.join(app.getAppPath(), 'dist', 'assets', 'logo.png'), webPreferences: { diff --git a/src/main/tray-controller.ts b/src/main/tray-controller.ts index d50fe6a..55298a1 100644 --- a/src/main/tray-controller.ts +++ b/src/main/tray-controller.ts @@ -30,7 +30,7 @@ export class TrayController { create(): void { this.tray = new Tray(trayImage('loading')); - this.tray.setToolTip('MeloASR · 正在加载'); + this.tray.setToolTip('TamaASR · 正在加载'); this.tray.on('click', () => void this.settingsWindow.show()); this.refresh(); } @@ -42,7 +42,7 @@ export class TrayController { : status.login === 'logged-out' ? 'login-required' : status.detail.startsWith('加载失败') ? 'error' : 'loading'; this.tray.setImage(trayImage(state)); - this.tray.setToolTip(`MeloASR · ${status.detail}`); + this.tray.setToolTip(`TamaASR · ${status.detail}`); this.tray.setContextMenu(Menu.buildFromTemplate([ { label: '设置', click: () => void this.settingsWindow.show() }, { label: '打开登录/调试页面', click: () => void this.settingsWindow.openDebug() }, diff --git a/src/preload/backend.ts b/src/preload/backend.ts index d002ea2..b2524e1 100644 --- a/src/preload/backend.ts +++ b/src/preload/backend.ts @@ -5,8 +5,8 @@ import { shouldClickMicrophoneOnCancel } from './speech-session-state'; import { shouldFinishAfterStop } from './stop-completion'; const backendId = process.argv - .find((argument) => argument.startsWith('--meloasr-backend=')) - ?.slice('--meloasr-backend='.length) ?? ''; + .find((argument) => argument.startsWith('--tama-asr-backend=')) + ?.slice('--tama-asr-backend='.length) ?? ''; const adapter = getBackendWebAdapter(backendId); let editorObserver: MutationObserver | undefined; diff --git a/src/renderer/settings.html b/src/renderer/settings.html index 62b0a2b..9091117 100644 --- a/src/renderer/settings.html +++ b/src/renderer/settings.html @@ -3,11 +3,11 @@ - MeloASR 设置 + TamaASR 设置 -

MeloASR

设置
+

TamaASR

设置

语音后端

diff --git a/test/fcitx-bridge.test.ts b/test/fcitx-bridge.test.ts index 97acee4..fb9b15e 100644 --- a/test/fcitx-bridge.test.ts +++ b/test/fcitx-bridge.test.ts @@ -3,7 +3,7 @@ import test from 'node:test'; import { JsonLineDecoder, defaultSocketPath } from '../src/main/fcitx-bridge'; test('Socket 路径只使用当前用户运行时目录', () => { - assert.equal(defaultSocketPath({ XDG_RUNTIME_DIR: '/run/user/1000' }), '/run/user/1000/meloasr/fcitx5.sock'); + assert.equal(defaultSocketPath({ XDG_RUNTIME_DIR: '/run/user/1000' }), '/run/user/1000/tama-asr/fcitx5.sock'); assert.throws(() => defaultSocketPath({}), /XDG_RUNTIME_DIR/); });