#!/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` ## 📋 诊断输出 程序启动时会在控制台输出详细的诊断信息: ``` ======================================== 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 "=============================================="