Skip to content

Commit f09c6c7

Browse files
committed
调整代码结构;修复统计信息问题;新增历史记录的保存与加载。
1 parent 1b94c48 commit f09c6c7

23 files changed

Lines changed: 1952 additions & 1385 deletions

app/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""应用层模块"""

app/app_context.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"""应用上下文:集中管理全局共享依赖"""
2+
3+
from dataclasses import dataclass
4+
5+
from tts_engine import TTSEngine
6+
7+
8+
@dataclass
9+
class AppContext:
10+
"""应用运行期共享对象"""
11+
12+
version: str
13+
tts_engine: TTSEngine

app/window.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""主窗口装配模块"""
2+
3+
from PySide6.QtCore import QSize
4+
from PySide6.QtGui import QIcon
5+
from qfluentwidgets import FluentIcon, FluentWindow, NavigationItemPosition, SplashScreen, setThemeColor
6+
7+
from app.app_context import AppContext
8+
from ui.pages.reviewer_page import PPTReviewer
9+
from ui.pages.settings_page import SettingInterface
10+
from ui.pages.tools_page import ToolsInterface
11+
12+
13+
class Window(FluentWindow):
14+
"""主窗体:负责装配页面"""
15+
16+
def __init__(self, context: AppContext):
17+
super().__init__()
18+
self.context = context
19+
setThemeColor('#B7472A')
20+
self.resize(850, 750)
21+
self.setWindowTitle('PowerPointReviewer')
22+
self.setWindowIcon(QIcon(':/image/image/ppt_ico.svg'))
23+
24+
self.splashScreen = SplashScreen(self.windowIcon(), self)
25+
self.splashScreen.setIconSize(QSize(106, 106))
26+
self.show()
27+
28+
self.ppt_r = PPTReviewer(self.context, self)
29+
self.setting_interface = SettingInterface(self.context, self)
30+
self.tools_interface = ToolsInterface(self.ppt_r, self)
31+
32+
self.addSubInterface(self.ppt_r, FluentIcon.HOME, '主页')
33+
self.addSubInterface(self.tools_interface, FluentIcon.APPLICATION, '实用工具')
34+
self.addSubInterface(self.setting_interface, FluentIcon.SETTING, '设置', NavigationItemPosition.BOTTOM)
35+
self.splashScreen.finish()

engines/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""engines 包:各 TTS 引擎的独立实现模块"""
1+
"""engines 包:各 TTS 引擎的独立实现模块"""
22

33
from . import defs, pyttsx3, edge_tts, bailian
44

engines/bailian.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
"""阿里百炼 TTS 引擎:内置音色列表、_FileCallback 回调类、基于 tts_v2 的音频合成"""
1+
"""阿里百炼 TTS 引擎:内置音色列表、_FileCallback 回调类、基于 tts_v2 的音频合成"""
22

33
import os
4+
from pathlib import Path
45
import threading
56
import traceback
67
from typing import Optional
@@ -230,15 +231,15 @@ class _FileCallback(ResultCallback): # type: ignore[misc]
230231
"""将百炼 WebSocket 流式音频分片写入目标文件,并在完成时发出事件信号。"""
231232

232233
def __init__(self, output_path: str) -> None:
233-
self.output_path = output_path
234+
self.output_path = Path(output_path)
234235
self.file = None
235236
self.error_message: Optional[str] = None
236237
self.total_bytes: int = 0
237238
self.events: list[str] = []
238239
self.done_event = threading.Event()
239240

240241
def on_open(self) -> None:
241-
self.file = open(self.output_path, 'wb')
242+
self.file = self.output_path.open('wb')
242243
print(f'[百炼TTS] 连接建立,输出文件:{self.output_path}')
243244

244245
def on_complete(self) -> None:
@@ -327,7 +328,8 @@ def _call() -> None:
327328
raise RuntimeError('百炼 TTS 在 30 秒内未完成,可能是网络超时或服务阻塞')
328329
if callback.error_message:
329330
raise RuntimeError(f'百炼 TTS 回调报错:{callback.error_message}')
330-
if not os.path.exists(path) or os.path.getsize(path) == 0:
331+
output_path = Path(path)
332+
if not output_path.exists() or output_path.stat().st_size == 0:
331333
event_tail = callback.events[-3:] if callback.events else []
332334
raise RuntimeError(
333335
f'百炼 TTS 输出文件为空;累计字节={callback.total_bytes};最近事件={event_tail}'

engines/defs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""引擎注册表:包含所有引擎的 schema 定义和内置音色列表"""
1+
"""引擎注册表:包含所有引擎的 schema 定义和内置音色列表"""
22

33
# 所有引擎的统一定义,供 TTSEngine 管理器和设置 UI 使用
44
ENGINE_DEFS = [

engines/edge_tts.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""edge-tts 在线 TTS 引擎:内置音色列表、参数格式转换工具、音频合成"""
1+
"""edge-tts 在线 TTS 引擎:内置音色列表、参数格式转换工具、音频合成"""
22

33
import asyncio
44

@@ -22,22 +22,22 @@
2222
# ──────────────────────────────────────────────────────────
2323

2424
def _percent_text(value: int) -> str:
25-
"""把整数转为 edge-tts 百分比文本,如 +10%、-5%"""
25+
"""把整数转为 edge-tts 百分比文本,如 +10%、-5%"""
2626
return f'+{value}%' if value >= 0 else f'{value}%'
2727

2828

2929
def rate_to_edge(rate: int) -> str:
30-
"""把 UI 速率(基准 200 = 0%)映射为 edge-tts 速率文本"""
30+
"""把 UI 速率(基准 200 = 0%)映射为 edge-tts 速率文本"""
3131
return _percent_text(int((rate - 200) / 2))
3232

3333

3434
def volume_to_edge(volume: float) -> str:
35-
"""把 0~1 音量映射为 edge-tts 百分比文本(1.0 → +0%)"""
35+
"""把 0~1 音量映射为 edge-tts 百分比文本(1.0 → +0%)"""
3636
return _percent_text(int((volume - 1.0) * 100))
3737

3838

3939
def pitch_to_edge(pitch: int) -> str:
40-
"""把音调偏移量转为 edge-tts Hz 文本,如 +0Hz、-10Hz"""
40+
"""把音调偏移量转为 edge-tts Hz 文本,如 +0Hz、-10Hz"""
4141
return f'+{pitch}Hz' if pitch >= 0 else f'{pitch}Hz'
4242

4343

0 commit comments

Comments
 (0)