Skip to content

Commit 24a273d

Browse files
authored
Merge pull request #52 from JStone2934/feat/desktop-branch
Feat/desktop branch
2 parents 9a67bb9 + cedaea8 commit 24a273d

139 files changed

Lines changed: 23690 additions & 7478 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
name: Desktop Build
2+
3+
on:
4+
push:
5+
branches: [ main, master, feat/desktop-branch ]
6+
tags:
7+
- 'v*.*.*-*' # prerelease: v0.1.0-beta.1
8+
- 'v[0-9]*.[0-9]*.[0-9]*' # release: v0.1.0 (纯版本号)
9+
paths:
10+
- 'desktop/**'
11+
- '.github/workflows/desktop-build.yml'
12+
pull_request:
13+
branches: [ main, master, feat/desktop-branch ]
14+
paths:
15+
- 'desktop/**'
16+
- '.github/workflows/desktop-build.yml'
17+
workflow_dispatch:
18+
19+
concurrency:
20+
group: desktop-${{ github.ref }}
21+
cancel-in-progress: true
22+
23+
jobs:
24+
build:
25+
name: Desktop ${{ matrix.platform }} (${{ matrix.arch }})
26+
runs-on: ${{ matrix.os }}
27+
strategy:
28+
fail-fast: false
29+
matrix:
30+
include:
31+
- os: macos-14
32+
platform: mac
33+
arch: arm64
34+
python: python3.10
35+
asr: funasr-onnx
36+
artifact_path: |
37+
desktop/release/*.dmg
38+
- os: windows-latest
39+
platform: win
40+
arch: x64
41+
python: python
42+
asr: funasr-onnx
43+
artifact_path: |
44+
desktop/release/*.exe
45+
46+
defaults:
47+
run:
48+
shell: bash
49+
working-directory: desktop
50+
51+
steps:
52+
- name: Checkout repository
53+
uses: actions/checkout@v4
54+
with:
55+
fetch-depth: 0
56+
57+
- name: Setup pnpm
58+
uses: pnpm/action-setup@v4
59+
with:
60+
version: 9
61+
run_install: false
62+
63+
- name: Setup Node.js
64+
uses: actions/setup-node@v4
65+
with:
66+
node-version: 20
67+
cache: pnpm
68+
cache-dependency-path: desktop/pnpm-lock.yaml
69+
70+
- name: Setup Python
71+
uses: actions/setup-python@v5
72+
with:
73+
python-version: '3.10'
74+
75+
- name: Install dependencies
76+
run: pnpm install --frozen-lockfile
77+
78+
- name: Prepare Python env for ASR backend
79+
working-directory: desktop
80+
run: pnpm run prepare:python
81+
82+
- name: Print app version
83+
id: meta
84+
run: |
85+
node -e "const v=require('./package.json').version; console.log('app_version='+v)" >> "$GITHUB_OUTPUT"
86+
87+
88+
- name: Build desktop package
89+
env:
90+
PYTHON: ${{ matrix.python }}
91+
ASR_IMPL: ${{ matrix.asr }}
92+
ASR_PYTHON_PATH: ${{ matrix.platform == 'win' && format('{0}/desktop/python-env/Scripts/python.exe', github.workspace) || format('{0}/desktop/python-env/bin/python3', github.workspace) }}
93+
run: |
94+
if [ "${{ matrix.platform }}" = "mac" ]; then
95+
pnpm run build:mac -- --${{ matrix.arch }}
96+
else
97+
pnpm run build:win -- --${{ matrix.arch }}
98+
fi
99+
100+
- name: Upload artifacts
101+
uses: actions/upload-artifact@v4
102+
with:
103+
name: livegalgame-desktop-${{ matrix.platform }}-${{ matrix.arch }}-v${{ steps.meta.outputs.app_version }}
104+
path: ${{ matrix.artifact_path }}
105+
if-no-files-found: error
106+
retention-days: 14
107+
108+
prerelease:
109+
name: Publish prerelease
110+
runs-on: ubuntu-latest
111+
needs: build
112+
if: |
113+
startsWith(github.ref, 'refs/tags/v') &&
114+
contains(github.ref_name, '-')
115+
permissions:
116+
contents: write
117+
steps:
118+
- name: Checkout repository
119+
uses: actions/checkout@v4
120+
121+
- name: Download artifacts
122+
uses: actions/download-artifact@v4
123+
with:
124+
path: dist
125+
126+
- name: Create prerelease
127+
env:
128+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
129+
run: |
130+
gh release create "${GITHUB_REF_NAME}" \
131+
--prerelease \
132+
--title "${GITHUB_REF_NAME}" \
133+
--notes "Prerelease ${GITHUB_REF_NAME}"
134+
# 处理带空格的文件名
135+
find dist -type f -print0 | xargs -0 -I {} gh release upload "${GITHUB_REF_NAME}" "{}" --clobber
136+
137+
release:
138+
name: Publish release
139+
runs-on: ubuntu-latest
140+
needs: build
141+
if: |
142+
startsWith(github.ref, 'refs/tags/v') &&
143+
!contains(github.ref_name, '-')
144+
permissions:
145+
contents: write
146+
steps:
147+
- name: Checkout repository
148+
uses: actions/checkout@v4
149+
with:
150+
fetch-depth: 0
151+
152+
- name: Download artifacts
153+
uses: actions/download-artifact@v4
154+
with:
155+
path: dist
156+
157+
- name: Create release
158+
env:
159+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
160+
run: |
161+
gh release create "${GITHUB_REF_NAME}" \
162+
--title "${GITHUB_REF_NAME}" \
163+
--notes "Release ${GITHUB_REF_NAME}"
164+
# 处理带空格的文件名
165+
find dist -type f -print0 | xargs -0 -I {} gh release upload "${GITHUB_REF_NAME}" "{}" --clobber

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on:
44
push:
55
branches: [ main, master ]
66
tags:
7-
- 'v*'
7+
- 'android-v*'
88
pull_request:
99
branches: [ main, master ]
1010
workflow_dispatch:

.gitignore

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,36 @@ signing.properties
2727
/desktop/data
2828
/desktop/.temp
2929
/desktop/tests
30-
.cursor
30+
desktop/src/data
31+
desktop/.venv310
32+
/desktop/release
33+
/desktop/backend/build/
34+
/desktop/backend/dist/
35+
.venv
36+
/desktop/memory-service/.venv
37+
/desktop/memory-service/__pycache__
38+
__pycache__/
39+
# 忽略所有项目里的 python 环境目录(venv/虚拟环境/bootstrap python等)
40+
**/python-env
41+
**/python-bootstrap
42+
**/.venv*/
43+
**/venv/
44+
**/.venv
45+
# Python 缓存文件
46+
**/__pycache__/
47+
*.py[cod]
48+
*.pyo
49+
.cursor
50+
51+
# Test media files
52+
test.mp4
53+
*.mp4
54+
*.wav
55+
56+
# Desktop docs (local only)
57+
desktop/docs/
58+
**/node_modules
59+
60+
# Environment variables
61+
.env
62+
.env.*

README.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
<img width="100%" alt="preview" src="https://github.com/user-attachments/assets/d6c44e31-8362-4825-9d7c-a760a4720133" />
2525

26+
<img width="100%" alt="recent preview" src="./docs/20251225-004407.gif" />
27+
2628
---
2729

2830
## 核心功能
@@ -63,10 +65,6 @@
6365

6466
### 下载
6567

66-
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
67-
alt="Get it on F-Droid"
68-
height="75">](https://f-droid.org/packages/com.jstone.livegalgame/)
69-
7068
- **GitHub Release**: [点击下载](https://github.com/JStone2934/LiveGalGame/tags)
7169
- **夸克网盘**: https://pan.quark.cn/s/1000136902b5
7270
- **百度网盘**: https://pan.baidu.com/s/1Bpt2DZNvjzT6BpKr8RyG-A?pwd=94g6
@@ -77,6 +75,13 @@
7775

7876
**Windows / macOS 应用** - 专为语音聊天场景设计的智能助手
7977

78+
### macOS 安装提示(未签名)
79+
80+
- 当前开源版本未做 Apple 官方签名/公证,直接双击 DMG 可能提示“应用已损坏/来自未被认可的开发者”。
81+
- 推荐做法:在 Finder 中控制键+点按 DMG 内的 `LiveGalGame.app`,选择“打开”,在弹窗中再次“打开”,系统将对本次豁免。(参考 [macguide.leavelet.io](https://macguide.leavelet.io/Bike/appnotopen.html)
82+
- 如仍被拦截,可在终端移除隔离属性:`sudo xattr -r -d com.apple.quarantine "/Applications/LiveGalGame.app"`(请替换为实际路径)。
83+
- 临时放宽 Gatekeeper(风险较高,装完建议恢复):`sudo spctl --master-disable`,安装后 `sudo spctl --master-enable`
84+
8085
### 使用流程
8186

8287
1. **创建对话对象**

desktop/README.md

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,10 @@ pnpm install
7878
### 配置语音识别
7979

8080
```bash
81-
# 安装 FunASR(推荐,中文识别效果最好)
81+
# 安装 FunASR(推荐,中文识别效果最好,macOS 默认
8282
npm run setup-funasr
8383
```
84+
- Windows 也使用 FunASR ONNX,无需额外安装 faster-whisper。
8485

8586
### 启动
8687

@@ -115,6 +116,70 @@ pnpm dev
115116

116117
---
117118

119+
## 📦 桌面端发布规则(GitHub Actions)
120+
121+
桌面端发布使用 tag 触发,并区分 **预发布****正式发布**
122+
123+
- **预发布(Prerelease)**`vX.Y.Z-xxx`
124+
例:`v0.1.0-beta.1`
125+
- **正式发布(Release)**`vX.Y.Z`
126+
例:`v0.1.0`
127+
128+
Android 的发布已独立为 `android-v*` 标签,避免干扰桌面端发布。
129+
130+
示例:
131+
132+
```bash
133+
# 预发布(会生成 GitHub Prerelease)
134+
git tag v0.1.0-beta.1
135+
git push origin v0.1.0-beta.1
136+
137+
# 正式发布(会生成 GitHub Release)
138+
git tag v0.1.0
139+
git push origin v0.1.0
140+
141+
# Android 发布(仅 Android 流程触发)
142+
git tag android-v0.1.0
143+
git push origin android-v0.1.0
144+
```
145+
146+
> 说明:桌面端产物为 macOS `.dmg` 与 Windows `.exe`,不会生成 APK。
147+
148+
---
149+
150+
## 🧰 模型下载与缓存目录(HF / ModelScope)
151+
152+
应用内的语音识别模型(尤其是 FunASR ONNX)会在首次使用/点击下载时自动拉取,并缓存到本机磁盘。为了方便管理、并兼容 Windows / macOS 的默认目录差异,项目默认把缓存放到 Electron 的 `userData` 目录下(不同系统会自动选择合适位置)。
153+
154+
如果你希望把模型统一下载到自己指定的盘符/目录(例如放到大硬盘、NAS 挂载目录等),推荐通过环境变量覆盖:
155+
156+
- `ASR_CACHE_BASE`:ASR 缓存根目录(推荐只改这个)
157+
- `HF_HOME`:HuggingFace 缓存根目录(高级用法)
158+
- `ASR_CACHE_DIR`:HuggingFace hub 目录(高级用法)
159+
- `MODELSCOPE_CACHE`:ModelScope 缓存根目录(注意:实际会写到 `<MODELSCOPE_CACHE>/hub`
160+
161+
示例(macOS/Linux):
162+
163+
```bash
164+
ASR_CACHE_BASE=/data/livegalgame/asr-cache pnpm dev
165+
```
166+
167+
示例(Windows PowerShell):
168+
169+
```powershell
170+
$env:ASR_CACHE_BASE="D:\\LiveGalGame\\asr-cache"; pnpm dev
171+
```
172+
173+
如果你想手动使用 ModelScope CLI 把某个模型下载到指定位置(不走应用内下载),确实可以用:
174+
175+
```bash
176+
modelscope download --model 'Qwen/Qwen2-7B' --local_dir /data/models/Qwen2-7B
177+
```
178+
179+
但应用内的 FunASR 模型下载是由 `funasr_onnx` 触发的(不是直接下载单个 Qwen 模型),因此更推荐用上面的环境变量来统一管理缓存位置。
180+
181+
---
182+
118183
## 🔧 开发者指南
119184

120185
如果你想参与开发或了解技术细节,请查看项目源码:
@@ -125,4 +190,3 @@ pnpm dev
125190
- `src/db/` - 本地数据存储
126191

127192
欢迎提交 PR!有问题请加 QQ 群:**1074602400**
128-

0 commit comments

Comments
 (0)