项目文件夹

文件
2026-07-13 12:28:27 +08:00

142 行
3.8 KiB
Python

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# coding: utf-8
"""
CapsWriter Offline 客户端主程序门面类 (Facade)
采用外观模式统一管理音频流 (AudioStreamManager)、
识别结果处理 (ResultProcessor) 和快捷键管理 (ShortcutManager)。
"""
import os
import sys
import asyncio
from pathlib import Path
from .state import ClientState
from . import logger
from config_client import ClientConfig as Config, __version__
from core.tools.signal_handler import register_signal
from .state import console
from .connection import WebSocketManager
from typing import TYPE_CHECKING, Optional
from .manager import (
TrayManager,
MicRunner, FileRunner
)
from .audio.stream import AudioStreamManager
from .shortcut.shortcut_manager import ShortcutManager
from .shortcut.shortcut_config import Shortcut
from .udp.udp_control import UDPController
from .hotword.manager import HotwordManager
from .llm.llm_handler import LLMHandler
from .output.text_output import TextOutput
from .diary.diary_writer import DiaryWriter
from core.tools.empty_working_set import empty_current_working_set
from platform import system
class CapsWriterClient:
"""
CapsWriter 客户端门面类
管理的外部接口简洁:start()。
"""
def __init__(self):
# 确保正确的工作目录
self.base_dir = Path(__file__).parents[2]
os.chdir(self.base_dir)
# 初始化事件循环
self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.loop)
# 初始化状态容器
self.state = ClientState(app=self)
# 初始化热词管理器
self.hotword = HotwordManager(
hotword_files=None,
threshold=Config.hot_thresh,
similar_threshold=Config.hot_similar
)
# 4. 初始化 LLM 润色系统
self.llm = LLMHandler(app=self)
self.output = TextOutput()
self.diary = DiaryWriter(base_path=self.base_dir)
# 初始化各管理器
self.ws = WebSocketManager(self)
self.tray = TrayManager(self)
# 实例化硬件资源管理组件
self.stream = AudioStreamManager(self)
self.shortcut = ShortcutManager(self, [Shortcut(**sc) for sc in Config.shortcuts])
self.udp = UDPController(self.shortcut)
# 内存清理
empty_current_working_set()
def stop(self):
"""
统一释放所有资源(清理顺序:硬件 -> 托盘 -> WebSocket -> State
"""
logger.info("正在执行 CapsWriterClient 资源释放...")
# 1. 停止核心运行组件
self.udp.stop()
self.shortcut.stop()
self.stream.stop()
# 2. 托盘资源
self.tray.stop()
# 3. 关闭监控
self.hotword.stop()
self.llm.stop()
# 4. 关闭 WebSocket 连接
self.ws.close_sync()
# 5. 重置 State
try:
self.state.reset()
except Exception as e:
logger.warning(f"重置状态时发生错误: {e}")
# 6. 停止事件循环(最后一步,确保前面的异步操作已调度)
self.loop.stop()
logger.info("资源释放完成")
console.print('[green4]再见!')
def start(self):
"""
启动客户端 (唯一入口)
自动根据命令行参数识别模式。内部管理异步循环。
"""
# 注册退出函数
register_signal(self.stop)
files = [Path(f) for f in sys.argv[1:] if os.path.exists(f)]
if files:
# 文件转录模式
runner = FileRunner(self, files)
else:
# 麦克风实时模式
runner = MicRunner(self)
try:
self.loop.run_until_complete(runner.run())
except RuntimeError:
...