Sfoglia il codice sorgente

把模型也放到仓库中

sequoia 1 mese fa
parent
commit
7f8c9baedc

+ 0 - 1
.gitignore

@@ -2,4 +2,3 @@ __pycache__/
 audio_cache/
 .codex
 nohup.out
-onnx/

+ 150 - 0
onnx/config.json

@@ -0,0 +1,150 @@
+{
+  "istftnet": {
+    "upsample_kernel_sizes": [20, 12],
+    "upsample_rates": [10, 6],
+    "gen_istft_hop_size": 5,
+    "gen_istft_n_fft": 20,
+    "resblock_dilation_sizes": [
+      [1, 3, 5],
+      [1, 3, 5],
+      [1, 3, 5]
+    ],
+    "resblock_kernel_sizes": [3, 7, 11],
+    "upsample_initial_channel": 512
+  },
+  "dim_in": 64,
+  "dropout": 0.2,
+  "hidden_dim": 512,
+  "max_conv_dim": 512,
+  "max_dur": 50,
+  "multispeaker": true,
+  "n_layer": 3,
+  "n_mels": 80,
+  "n_token": 178,
+  "style_dim": 128,
+  "text_encoder_kernel_size": 5,
+  "plbert": {
+    "hidden_size": 768,
+    "num_attention_heads": 12,
+    "intermediate_size": 2048,
+    "max_position_embeddings": 512,
+    "num_hidden_layers": 12,
+    "dropout": 0.1
+  },
+  "vocab": {
+    ";": 1,
+    ":": 2,
+    ",": 3,
+    ".": 4,
+    "!": 5,
+    "?": 6,
+    "—": 9,
+    "…": 10,
+    "\"": 11,
+    "(": 12,
+    ")": 13,
+    "“": 14,
+    "”": 15,
+    " ": 16,
+    "\u0303": 17,
+    "ʣ": 18,
+    "ʥ": 19,
+    "ʦ": 20,
+    "ʨ": 21,
+    "ᵝ": 22,
+    "\uAB67": 23,
+    "A": 24,
+    "I": 25,
+    "O": 31,
+    "Q": 33,
+    "S": 35,
+    "T": 36,
+    "W": 39,
+    "Y": 41,
+    "ᵊ": 42,
+    "a": 43,
+    "b": 44,
+    "c": 45,
+    "d": 46,
+    "e": 47,
+    "f": 48,
+    "h": 50,
+    "i": 51,
+    "j": 52,
+    "k": 53,
+    "l": 54,
+    "m": 55,
+    "n": 56,
+    "o": 57,
+    "p": 58,
+    "q": 59,
+    "r": 60,
+    "s": 61,
+    "t": 62,
+    "u": 63,
+    "v": 64,
+    "w": 65,
+    "x": 66,
+    "y": 67,
+    "z": 68,
+    "ɑ": 69,
+    "ɐ": 70,
+    "ɒ": 71,
+    "æ": 72,
+    "β": 75,
+    "ɔ": 76,
+    "ɕ": 77,
+    "ç": 78,
+    "ɖ": 80,
+    "ð": 81,
+    "ʤ": 82,
+    "ə": 83,
+    "ɚ": 85,
+    "ɛ": 86,
+    "ɜ": 87,
+    "ɟ": 90,
+    "ɡ": 92,
+    "ɥ": 99,
+    "ɨ": 101,
+    "ɪ": 102,
+    "ʝ": 103,
+    "ɯ": 110,
+    "ɰ": 111,
+    "ŋ": 112,
+    "ɳ": 113,
+    "ɲ": 114,
+    "ɴ": 115,
+    "ø": 116,
+    "ɸ": 118,
+    "θ": 119,
+    "œ": 120,
+    "ɹ": 123,
+    "ɾ": 125,
+    "ɻ": 126,
+    "ʁ": 128,
+    "ɽ": 129,
+    "ʂ": 130,
+    "ʃ": 131,
+    "ʈ": 132,
+    "ʧ": 133,
+    "ʊ": 135,
+    "ʋ": 136,
+    "ʌ": 138,
+    "ɣ": 139,
+    "ɤ": 140,
+    "χ": 142,
+    "ʎ": 143,
+    "ʒ": 147,
+    "ʔ": 148,
+    "ˈ": 156,
+    "ˌ": 157,
+    "ː": 158,
+    "ʰ": 162,
+    "ʲ": 164,
+    "↓": 169,
+    "→": 171,
+    "↗": 172,
+    "↘": 173,
+    "ᵻ": 177
+  }
+}

BIN
onnx/model_uint8.onnx


+ 237 - 0
onnx/tokenizer.json

@@ -0,0 +1,237 @@
+{
+  "version": "1.0",
+  "truncation": null,
+  "padding": null,
+  "added_tokens": [],
+  "normalizer": {
+    "type": "Replace",
+    "pattern": {
+      "Regex": "[^ !\"$',.:;?A-Za-z\u00a1\u00ab\u00bb\u00bf\u00e6\u00e7\u00f0\u00f8\u0127\u014b\u0153\u01c0-\u01c3\u0250-\u0268\u026a-\u0276\u0278-\u027b\u027d\u027e\u0280-\u0284\u0288-\u0292\u0294\u0295\u0298\u0299\u029b-\u029d\u029f\u02a1\u02a2\u02a4\u02a7\u02b0-\u02b2\u02b4\u02b7\u02bc\u02c8\u02cc\u02d0\u02d1\u02de\u02e0\u02e4\u0329\u03b2\u03b8\u03c7\u1d7b\u2014\u201c\u201d\u2026\u2191-\u2193\u2197\u2198\u2c71]"
+    },
+    "content": ""
+  },
+  "pre_tokenizer": {
+    "type": "Split",
+    "pattern": {
+      "Regex": ""
+    },
+    "behavior": "Isolated",
+    "invert": false
+  },
+  "post_processor": {
+    "type": "TemplateProcessing",
+    "single": [
+      {
+        "SpecialToken": {
+          "id": "$",
+          "type_id": 0
+        }
+      },
+      {
+        "Sequence": {
+          "id": "A",
+          "type_id": 0
+        }
+      },
+      {
+        "SpecialToken": {
+          "id": "$",
+          "type_id": 0
+        }
+      }
+    ],
+    "special_tokens": {
+      "$": {
+        "id": "$",
+        "ids": [
+          0
+        ],
+        "tokens": [
+          "$"
+        ]
+      }
+    }
+  },
+  "decoder": null,
+  "model": {
+    "vocab": {
+      "$": 0,
+      ";": 1,
+      ":": 2,
+      ",": 3,
+      ".": 4,
+      "!": 5,
+      "?": 6,
+      "\u00a1": 7,
+      "\u00bf": 8,
+      "\u2014": 9,
+      "\u2026": 10,
+      "\"": 11,
+      "\u00ab": 12,
+      "\u00bb": 13,
+      "\u201c": 14,
+      "\u201d": 15,
+      " ": 16,
+      "A": 17,
+      "B": 18,
+      "C": 19,
+      "D": 20,
+      "E": 21,
+      "F": 22,
+      "G": 23,
+      "H": 24,
+      "I": 25,
+      "J": 26,
+      "K": 27,
+      "L": 28,
+      "M": 29,
+      "N": 30,
+      "O": 31,
+      "P": 32,
+      "Q": 33,
+      "R": 34,
+      "S": 35,
+      "T": 36,
+      "U": 37,
+      "V": 38,
+      "W": 39,
+      "X": 40,
+      "Y": 41,
+      "Z": 42,
+      "a": 43,
+      "b": 44,
+      "c": 45,
+      "d": 46,
+      "e": 47,
+      "f": 48,
+      "g": 49,
+      "h": 50,
+      "i": 51,
+      "j": 52,
+      "k": 53,
+      "l": 54,
+      "m": 55,
+      "n": 56,
+      "o": 57,
+      "p": 58,
+      "q": 59,
+      "r": 60,
+      "s": 61,
+      "t": 62,
+      "u": 63,
+      "v": 64,
+      "w": 65,
+      "x": 66,
+      "y": 67,
+      "z": 68,
+      "\u0251": 69,
+      "\u0250": 70,
+      "\u0252": 71,
+      "\u00e6": 72,
+      "\u0253": 73,
+      "\u0299": 74,
+      "\u03b2": 75,
+      "\u0254": 76,
+      "\u0255": 77,
+      "\u00e7": 78,
+      "\u0257": 79,
+      "\u0256": 80,
+      "\u00f0": 81,
+      "\u02a4": 82,
+      "\u0259": 83,
+      "\u0258": 84,
+      "\u025a": 85,
+      "\u025b": 86,
+      "\u025c": 87,
+      "\u025d": 88,
+      "\u025e": 89,
+      "\u025f": 90,
+      "\u0284": 91,
+      "\u0261": 92,
+      "\u0260": 93,
+      "\u0262": 94,
+      "\u029b": 95,
+      "\u0266": 96,
+      "\u0267": 97,
+      "\u0127": 98,
+      "\u0265": 99,
+      "\u029c": 100,
+      "\u0268": 101,
+      "\u026a": 102,
+      "\u029d": 103,
+      "\u026d": 104,
+      "\u026c": 105,
+      "\u026b": 106,
+      "\u026e": 107,
+      "\u029f": 108,
+      "\u0271": 109,
+      "\u026f": 110,
+      "\u0270": 111,
+      "\u014b": 112,
+      "\u0273": 113,
+      "\u0272": 114,
+      "\u0274": 115,
+      "\u00f8": 116,
+      "\u0275": 117,
+      "\u0278": 118,
+      "\u03b8": 119,
+      "\u0153": 120,
+      "\u0276": 121,
+      "\u0298": 122,
+      "\u0279": 123,
+      "\u027a": 124,
+      "\u027e": 125,
+      "\u027b": 126,
+      "\u0280": 127,
+      "\u0281": 128,
+      "\u027d": 129,
+      "\u0282": 130,
+      "\u0283": 131,
+      "\u0288": 132,
+      "\u02a7": 133,
+      "\u0289": 134,
+      "\u028a": 135,
+      "\u028b": 136,
+      "\u2c71": 137,
+      "\u028c": 138,
+      "\u0263": 139,
+      "\u0264": 140,
+      "\u028d": 141,
+      "\u03c7": 142,
+      "\u028e": 143,
+      "\u028f": 144,
+      "\u0291": 145,
+      "\u0290": 146,
+      "\u0292": 147,
+      "\u0294": 148,
+      "\u02a1": 149,
+      "\u0295": 150,
+      "\u02a2": 151,
+      "\u01c0": 152,
+      "\u01c1": 153,
+      "\u01c2": 154,
+      "\u01c3": 155,
+      "\u02c8": 156,
+      "\u02cc": 157,
+      "\u02d0": 158,
+      "\u02d1": 159,
+      "\u02bc": 160,
+      "\u02b4": 161,
+      "\u02b0": 162,
+      "\u02b1": 163,
+      "\u02b2": 164,
+      "\u02b7": 165,
+      "\u02e0": 166,
+      "\u02e4": 167,
+      "\u02de": 168,
+      "\u2193": 169,
+      "\u2191": 170,
+      "\u2192": 171,
+      "\u2197": 172,
+      "\u2198": 173,
+      "\u0329": 175,
+      "'": 176,
+      "\u1d7b": 177
+    }
+  }
+}

BIN
onnx/voices/_voices.generated.npz


BIN
onnx/voices/af_bella.bin


BIN
onnx/voices/af_heart.bin


BIN
onnx/voices/af_nicole.bin


BIN
onnx/voices/af_sarah.bin


BIN
onnx/voices/af_sky.bin


BIN
onnx/voices/am_adam.bin


BIN
onnx/voices/am_michael.bin


BIN
onnx/voices/bf_emma.bin


BIN
onnx/voices/bf_isabella.bin


BIN
onnx/voices/bm_george.bin


BIN
onnx/voices/bm_lewis.bin


+ 33 - 1
speech_tts_onnx_opt.py

@@ -283,6 +283,34 @@ def _download_voice_file(voice_path: Path) -> Path:
     return voice_path
 
 
+def resolve_voices_path() -> str:
+    voices_dir = Path(VOICES_DIR)
+    if voices_dir.is_dir():
+        voice_files = sorted(voices_dir.glob("*.bin"))
+        if not voice_files:
+            raise FileNotFoundError(f"voices 目录中没有可用的 .bin 音色文件: {voices_dir}")
+
+        packed_path = voices_dir / "_voices.generated.npz"
+        needs_rebuild = not packed_path.exists()
+        if not needs_rebuild:
+            packed_mtime = packed_path.stat().st_mtime
+            needs_rebuild = any(f.stat().st_mtime > packed_mtime for f in voice_files)
+
+        if needs_rebuild:
+            voice_map = {}
+            for voice_file in voice_files:
+                raw = np.fromfile(voice_file, dtype=np.float32)
+                if raw.size != 510 * 1 * 256:
+                    raise ValueError(f"音色文件格式不正确: {voice_file}")
+                voice_map[voice_file.stem] = raw.reshape(510, 1, 256)
+            np.savez(packed_path, **voice_map)
+        return str(packed_path)
+
+    if Path(VOICES_V1_PATH).exists():
+        return VOICES_V1_PATH
+    raise FileNotFoundError(f"找不到 voices 目录或 voices-v1.0.bin: {voices_dir}, {VOICES_V1_PATH}")
+
+
 def load_onnx_session(name: str):
     try:
         import onnxruntime as ort  # type: ignore
@@ -305,7 +333,11 @@ def load_kokoro_engine(name: str):
         raise RuntimeError("无法导入 kokoro_onnx。请在部署环境中安装 kokoro-onnx。") from e
 
     model_path = resolve_model_path(name)
-    return Kokoro(model_path=model_path, voices_path=VOICES_V1_PATH, vocab_config=CONFIG_PATH if Path(CONFIG_PATH).exists() else None)
+    return Kokoro(
+        model_path=model_path,
+        voices_path=resolve_voices_path(),
+        vocab_config=CONFIG_PATH if Path(CONFIG_PATH).exists() else None,
+    )
 
 
 def load_model(force_reload: bool = False, name: Optional[str] = None):