You've already forked HeurAMS-Legacy
141 lines
5.0 KiB
Python
141 lines
5.0 KiB
Python
|
|
class MemScreen(Screen):
|
|
BINDINGS = [
|
|
("d", "toggle_dark", "改变色调"),
|
|
("q", "pop_screen", "返回主菜单"),
|
|
("v", "play_voice", "朗读"),
|
|
# ("p", "precache_current", "预缓存当前单元集"), # 新增预缓存快捷键
|
|
]
|
|
if config.get("quick_pass"):
|
|
BINDINGS.append(("k", "quick_pass", "快速通过[调试]"))
|
|
btn = dict()
|
|
|
|
def __init__(
|
|
self,
|
|
nucleon_file: pt.NucleonUnion,
|
|
electron_file: pt.ElectronUnion,
|
|
tasked_num,
|
|
):
|
|
super().__init__(name=None, id=None, classes=None)
|
|
self.nucleon_file = nucleon_file
|
|
self.electron_file = electron_file
|
|
self.reactor = Reactor(nucleon_file, electron_file, self, tasked_num)
|
|
self.stage = 1
|
|
self.stage += self.reactor.set_round_templated(self.stage)
|
|
first_forward = self.reactor.forward()
|
|
print(first_forward)
|
|
if first_forward == -1:
|
|
self.stage = 3
|
|
self.reactor.set_round_templated(3)
|
|
print(self.reactor.forward())
|
|
#self._forward_judge(first_forward)
|
|
self.compo = next(self.reactor.current_appar)
|
|
self.feedback_state = 0 # 默认状态
|
|
self.feedback_state_map = {
|
|
0: "",
|
|
255: "回答有误, 请重试. 或者重新学习此单元",
|
|
}
|
|
|
|
def compose(self) -> ComposeResult:
|
|
if type(self.compo).__name__ == "Recognition":
|
|
self.action_play_voice()
|
|
yield Header(show_clock=True)
|
|
with Center():
|
|
yield Static(
|
|
f"当前进度: {len(self.reactor.procession) - self.reactor.index}/{len(self.reactor.procession)}"
|
|
)
|
|
yield Label(self.feedback_state_map[self.feedback_state])
|
|
yield from self.compo.compose()
|
|
if self.feedback_state == 255:
|
|
yield Button("重新学习此单元", id="re-recognize", variant="warning")
|
|
yield Footer()
|
|
|
|
def on_mount(self):
|
|
pass
|
|
|
|
def on_button_pressed(self, event):
|
|
try:
|
|
if event.button.id == "re-recognize":
|
|
return
|
|
except:
|
|
pass
|
|
ret = self.compo.handler(event, "button")
|
|
self._forward_judge(ret)
|
|
def _forward_judge(self, ret):
|
|
self.feedback_state = 0
|
|
if ret == -1:
|
|
return
|
|
if ret == 0:
|
|
try:
|
|
self.compo = next(self.reactor.current_appar)
|
|
self.refresh_ui()
|
|
except StopIteration:
|
|
nxt = self.reactor.forward(1)
|
|
try:
|
|
self.compo = next(self.reactor.current_appar)
|
|
except:
|
|
pass
|
|
if nxt == -1:
|
|
if self.reactor.round_set == 0:
|
|
if self.stage == 4:
|
|
if config.get("save"):
|
|
self.reactor.save()
|
|
self.compo = compo.Finished(
|
|
self, None, pt.Atom.placeholder()
|
|
)
|
|
self.refresh_ui()
|
|
else:
|
|
self.reactor.set_round_templated(self.stage)
|
|
self.reactor.forward(1)
|
|
self.stage += 1
|
|
self.compo = next(self.reactor.current_appar)
|
|
self.refresh_ui()
|
|
return
|
|
return
|
|
else:
|
|
self.refresh_ui()
|
|
return
|
|
if ret >= 1:
|
|
if ret == 2:
|
|
self.feedback_state = 255 # 表示错误
|
|
else:
|
|
self.feedback_state = 0
|
|
self.refresh_ui()
|
|
return
|
|
|
|
def refresh_ui(self):
|
|
self.call_later(self.recompose)
|
|
print(type(self.compo).__name__)
|
|
|
|
def action_play_voice(self):
|
|
def play():
|
|
cache_dir = pathlib.Path(f"./cache/voice/")
|
|
cache_dir.mkdir(parents=True, exist_ok=True)
|
|
cache = cache_dir / f"{aux.get_md5(self.reactor.current_atom[1].content.replace('/',''))}.wav"
|
|
if not cache.exists():
|
|
import edge_tts as tts
|
|
communicate = tts.Communicate(
|
|
self.reactor.current_atom[1].content.replace("/", ""),
|
|
"zh-CN-XiaoxiaoNeural",
|
|
)
|
|
communicate.save_sync(
|
|
f"./cache/voice/{aux.get_md5(self.reactor.current_atom[1].content.replace('/',''))}.wav"
|
|
)
|
|
playsound(str(cache))
|
|
|
|
threading.Thread(target=play).start()
|
|
|
|
def action_precache_current(self):
|
|
"""预缓存当前单元集的音频"""
|
|
precache_screen = PrecachingScreen(self.nucleon_file)
|
|
self.app.push_screen(precache_screen)
|
|
|
|
def action_quick_pass(self):
|
|
self.reactor.report(self.reactor.current_atom, 5)
|
|
self._forward_judge(0)
|
|
def action_toggle_dark(self):
|
|
self.app.action_toggle_dark()
|
|
|
|
def action_pop_screen(self):
|
|
self.app.pop_screen()
|