ARmahjongAssist 是一个结合 RayNeo AR 眼镜 与 本地化 AI 的麻将辅助系统。通过 AR 眼镜实时采集手牌图像,在本地服务器进行 YOLO 识别与牌效分析,并将最佳切牌建议实时投射在眼镜屏幕上。
本项目分为两个核心部分:
app/server/server/models/yolo)。克隆项目
bash
git clone https://github.com/fAres4s/ARmahjongAssist.git
cd ARmahjongAssist
配置环境变量
进入 server 目录,复制 .env.example ,命名副本为 .env:
bash
cd server
cp .env.example .env
编辑 .env 文件,配置本地 LLM 地址 (例如 LM Studio 默认是 http://host.docker.internal:1234/v1):
env
LLM_BASE_URL=http://host.docker.internal:1234/v1
LLM_API_KEY=lm-studio
LLM_MODEL=qwen/qwen3-4b-2507 (复制于 LM Studio server配置页面右侧的API Usage -> This model's API identifier)
启动服务
返回项目根目录并构建启动:
bash
cd ..
docker-compose up -d --build
服务将运行在 http://localhost:8000。
环境准备
配置服务端地址
192.168.1.100)。app/src/main/java/com/example/ai_assist/MainActivity.kt。setupDependencies 方法,修改 baseUrl:
kotlin
// 替换为你的电脑局域网 IP 地址
.baseUrl("http://192.168.1.100:8000/")编译与安装
客户端的全局配置位于 app/src/main/java/com/example/ai_assist/AppConfig.kt,您可以根据需要修改以下常量:
http://192.168.1.100:8000/)。true 为彩色,false 为默认单色)。1.8f)。2.5f)。为了优化不同光照和环境下的麻将牌识别效果,本项目提供了一个可视化的参数调试工具。
访问工具
确保服务端已启动,在浏览器中访问:
http://localhost:8000/static/yolo_debug.html
功能说明
配置生效
.env 文件以永久生效:
env
YOLO_CONF_THRESHOLD=0.54 # 示例值
YOLO_IOU_THRESHOLD=0.85 # 示例值bash
docker-compose restart backend如果您需要修改服务端代码或进行调试,可以直接在本地运行 Python 环境。
环境准备
bash
cd server
python -m venv venv
source venv/bin/activate # 示例为MacOS,Windows 请执行: venv\Scripts\activate
pip install -r requirements.txt
运行服务
确保 .env 配置正确,然后运行:
bash
python main.py
运行测试
bash
pytest tests
ARmahjongAssist/
├── app/ # Android 客户端 (RayNeo AR 眼镜端)
├── server/ # Python 服务端 (AI 推理与业务逻辑)
├── docker-compose.yml # Docker 一键部署配置
└── README.md # 项目文档
app/
├── libs/ # 外部依赖库 (RayNeo SDK)
├── src/main/java/com/example/ai_assist/
│ ├── model/ # 数据模型 (API 响应实体、会话状态)
│ ├── repository/ # 数据仓库层 (处理 API 调用与数据流)
│ ├── service/ # 核心服务模块
│ │ ├── GameApiService.kt # Retrofit 接口定义 (与 Server 通信)
│ │ └── RayNeoDeviceManager.kt # RayNeo 硬件控制 (按键、传感器)
│ ├── utils/ # 工具类
│ │ ├── RayNeoAudioRecorder.kt # 音频录制工具
│ │ └── MahjongMapper.kt # 麻将编码映射工具
│ ├── viewmodel/ # MVVM ViewModel (UI 状态管理)
│ └── MainActivity.kt # 主界面入口
│ └── src/main/res/ # UI 资源文件 (布局、图标、样式)
server/
├── models/ # 本地模型文件仓库
│ └── yolo/ # YOLOv8 ONNX 模型及类别文件
├── static/ # 静态资源目录
│ └── uploads/ # 存放客户端上传的临时图片
├── tests/ # 单元测试与集成测试用例
├── main.py # FastAPI 应用入口,服务初始化与路由定义
├── config.py # 配置管理 (环境变量加载、路径定义)
├── vision_service.py # 视觉识别服务:封装 YOLO 模型调用与坐标转换
├── yolo_inference.py # YOLO 推理核心:基于 ONNX Runtime 的图像预处理与后处理
├── llm_service.py # LLM 服务:与本地大模型 (OpenAI 接口) 交互,处理自然语言意图
├── stt_service.py # 语音转文字服务:基于 faster-whisper 实现离线语音识别
├── efficiency_engine.py # 牌效引擎:封装 mahjong 库,计算向听数与最佳切牌
├── mahjong_state_tracker.py # 状态追踪器:维护对局状态 (手牌、副露、场况)
├── database.py # 数据库模块:SQLite 封装,记录对局历史与交互日志
├── schemas.py # Pydantic 数据模型:定义 API 请求与响应结构
├── Dockerfile # 服务端镜像构建文件
└── requirements.txt # Python 依赖列表
main.py 接收 -> 保存至 static/uploads。VisionService 调用 yolo_inference.py 解析图片,提取麻将牌坐标与类别。MahjongStateTracker,更新当前手牌状态。EfficiencyEngine 基于当前手牌计算向听数 (Shanten) 和进张 (Ukeire)。STTService 转录文本 -> LLMService 分析用户意图 (如"刚才打了什么") -> 改变 MahjongStateTracker 的可见牌列表。schemas.py 定义的格式返回给客户端。感谢 Jon Chan 提供的 Mahjong Dataset。该数据集发布于 Roboflow Universe (2026-01-26)。特别感谢其提供的开源数据支持了我们的 CV 模型训练。
感谢 FluffyStuff/riichi-mahjong-tiles 提供的麻将 PNG 素材。
感谢 SYSTRAN/faster-whisper 提供的快速语音转文本支持。
感谢 googlefonts/nanoemoji 工具支持彩色麻将字体的制作。
$ claude mcp add AR-Mahjong-Assistant-preview \
-- python -m otcore.mcp_server <graph>