#!/usr/bin/env python3 # 音频预缓存实用程序, 独立于主程序之外, 但依赖其他组件 import particles as pt import auxiliary as aux import edge_tts as tts from pathlib import Path import shutil import time def precache(text: str): """预缓存单个文本的音频""" cache_dir = Path("./cache/voice/") cache_dir.mkdir(parents=True, exist_ok=True) cache = cache_dir / f"{aux.get_md5(text)}.wav" if not cache.exists(): communicate = tts.Communicate(text, "zh-CN-XiaoxiaoNeural") communicate.save_sync(f"./cache/voice/{aux.get_md5(text)}.wav") def proc_file(path: Path): """处理单个文件""" nu = pt.NucleonUnion(path) c = 0 for i in nu.nucleons: c += 1 print(f"预缓存 [{nu.name}] ({c}/{len(nu)}): {i['content'].replace('/', '')}") precache(i['content'].replace('/', '')) def walk(path_str: str): """遍历目录处理所有文件""" path = Path(path_str) print(f"正在遍历目录: {path}") try: for item in path.iterdir(): if item.is_file() and item.suffix == ".toml": print(f"正预缓存文件: {item.name}") proc_file(item) elif item.is_dir(): print(f"进入目录: {item.name}") except: print("发生一个异常, 于 5 秒后自动重新下载") time.sleep(5) walk(path_str) if __name__ == "__main__": print("音频预缓存实用程序") print("A: 全部缓存") print("C: 清空缓存") choice = input("输入选项 $ ").upper() if choice == "A": walk("./nucleon") elif choice == "C": shutil.rmtree("./cache/voice", ignore_errors=True) print("缓存已清空")