From 1fc0f0568ff864ca6189752f34e0fe0dc9ea8f2c Mon Sep 17 00:00:00 2001 From: Wolfang Torres Date: Tue, 26 May 2026 21:27:10 +0800 Subject: [PATCH] rename files and add chat tts --- anki-hsk-creator/__main__.py | 79 +++++++++++------- .../{HSK1-1.txt => HSK1-1.dictionary.txt} | 6 +- ...{HSK1-1.prhases.txt => HSK1-1.phrases.txt} | 1 - .../{HSK1-2.txt => HSK1-2.dictionary.txt} | 0 data/input/HSK1/HSK1-2.phrases.txt | 1 - .../{HSK1-3.txt => HSK1-3.dictionary.txt} | 0 .../{HSK1-4.txt => HSK1-4.dictionary.txt} | 0 ...语-第10课.txt => 口语-第10课.dictionary.txt} | 0 data/input/口语/口语-第10课.phrases.txt | 1 - ...口语-第1课.txt => 口语-第1课.dictionary.txt} | 0 ...口语-第2课.txt => 口语-第2课.dictionary.txt} | 0 ...口语-第3课.txt => 口语-第3课.dictionary.txt} | 0 ...口语-第4课.txt => 口语-第4课.dictionary.txt} | 0 ...口语-第5课.txt => 口语-第5课.dictionary.txt} | 0 ...口语-第6课.txt => 口语-第6课.dictionary.txt} | 0 ...口语-第7课.txt => 口语-第7课.dictionary.txt} | 0 ...口语-第8课.txt => 口语-第8课.dictionary.txt} | 0 ...口语-第9课.txt => 口语-第9课.dictionary.txt} | 0 ...语-第9课.text.txt => 口语-第9课.phrases.txt} | 1 - ...3-一三课.txt => 听力-第3-一三课.dictionary.txt} | 0 ... 第03课.txt => 基础汉语40课 - 第03课.dictionary.txt} | 0 ... 第04课.txt => 基础汉语40课 - 第04课.dictionary.txt} | 0 ... 第05课.txt => 基础汉语40课 - 第05课.dictionary.txt} | 0 ... 第06课.txt => 基础汉语40课 - 第06课.dictionary.txt} | 0 ... 第07课.txt => 基础汉语40课 - 第07课.dictionary.txt} | 0 ... 第16课.txt => 基础汉语40课 - 第16课.dictionary.txt} | 0 ... 第17课.txt => 基础汉语40课 - 第17课.dictionary.txt} | 0 ... 第18课.txt => 基础汉语40课 - 第18课.dictionary.txt} | 0 ... 第19课.txt => 基础汉语40课 - 第19课.dictionary.txt} | 0 ... 第20课.txt => 基础汉语40课 - 第20课.dictionary.txt} | 0 ... 第21课.txt => 基础汉语40课 - 第21课.dictionary.txt} | 0 ... 第22课.txt => 基础汉语40课 - 第22课.dictionary.txt} | 0 ...words.txt => 基础汉语40课 - 第25课 - 1.dictionary.txt} | 0 ...words.txt => 基础汉语40课 - 第25课 - 2.dictionary.txt} | 0 ... 第29课.txt => 基础汉语40课 - 第29课.dictionary.txt} | 0 ...第一-六课.txt => 阅渎第一-六课.dictionary.txt} | 0 data/output/HSK1/HSK1-1.dictionary.apkg | Bin 0 -> 53466 bytes data/output/HSK1/HSK1-1.prhases.apkg | Bin 53466 -> 53466 bytes setup.py | 1 + 39 files changed, 53 insertions(+), 37 deletions(-) rename data/input/HSK1/{HSK1-1.txt => HSK1-1.dictionary.txt} (69%) rename data/input/HSK1/{HSK1-1.prhases.txt => HSK1-1.phrases.txt} (82%) rename data/input/HSK1/{HSK1-2.txt => HSK1-2.dictionary.txt} (100%) rename data/input/HSK1/{HSK1-3.txt => HSK1-3.dictionary.txt} (100%) rename data/input/HSK1/{HSK1-4.txt => HSK1-4.dictionary.txt} (100%) rename data/input/口语/{口语-第10课.txt => 口语-第10课.dictionary.txt} (100%) rename data/input/口语/{口语-第1课.txt => 口语-第1课.dictionary.txt} (100%) rename data/input/口语/{口语-第2课.txt => 口语-第2课.dictionary.txt} (100%) rename data/input/口语/{口语-第3课.txt => 口语-第3课.dictionary.txt} (100%) rename data/input/口语/{口语-第4课.txt => 口语-第4课.dictionary.txt} (100%) rename data/input/口语/{口语-第5课.txt => 口语-第5课.dictionary.txt} (100%) rename data/input/口语/{口语-第6课.txt => 口语-第6课.dictionary.txt} (100%) rename data/input/口语/{口语-第7课.txt => 口语-第7课.dictionary.txt} (100%) rename data/input/口语/{口语-第8课.txt => 口语-第8课.dictionary.txt} (100%) rename data/input/口语/{口语-第9课.txt => 口语-第9课.dictionary.txt} (100%) rename data/input/口语/{口语-第9课.text.txt => 口语-第9课.phrases.txt} (92%) rename data/input/听力/{听力-第3-一三课.txt => 听力-第3-一三课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第03课.txt => 基础汉语40课 - 第03课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第04课.txt => 基础汉语40课 - 第04课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第05课.txt => 基础汉语40课 - 第05课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第06课.txt => 基础汉语40课 - 第06课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第07课.txt => 基础汉语40课 - 第07课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第16课.txt => 基础汉语40课 - 第16课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第17课.txt => 基础汉语40课 - 第17课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第18课.txt => 基础汉语40课 - 第18课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第19课.txt => 基础汉语40课 - 第19课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第20课.txt => 基础汉语40课 - 第20课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第21课.txt => 基础汉语40课 - 第21课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第22课.txt => 基础汉语40课 - 第22课.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第25课 - 1.words.txt => 基础汉语40课 - 第25课 - 1.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第25课 - 2.words.txt => 基础汉语40课 - 第25课 - 2.dictionary.txt} (100%) rename data/input/基础汉语40课/{基础汉语40课 - 第29课.txt => 基础汉语40课 - 第29课.dictionary.txt} (100%) rename data/input/阅渎/{阅渎第一-六课.txt => 阅渎第一-六课.dictionary.txt} (100%) create mode 100644 data/output/HSK1/HSK1-1.dictionary.apkg diff --git a/anki-hsk-creator/__main__.py b/anki-hsk-creator/__main__.py index 8fc3d4d..0e557e2 100644 --- a/anki-hsk-creator/__main__.py +++ b/anki-hsk-creator/__main__.py @@ -18,7 +18,8 @@ INPUT = DATA / "input" OUTPUT = DATA / "output" CN = "zh" EN = "en" -TEXT_TYPE = "TEXT_TYPE" +PHRASES_TYPE = ".phrases" +DICT_TYPE = ".dictionary" CSS = """ .card { font-family: arial; @@ -127,14 +128,21 @@ def create_translator(): def process_files(): print("Select data file:") - files = [] - for n, file in enumerate(INPUT.glob("**/*.txt")): - files.append(file) - print(f"{n+1} - {file.relative_to(INPUT)}") - s = None - while not s or not s.isnumeric() or not (1 <= int(s) <= len(files)): - s = input(f"Please select the file [1-{len(files)}]: ") - in_file = files[int(s) - 1] + in_file = None + level = INPUT + while not in_file: + files = [] + for n, file in enumerate(level.glob("*")): + files.append(file) + print(f"{n+1} - {file.relative_to(INPUT)}") + s = None + while not s or not s.isnumeric() or not (1 <= int(s) <= len(files)): + s = input(f"Please select the file [1-{len(files)}]: ") + selected = files[int(s) - 1] + if selected.is_file(): + in_file = selected + else: + level = selected relative = in_file.relative_to(INPUT) out_file = OUTPUT / relative out_file.parent.mkdir(parents=True, exist_ok=True) @@ -146,26 +154,35 @@ def process_files(): def dictionary_process(dictionary, in_file): """Process dictionary files""" words_list = in_file.open(encoding="utf8").read().split() - results = [] - for word in words_list: - if v := dictionary.get(word): - if len(v) > 1: - print(f"\nWARNING: {word} has multiple meanings:") - for n, w in enumerate(v): - print(f"{n+1} - {w}") - for m in w.meanings: - print(f"\t{m}") - s = None - while not s or not s.isnumeric() or not (1 <= int(s) <= len(v)): - s = input(f"Please select the correct word [1-{len(v)}]: ") - v = v[int(s) - 1] + results = [] + with in_file.open("w", encoding="utf8") as input_file: + for words in words_list: + word = words.split()[0] + pinyin = words.split()[1] if len(words.split()) > 1 else None + if v := dictionary.get(word): + if len(v) > 1: + print(f"\nWARNING: {word} has multiple meanings:") + if pinyin and pinyin != "ERROR": + ml = filter(lambda x: v.pinyin == pinyin, v) + else: + ml = v + for n, w in enumerate(ml): + print(f"{n+1} - {w}") + for m in w.meanings: + print(f"\t{m}") + s = None + while not s or not s.isnumeric() or not (1 <= int(s) <= len(v)): + s = input(f"Please select the correct word [1-{len(v)}]: ") + v = v[int(s) - 1] + else: + v = v[0] + input_file.write(f"{word}\t{v.pinyin}\n") + results.append(v) else: - v = v[0] - results.append(v) - else: - print("============================================") - print(f"===================>ERROR: {word} not found") - print("============================================") + print("============================================") + print(f"===================>ERROR: {word} not found") + print("============================================") + input_file.write(f"{word}\tERROR\n") return results @@ -231,14 +248,16 @@ def output_anki_text(out_file, results): def main(): in_file, out_file, file_type = process_files() - if TEXT_TYPE == file_type: + if PHRASES_TYPE in in_file.suffixes: create_translator() results = translator_process(in_file) output_anki_text(out_file, results) - else: + elif DICT_TYPE in in_file.suffixes: dictionary = create_cedict() results = dictionary_process(dictionary, in_file) output_anki_dictionary(out_file, results) + else: + raise TypeError("Error, filetype not especified!") if __name__ == "__main__": diff --git a/data/input/HSK1/HSK1-1.txt b/data/input/HSK1/HSK1-1.dictionary.txt similarity index 69% rename from data/input/HSK1/HSK1-1.txt rename to data/input/HSK1/HSK1-1.dictionary.txt index fa269a9..3ec388f 100644 --- a/data/input/HSK1/HSK1-1.txt +++ b/data/input/HSK1/HSK1-1.dictionary.txt @@ -1,9 +1,9 @@ 你 好 -你好 您 +你好 您好 -你们 -您们 +你们好 +您们好 对不起 没关系 \ No newline at end of file diff --git a/data/input/HSK1/HSK1-1.prhases.txt b/data/input/HSK1/HSK1-1.phrases.txt similarity index 82% rename from data/input/HSK1/HSK1-1.prhases.txt rename to data/input/HSK1/HSK1-1.phrases.txt index 2c32671..a88d458 100644 --- a/data/input/HSK1/HSK1-1.prhases.txt +++ b/data/input/HSK1/HSK1-1.phrases.txt @@ -1,4 +1,3 @@ -TEXT_TYPE 上课 下课 想在休息 diff --git a/data/input/HSK1/HSK1-2.txt b/data/input/HSK1/HSK1-2.dictionary.txt similarity index 100% rename from data/input/HSK1/HSK1-2.txt rename to data/input/HSK1/HSK1-2.dictionary.txt diff --git a/data/input/HSK1/HSK1-2.phrases.txt b/data/input/HSK1/HSK1-2.phrases.txt index 343de94..388f7f6 100644 --- a/data/input/HSK1/HSK1-2.phrases.txt +++ b/data/input/HSK1/HSK1-2.phrases.txt @@ -1,3 +1,2 @@ -TEXT_TYPE 不谢 谢谢你 \ No newline at end of file diff --git a/data/input/HSK1/HSK1-3.txt b/data/input/HSK1/HSK1-3.dictionary.txt similarity index 100% rename from data/input/HSK1/HSK1-3.txt rename to data/input/HSK1/HSK1-3.dictionary.txt diff --git a/data/input/HSK1/HSK1-4.txt b/data/input/HSK1/HSK1-4.dictionary.txt similarity index 100% rename from data/input/HSK1/HSK1-4.txt rename to data/input/HSK1/HSK1-4.dictionary.txt diff --git a/data/input/口语/口语-第10课.txt b/data/input/口语/口语-第10课.dictionary.txt similarity index 100% rename from data/input/口语/口语-第10课.txt rename to data/input/口语/口语-第10课.dictionary.txt diff --git a/data/input/口语/口语-第10课.phrases.txt b/data/input/口语/口语-第10课.phrases.txt index abefc37..706caa7 100644 --- a/data/input/口语/口语-第10课.phrases.txt +++ b/data/input/口语/口语-第10课.phrases.txt @@ -1,4 +1,3 @@ -TEXT_TYPE 衣村生活 新农村 环境优美 diff --git a/data/input/口语/口语-第1课.txt b/data/input/口语/口语-第1课.dictionary.txt similarity index 100% rename from data/input/口语/口语-第1课.txt rename to data/input/口语/口语-第1课.dictionary.txt diff --git a/data/input/口语/口语-第2课.txt b/data/input/口语/口语-第2课.dictionary.txt similarity index 100% rename from data/input/口语/口语-第2课.txt rename to data/input/口语/口语-第2课.dictionary.txt diff --git a/data/input/口语/口语-第3课.txt b/data/input/口语/口语-第3课.dictionary.txt similarity index 100% rename from data/input/口语/口语-第3课.txt rename to data/input/口语/口语-第3课.dictionary.txt diff --git a/data/input/口语/口语-第4课.txt b/data/input/口语/口语-第4课.dictionary.txt similarity index 100% rename from data/input/口语/口语-第4课.txt rename to data/input/口语/口语-第4课.dictionary.txt diff --git a/data/input/口语/口语-第5课.txt b/data/input/口语/口语-第5课.dictionary.txt similarity index 100% rename from data/input/口语/口语-第5课.txt rename to data/input/口语/口语-第5课.dictionary.txt diff --git a/data/input/口语/口语-第6课.txt b/data/input/口语/口语-第6课.dictionary.txt similarity index 100% rename from data/input/口语/口语-第6课.txt rename to data/input/口语/口语-第6课.dictionary.txt diff --git a/data/input/口语/口语-第7课.txt b/data/input/口语/口语-第7课.dictionary.txt similarity index 100% rename from data/input/口语/口语-第7课.txt rename to data/input/口语/口语-第7课.dictionary.txt diff --git a/data/input/口语/口语-第8课.txt b/data/input/口语/口语-第8课.dictionary.txt similarity index 100% rename from data/input/口语/口语-第8课.txt rename to data/input/口语/口语-第8课.dictionary.txt diff --git a/data/input/口语/口语-第9课.txt b/data/input/口语/口语-第9课.dictionary.txt similarity index 100% rename from data/input/口语/口语-第9课.txt rename to data/input/口语/口语-第9课.dictionary.txt diff --git a/data/input/口语/口语-第9课.text.txt b/data/input/口语/口语-第9课.phrases.txt similarity index 92% rename from data/input/口语/口语-第9课.text.txt rename to data/input/口语/口语-第9课.phrases.txt index 7af8beb..4779018 100644 --- a/data/input/口语/口语-第9课.text.txt +++ b/data/input/口语/口语-第9课.phrases.txt @@ -1,2 +1 @@ -TEXT_TYPE 周六那场篮球比在,对手很厉害。前半场他们一直赢,后半场我们对才超过他们,领先得并不轻松。 \ No newline at end of file diff --git a/data/input/听力/听力-第3-一三课.txt b/data/input/听力/听力-第3-一三课.dictionary.txt similarity index 100% rename from data/input/听力/听力-第3-一三课.txt rename to data/input/听力/听力-第3-一三课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第03课.txt b/data/input/基础汉语40课/基础汉语40课 - 第03课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第03课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第03课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第04课.txt b/data/input/基础汉语40课/基础汉语40课 - 第04课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第04课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第04课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第05课.txt b/data/input/基础汉语40课/基础汉语40课 - 第05课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第05课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第05课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第06课.txt b/data/input/基础汉语40课/基础汉语40课 - 第06课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第06课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第06课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第07课.txt b/data/input/基础汉语40课/基础汉语40课 - 第07课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第07课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第07课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第16课.txt b/data/input/基础汉语40课/基础汉语40课 - 第16课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第16课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第16课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第17课.txt b/data/input/基础汉语40课/基础汉语40课 - 第17课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第17课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第17课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第18课.txt b/data/input/基础汉语40课/基础汉语40课 - 第18课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第18课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第18课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第19课.txt b/data/input/基础汉语40课/基础汉语40课 - 第19课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第19课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第19课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第20课.txt b/data/input/基础汉语40课/基础汉语40课 - 第20课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第20课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第20课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第21课.txt b/data/input/基础汉语40课/基础汉语40课 - 第21课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第21课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第21课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第22课.txt b/data/input/基础汉语40课/基础汉语40课 - 第22课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第22课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第22课.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第25课 - 1.words.txt b/data/input/基础汉语40课/基础汉语40课 - 第25课 - 1.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第25课 - 1.words.txt rename to data/input/基础汉语40课/基础汉语40课 - 第25课 - 1.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第25课 - 2.words.txt b/data/input/基础汉语40课/基础汉语40课 - 第25课 - 2.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第25课 - 2.words.txt rename to data/input/基础汉语40课/基础汉语40课 - 第25课 - 2.dictionary.txt diff --git a/data/input/基础汉语40课/基础汉语40课 - 第29课.txt b/data/input/基础汉语40课/基础汉语40课 - 第29课.dictionary.txt similarity index 100% rename from data/input/基础汉语40课/基础汉语40课 - 第29课.txt rename to data/input/基础汉语40课/基础汉语40课 - 第29课.dictionary.txt diff --git a/data/input/阅渎/阅渎第一-六课.txt b/data/input/阅渎/阅渎第一-六课.dictionary.txt similarity index 100% rename from data/input/阅渎/阅渎第一-六课.txt rename to data/input/阅渎/阅渎第一-六课.dictionary.txt diff --git a/data/output/HSK1/HSK1-1.dictionary.apkg b/data/output/HSK1/HSK1-1.dictionary.apkg new file mode 100644 index 0000000000000000000000000000000000000000..9910b0ebfff20fe185cfa2ed36d777cf3195f5ca GIT binary patch literal 53466 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 diff --git a/setup.py b/setup.py index 4b28206..196a4ac 100644 --- a/setup.py +++ b/setup.py @@ -9,5 +9,6 @@ setup( "pinyin-tone-converter", "genanki", "argostranslate", + "chattts", ], )