impress_asr_input_rust/build-windows-package.sh

237 lines
6.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Windows 交叉编译并打包脚本
# 编译 impress_asr_input_rust 项目,复制 manifest 文件,并打包成 ZIP
set -e
PROJECT_DIR="/home/ubuntu/workspace/cherry-studio/enginneer/impress_asr_input_rust"
cd "$PROJECT_DIR"
# 生成时间戳(精确到秒)
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
DIST_DIR="$PROJECT_DIR/dist/windows-x64"
OUTPUT_ZIP="$PROJECT_DIR/dist/impress-asr-windows-x64-${TIMESTAMP}.zip"
echo "=============================================="
echo " Impress ASR - Windows 构建打包脚本"
echo " 时间:$(date '+%Y-%m-%d %H:%M:%S')"
echo "=============================================="
# 清理旧的 dist 目录
echo ""
echo "[1/6] 清理旧的 dist 目录..."
rm -rf "$DIST_DIR"
mkdir -p "$DIST_DIR"
# 构建前端
echo ""
echo "[2/6] 构建前端..."
cd "$PROJECT_DIR/web"
npm run build
cd "$PROJECT_DIR"
# 验证前端构建
echo ""
echo "前端构建结果:"
ls -lh "$PROJECT_DIR/web/dist/"
# 编译 Windows GUI 程序
echo ""
echo "[3/6] 编译 Windows GUI 程序..."
cargo xwin build --release --features gui --target x86_64-pc-windows-msvc
# 复制必要文件
echo ""
echo "[4/6] 复制必要文件到 dist 目录..."
cp "$PROJECT_DIR/target/x86_64-pc-windows-msvc/release/impress_asr_gui.exe" "$DIST_DIR/"
cp "$PROJECT_DIR/impress_asr_gui.exe.manifest" "$DIST_DIR/"
cp "$PROJECT_DIR/target/x86_64-pc-windows-msvc/release/impress_asr.exe" "$DIST_DIR/"
cp "$PROJECT_DIR/impress_asr.exe.manifest" "$DIST_DIR/"
cp "$PROJECT_DIR/icons/tray-icon.png" "$DIST_DIR/"
# 复制 Tauri 权限配置Tauri v2 必需)
cp -r "$PROJECT_DIR/capabilities" "$DIST_DIR/"
# 复制前端文件cargo xwin 不会自动嵌入前端资源)
echo "复制前端资源..."
cp -r "$PROJECT_DIR/web/dist" "$DIST_DIR/"
# 创建 README.md
cat > "$DIST_DIR/README.md" << 'README_EOF'
# Impress ASR Input Rust - Windows 运行说明
## 🚀 快速启动
1. **解压文件** - 将所有文件解压到同一目录
2. **运行程序** - 双击 `impress_asr_gui.exe`
## 🔧 开发者工具
### 打开开发者控制台
Tauri v2 应用支持开发者工具,有以下几种方式打开:
1. **快捷键**:按 `Ctrl + Shift + i` 或 `F12`
2. **托盘菜单**:右键点击托盘图标 → 选择"开发"相关选项(如有)
3. **启动参数**:使用命令行启动 `set RUST_LOG=debug && impress_asr_gui.exe`
### 查看控制台日志
点击"选择文件"按钮时,控制台会输出:
- `开始调用 select_model_file 命令...`
- `模型文件选择结果:...`
- 错误时的详细错误信息
## 📋 诊断输出
程序启动时会在控制台输出详细的诊断信息:
```
========================================
Impress ASR - 启动诊断
========================================
[步骤 1/5] 系统信息
- 操作系统windows
- 架构x86_64
- 工作目录C:\Programs\impress-asr
- 构建模式Release
[步骤 2/5] 初始化日志系统...
✓ 日志初始化完成
[步骤 3/5] 诊断信息
✓ 诊断信息已记录
[步骤 4/5] 启动 Tauri 应用...
- 创建主窗口...
- 初始化系统托盘...
- 加载前端资源...
✓ Tauri 应用已启动
[窗口] 主窗口信息:
- 可见性:可见 ✓
- 最小化:否 ✓
- 焦点:可设置 ✓
[运行] 进入事件循环...
```
**如果窗口不显示**,请查看诊断输出中的 `[窗口]` 部分,确认窗口状态。
## 📦 文件清单
| 文件 | 说明 |
|------|------|
| `impress_asr_gui.exe` | GUI 主程序 |
| `impress_asr_gui.exe.manifest` | **必需**Windows 控件版本声明 |
| `impress_asr.exe` | CLI 命令行工具 |
| `impress_asr.exe.manifest` | **必需**Windows 控件版本声明 |
| `tray-icon.png` | 系统托盘图标 |
## 🚀 运行方式
### GUI 版本(推荐)
直接双击 `impress_asr_gui.exe` 即可启动。
### CLI 版本
```cmd
:: 查看帮助
impress_asr.exe --help
:: 录音
impress_asr.exe record
:: 识别音频文件
impress_asr.exe recognize -i audio.wav
```
## 📋 系统要求
- **操作系统**Windows 7 / 10 / 11 (x64)
- **WebView2 Runtime**Windows 11 已预装Windows 10 可能需要单独安装
- 下载地址https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/
## ❓ 常见问题
### 错误:无法定位程序输入点 TaskDialogIndirect 于动态链接库
**原因**:缺少 `.manifest` 文件
**解决**:确保 `.manifest` 文件与对应的 `.exe` 文件在同一目录,且文件名匹配。
### 错误:找不到 MSVCP140.dll 或 VCRUNTIME140.dll
**原因**:缺少 Visual C++ 运行时
**解决**:下载安装 https://aka.ms/vs/17/release/vc_redist.x64.exe
### 错误:模型文件不存在
**解决**:下载 ONNX 模型并放到 `models/` 目录。
- SenseVoice Small: https://huggingface.co/FunAudioLLM/SenseVoiceSmall/resolve/main/model.onnx
### 窗口不显示但托盘图标可见
1. 查看控制台诊断输出中的 `[窗口]` 部分
2. 如果显示 `可见性:隐藏 ⚠`,点击托盘图标 → "显示窗口"
3. 如果程序已崩溃,查看最后的错误信息
## 📝 获取帮助
如果遇到问题,请将以下信息提供给开发者:
1. **完整的控制台输出**(从 "========" 到程序退出)
2. **操作系统版本**Windows 7/10/11
3. **问题描述**(例如:窗口不显示、程序闪退等)
### 日志文件位置
```
%LOCALAPPDATA%\impress-asr\logs\
```
---
**版本**: 0.1.0 | **构建时间**: 见文件名后缀
README_EOF
echo "文件列表:"
ls -lh "$DIST_DIR/"
# 打包成 ZIP
echo ""
echo "[5/6] 打包成 ZIP 文件..."
cd "$DIST_DIR"
zip -r "$OUTPUT_ZIP" *.exe *.manifest *.png *.md capabilities/ dist/ 2>/dev/null || {
# 如果没有 zip 命令,使用 Python
cd "$PROJECT_DIR"
python3 -c "
import zipfile
import os
dist_dir = '$DIST_DIR'
output_zip = '$OUTPUT_ZIP'
with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zf:
for f in os.listdir(dist_dir):
filepath = os.path.join(dist_dir, f)
if os.path.isfile(filepath):
zf.write(filepath, f)
elif os.path.isdir(filepath):
for root, dirs, files in os.walk(filepath):
for file in files:
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, dist_dir)
zf.write(file_path, arcname)
print(f'打包完成:{output_zip}')
"
}
# 显示结果
echo ""
echo "[6/6] 构建打包完成!"
echo "=============================================="
echo "输出文件:$OUTPUT_ZIP"
echo "文件大小:$(ls -lh "$OUTPUT_ZIP" | awk '{print $5}')"
echo "=============================================="
echo ""
echo "Windows 运行所需文件清单:"
echo " - impress_asr_gui.exe (GUI 主程序)"
echo " - impress_asr_gui.exe.manifest (必需)"
echo " - impress_asr.exe (CLI 工具)"
echo " - impress_asr.exe.manifest (必需)"
echo " - tray-icon.png (托盘图标)"
echo "=============================================="