From f29ff3a2d19405743dc6da65b84fbb6b6eba17c8 Mon Sep 17 00:00:00 2001 From: AILab <1038lab@gmail.com> Date: Tue, 13 Oct 2026 16:32:43 -0700 Subject: [PATCH] release: v2.0.0 (2026/10/13) --- README.md | 21 +- __init__.py | 139 +++--- ailab_audio.py | 12 +- ailab_edgeTTS.py | 91 ++-- ailab_utils.py | 397 ++++++++++++++++++ ailab_whisperSTT.py | 15 +- .../workflow_edgetts_tts_to_stt.jpg | Bin 0 -> 118444 bytes .../workflow_edgetts_tts_to_stt.json | 362 ++++++++++++++++ pyproject.toml | 4 +- requirements.txt | 2 +- update.md | 21 + 11 files changed, 946 insertions(+), 118 deletions(-) create mode 100644 ailab_utils.py create mode 100644 example_workflows/workflow_edgetts_tts_to_stt.jpg create mode 100644 example_workflows/workflow_edgetts_tts_to_stt.json diff --git a/README.md b/README.md index ffd791e..371024a 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,21 @@ -# ComfyUI Audio Nodes +# ComfyUI-EdgeTTS + +

+ ComfyUI + PyTorch + GPL-3.0 +

ComfyUI-EdgeTTS is a powerful text-to-speech node for ComfyUI, leveraging Microsoft's Edge TTS capabilities. It enables seamless conversion of text into natural-sounding speech, supporting multiple languages and voices. Ideal for enhancing user interactions, this node is easy to integrate and customize, making it perfect for various applications. https://github.com/user-attachments/assets/a5b9165b-a413-49fd-989e-0ef3141afce7 -## Updates -- V1.2.2 (2026-01-25) - Voice ID update requirments [update log](update.md#v121-2026125). -- V1.2.1 (2025-07-23) - Voice ID update & Bug Fixed [update log](update.md#v121-2025723). -- V1.2.0 (2025-06-20) - Simplified voice display format, improved performance with lazy loading and caching, and reduced memory usage. For more information, please see the [update log](update.md#v120-2025620). - -- V1.1.0 (2025-01-24) - Added 19 new languages and 38 new voices, with more detailed characteristics for existing Chinese voices. For more information, please see the [update log](update.md#v110-2025124). +## News & Updates +- **2026/10/13**: Update ComfyUI-EdgeTTS to **v2.0.0** ( [update.md](update.md#v200-20261013) ) +- **2026/01/25**: Update ComfyUI-EdgeTTS to **v1.2.2** ( [update.md](update.md#v122-2026125) ) +- **2025/07/23**: Update ComfyUI-EdgeTTS to **v1.2.1** ( [update.md](update.md#v121-2025723) ) +- **2025/06/20**: Update ComfyUI-EdgeTTS to **v1.2.0** ( [update.md](update.md#v120-2025620) ) +- **2025/01/24**: Update ComfyUI-EdgeTTS to **v1.1.0** ( [update.md](update.md#v110-2025124) ) ## Features @@ -24,6 +30,7 @@ https://github.com/user-attachments/assets/a5b9165b-a413-49fd-989e-0ef3141afce7 - **Whisper STT**: High-accuracy speech recognition - Multiple language support with auto-detection - Multiple model sizes (tiny to large) + - Dual output: raw transcription text (`TEXT`) and timecoded subtitles (`SRT`) - Supports ComfyUI audio format - Language detection confidence reporting diff --git a/__init__.py b/__init__.py index 4bff646..890addf 100644 --- a/__init__.py +++ b/__init__.py @@ -1,69 +1,70 @@ -# ComfyUI-EdgeTTS - -# ComfyUI-EdgeTTS is a powerful text-to-speech node for ComfyUI, leveraging Microsoft's Edge TTS capabilities. -# It enables seamless conversion of text into natural-sounding speech, supporting multiple languages and voices. -# Ideal for enhancing user interactions, this node is easy to integrate and customize, making it perfect for various applications. - -# This integration script follows GPL-3.0 License. -# When using or modifying this code, please respect both the original model licenses -# and this integration's license terms. -# -# Source: https://github.com/1038lab/ComfyUI-EdgeTTS - -import importlib.util -import os -import sys - -current_dir = os.path.dirname(__file__) -sys.path.insert(0, current_dir) - -NODE_CLASS_MAPPINGS = {} -NODE_DISPLAY_NAME_MAPPINGS = {} -WEB_DIRECTORY = "./web" - -def load_modules_from_directory(directory): - if not os.path.exists(directory): - return - - for file in os.listdir(directory): - if not file.endswith(".py"): - continue - - module_name = os.path.basename(file)[:-3] - if module_name == os.path.basename(__file__)[:-3]: - continue - - file_path = os.path.join(directory, file) - try: - spec = importlib.util.spec_from_file_location(module_name, file_path) - if spec is None or spec.loader is None: - continue - - module = importlib.util.module_from_spec(spec) - sys.modules[module_name] = module - spec.loader.exec_module(module) - - if hasattr(module, "NODE_CLASS_MAPPINGS"): - NODE_CLASS_MAPPINGS.update(module.NODE_CLASS_MAPPINGS) - if hasattr(module, "NODE_DISPLAY_NAME_MAPPINGS"): - NODE_DISPLAY_NAME_MAPPINGS.update(module.NODE_DISPLAY_NAME_MAPPINGS) - - except Exception as e: - print(f"Error loading module {module_name}: {e}") - -def load_javascript(web_directory): - return [] - -load_modules_from_directory(current_dir) -load_modules_from_directory(os.path.join(current_dir, "py")) - -NODE_CLASS_MAPPINGS = dict(sorted( - NODE_CLASS_MAPPINGS.items(), - key=lambda x: NODE_DISPLAY_NAME_MAPPINGS.get(x[0], x[0]) -)) -NODE_DISPLAY_NAME_MAPPINGS = dict(sorted( - NODE_DISPLAY_NAME_MAPPINGS.items(), - key=lambda x: x[1] -)) - -__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY", "load_javascript"] \ No newline at end of file +from pathlib import Path +import sys +import importlib.util + +__repo_name__ = "ComfyUI-EdgeTTS" +__version__ = "2.0.0" + +current_dir = Path(__file__).parent +if str(current_dir) not in sys.path: + sys.path.insert(0, str(current_dir)) + +scan_dirs = [current_dir] +nodes_dir = current_dir / "py" +if nodes_dir.exists() and nodes_dir.is_dir(): + scan_dirs.append(nodes_dir) + if str(nodes_dir) not in sys.path: + sys.path.insert(0, str(nodes_dir)) + +NODE_CLASS_MAPPINGS = {} +NODE_DISPLAY_NAME_MAPPINGS = {} +WEB_DIRECTORY = "./web" + + +def load_nodes(): + models_dir = current_dir / "models" + for base in scan_dirs: + for file in base.rglob("*.py"): + if file.stem == "__init__": + continue + try: + if file.is_relative_to(models_dir): + continue + except Exception: + if str(models_dir) in str(file): + continue + + module_name = file.stem + try: + spec = importlib.util.spec_from_file_location(module_name, file) + if spec and spec.loader: + module = importlib.util.module_from_spec(spec) + sys.modules[module_name] = module + spec.loader.exec_module(module) + + if hasattr(module, "NODE_CLASS_MAPPINGS"): + NODE_CLASS_MAPPINGS.update(module.NODE_CLASS_MAPPINGS) + if hasattr(module, "NODE_DISPLAY_NAME_MAPPINGS"): + NODE_DISPLAY_NAME_MAPPINGS.update(module.NODE_DISPLAY_NAME_MAPPINGS) + except Exception as e: + print(f"[{__repo_name__}] Error loading module {file.name}: {e}") + + +load_nodes() + +NODE_CLASS_MAPPINGS = dict( + sorted( + NODE_CLASS_MAPPINGS.items(), + key=lambda x: NODE_DISPLAY_NAME_MAPPINGS.get(x[0], x[0]), + ) +) +NODE_DISPLAY_NAME_MAPPINGS = dict( + sorted(NODE_DISPLAY_NAME_MAPPINGS.items(), key=lambda x: x[1]) +) + +__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"] + +print(f'\033[36m[{__repo_name__}]\033[0m v' + f'\033[93m{__version__}\033[0m | ' + f'\033[37m{len(NODE_CLASS_MAPPINGS)} nodes\033[0m ' + f'\033[92mLoaded\033[0m') \ No newline at end of file diff --git a/ailab_audio.py b/ailab_audio.py index 8bb6d52..800e9a5 100644 --- a/ailab_audio.py +++ b/ailab_audio.py @@ -28,21 +28,21 @@ class Save_Audio: def INPUT_TYPES(s): return { "required": { - "audio": ("AUDIO", ), + "audio": ("AUDIO", {"tooltip": "Input audio stream to save"}), "filepath": ("STRING", { "multiline": True, "default": "", "placeholder": "custom_path/filename", - "tooltip": "by default, the audio will be saved to output/TTS/{date}/TTS-xxxx.{format}" + "tooltip": "Custom output path or filename (default: output/TTS/{date}/TTS-xxxx.{format})" }), - "format": (s.AUDIO_FORMATS, {"default": "mp3"}), - "quality": (s.QUALITY_PRESETS, {"default": "high"}), - "overwrite": ("BOOLEAN", {"default": False}) + "format": (s.AUDIO_FORMATS, {"default": "mp3", "tooltip": "Audio format (mp3, wav, flac)"}), + "quality": (s.QUALITY_PRESETS, {"default": "high", "tooltip": "Audio quality bitrate preset"}), + "overwrite": ("BOOLEAN", {"default": False, "tooltip": "Overwrite existing file if set to true"}) }, } RETURN_TYPES = ("STRING", "AUDIO",) - RETURN_NAMES = ("filepath", "audio",) + RETURN_NAMES = ("FILEPATH", "AUDIO",) FUNCTION = "save_audio" OUTPUT_NODE = True CATEGORY = "🧪AILab/🔊Audio" diff --git a/ailab_edgeTTS.py b/ailab_edgeTTS.py index 568468c..485755a 100644 --- a/ailab_edgeTTS.py +++ b/ailab_edgeTTS.py @@ -1,8 +1,3 @@ -# ComfyUI-EdgeTTS V1.2.1 -# A simplified Edge TTS node for ComfyUI -# Uses Microsoft Edge's online text-to-speech service -# Outputs standard ComfyUI audio format - import os import edge_tts import asyncio @@ -10,6 +5,37 @@ import re import torch import torchaudio import json +from ailab_utils import setup_audio_service + +setup_audio_service() + + +def decode_audio(filepath): + try: + waveform, sample_rate = torchaudio.load(filepath) + return waveform, sample_rate + except Exception: + try: + from comfy_extras.nodes_audio import load as comfy_audio_load + return comfy_audio_load(filepath) + except Exception: + import av + with av.open(filepath) as af: + stream = af.streams.audio[0] + sr = stream.codec_context.sample_rate + n_channels = stream.channels + frames = [] + for frame in af.decode(streams=stream.index): + buf = torch.from_numpy(frame.to_ndarray()) + if buf.shape[0] != n_channels: + buf = buf.view(-1, n_channels).t() + frames.append(buf) + wav = torch.cat(frames, dim=1) + if wav.dtype.is_floating_point: + wav = wav.to(torch.float32) + else: + wav = wav.to(torch.float32) / 32768.0 + return wav, sr class EdgeTTS: _voice_data_cache = None @@ -78,7 +104,7 @@ class EdgeTTS: voices, _, _ = cls.get_voice_data() return { "required": { - "text": ("STRING", {"multiline": True, "placeholder": "Enter text to convert to speech"}), + "text": ("STRING", {"multiline": True, "placeholder": "Enter text to convert to speech", "tooltip": "Text content to convert into speech"}), "voice": (voices, {"default": voices[0], "tooltip": "Select a voice for text-to-speech"}), }, "optional": { @@ -88,57 +114,64 @@ class EdgeTTS: } RETURN_TYPES = ("AUDIO",) + RETURN_NAMES = ("AUDIO",) FUNCTION = "tts" CATEGORY = "🧪AILab/🔊Audio" async def generate_speech(self, text, voice, speed, pitch): - """Generate speech from text using Edge TTS""" speed_percent = int((speed - 1.0) * 100) rate = "+0%" if speed_percent == 0 else f"{speed_percent:+d}%" - - temp_file = f"temp_tts_{os.getpid()}.wav" + + temp_file = f"temp_tts_{os.getpid()}.mp3" try: text = text.strip() if not text: raise ValueError("Input text cannot be empty") + setup_audio_service() communicate = edge_tts.Communicate( text=text, voice=voice, rate=rate, pitch=f"{pitch:+d}Hz" ) - - try: - await communicate.save(temp_file) - except edge_tts.exceptions.NoAudioReceived: - default_display_name = self.DEFAULT_VOICES[0] - default_voice = self.VOICE_IDS.get(default_display_name, default_display_name) - - if voice != default_voice: - print(f"Warning: Failed with voice {voice}, trying default voice {default_voice}") - communicate = edge_tts.Communicate( - text=text, - voice=default_voice, - rate=rate, - pitch=f"{pitch:+d}Hz" - ) + for attempt in range(2): + try: await communicate.save(temp_file) - else: + break + except edge_tts.exceptions.NoAudioReceived: + default_display_name = self.DEFAULT_VOICES[0] + default_voice = self.VOICE_IDS.get(default_display_name, default_display_name) + if voice != default_voice: + print(f"Warning: Failed with voice {voice}, trying default voice {default_voice}") + communicate = edge_tts.Communicate( + text=text, + voice=default_voice, + rate=rate, + pitch=f"{pitch:+d}Hz" + ) + await communicate.save(temp_file) + break raise - - waveform, sample_rate = torchaudio.load(temp_file) + except Exception as e: + if attempt == 0: + await asyncio.sleep(0.3) + setup_audio_service() + continue + raise e + + waveform, sample_rate = decode_audio(temp_file) if waveform.shape[0] > 1: waveform = waveform.mean(dim=0, keepdim=True) waveform = waveform / (waveform.abs().max() + 1e-6) return {"waveform": waveform.unsqueeze(0), "sample_rate": sample_rate} - + finally: if os.path.exists(temp_file): try: os.remove(temp_file) - except: + except Exception: pass def tts(self, text, voice, speed=1.0, pitch=0): diff --git a/ailab_utils.py b/ailab_utils.py new file mode 100644 index 0000000..3feec1a --- /dev/null +++ b/ailab_utils.py @@ -0,0 +1,397 @@ +import secrets +import struct +from datetime import datetime as dt +from datetime import timezone as tz +from functools import lru_cache +from typing import List, Optional, Tuple + +import edge_tts +import edge_tts.communicate +import edge_tts.constants +import edge_tts.drm + +TRUSTED_CLIENT_TOKEN = "6A5AA1D4EAFF4E9FB37E23D68491D6F4" +CHROMIUM_FULL_VERSION = "143.0.3650.75" +SEC_MS_GEC_VERSION = f"2-{CHROMIUM_FULL_VERSION}" + +WIN_EPOCH = 11644473600 +S_TO_NS = 1e9 +_U32_MASK = 0xFFFFFFFF + +_SHA256_INITIAL = ( + 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, + 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19, +) +_SHA256_STATE = ( + 0xFD9FBEA2, 0x91243CE7, 0xBE499094, 0xCD2E1E0A, + 0x6C006F49, 0x04BD35AB, 0xFEB0A7E4, 0x03EFFBD2, +) +_SHA256_SCHEDULE = ( + 0xEB24BF9E, 0x1558691F, 0xA0C09EE2, 0x0CFA32BA, + 0xA622EE8C, 0xD1DD9491, 0xC0DD25A0, 0xF9E70AB6, + 0xF0C31573, 0x7058CE4E, 0x7188E606, 0x00E5AB33, + 0xD258B060, 0x72766564, +) +_SHA256_ROUND_CONSTANTS = ( + 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, + 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, + 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, + 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, + 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, + 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, + 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, + 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, + 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, + 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, + 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, + 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, + 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, + 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, + 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, + 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, +) +_SHA256_ADJUSTMENT = 0xC9DC06A7 +_SHA256_BLOCK_CONSTANTS = ( + _SHA256_ROUND_CONSTANTS[:14] + (_SHA256_ADJUSTMENT,) + _SHA256_ROUND_CONSTANTS[15:] +) +_SHA256_SIGMA0_ADJUSTMENT = 0x059C0B80 +_SHA256_SIGMA1_ADJUSTMENT = 0x000B92C0 + +_CS64_COEFFICIENTS = ( + (0xE82E91B1, 0xB32700D0), + (0x44DE24C6, 0x88DFF51D), + (0x3BEB65BC, 0x29514038), + (0xC89C5933, 0xB328CBDF), + (0x8D1EC211, 0xD405B4D5), + (0x314EF5D5, 0x26E55F3C), + (0xE92491B1, 0x607801C6), + (0xF0A5B9D5, 0x82B2C1FB), + (0x06064CF3, 0xFA51A3DA), + (0xDA79FA60, 0x207CC464), + (0xBED20560, 0x3C3C74F3), + (0x89F9C9F8, 0xD2D14B61), + (0x35FA38C6, 0xBB04A2C1), + (0xCB49E3C6, 0xC5626167), +) +_CS64_FACTOR = 0x82893933 +_CS64_ADJUSTMENT0 = 0xF2F90B1A +_CS64_ADJUSTMENT1 = 0x0B1A0000 + + +def _rol16(value: int) -> int: + value &= _U32_MASK + return ((value << 16) | (value >> 16)) & _U32_MASK + + +def _words_le4_even(data: bytes) -> List[int]: + padded = data + b"\x00" * ((-len(data)) % 4) + if not padded: + return [] + words = list(struct.unpack(f"<{len(padded) // 4}I", padded)) + if len(words) % 2: + words.append(0) + return words + + +def _sigma0(value: int) -> int: + return ( + (value >> 7) ^ (value << 25) ^ (value >> 18) ^ (value << 14) ^ (value >> 3) + ) & _U32_MASK + + +def _sigma1(value: int) -> int: + return ( + (value >> 17) ^ (value << 15) ^ (value >> 19) ^ (value << 13) ^ (value >> 10) + ) & _U32_MASK + + +def _sha256_rounds( + state: Tuple[int, ...], words: List[int], first_round: int = 0 +) -> Tuple[int, ...]: + a, b, c, d, e, f, g, h = state + mask = _U32_MASK + constants = ( + _SHA256_BLOCK_CONSTANTS if first_round == 14 else _SHA256_ROUND_CONSTANTS + ) + aligned = min(64, ((first_round + 7) // 8) * 8) + for index in range(first_round, aligned): + rot_e = e * 0x100000001 + rot_a = a * 0x100000001 + t1 = ( + h + + ((rot_e >> 6) ^ (rot_e >> 11) ^ (rot_e >> 25)) + + (g ^ (e & (f ^ g))) + + constants[index] + + words[index] + ) + t2 = ((rot_a >> 2) ^ (rot_a >> 13) ^ (rot_a >> 22)) + ((a & b) | (c & (a | b))) + a, b, c, d, e, f, g, h = (t1 + t2) & mask, a, b, c, (d + t1) & mask, e, f, g + + for index in range(aligned, 64, 8): + rot_e = e * 0x100000001 + rot_a = a * 0x100000001 + t1 = ( + h + + ((rot_e >> 6) ^ (rot_e >> 11) ^ (rot_e >> 25)) + + (g ^ (e & (f ^ g))) + + constants[index] + + words[index] + ) + d = (d + t1) & mask + h = ( + t1 + + ((rot_a >> 2) ^ (rot_a >> 13) ^ (rot_a >> 22)) + + ((a & b) | (c & (a | b))) + ) & mask + rot_e = d * 0x100000001 + rot_a = h * 0x100000001 + t1 = ( + g + + ((rot_e >> 6) ^ (rot_e >> 11) ^ (rot_e >> 25)) + + (f ^ (d & (e ^ f))) + + constants[index + 1] + + words[index + 1] + ) + c = (c + t1) & mask + g = ( + t1 + + ((rot_a >> 2) ^ (rot_a >> 13) ^ (rot_a >> 22)) + + ((h & a) | (b & (h | a))) + ) & mask + rot_e = c * 0x100000001 + rot_a = g * 0x100000001 + t1 = ( + f + + ((rot_e >> 6) ^ (rot_e >> 11) ^ (rot_e >> 25)) + + (e ^ (c & (d ^ e))) + + constants[index + 2] + + words[index + 2] + ) + b = (b + t1) & mask + f = ( + t1 + + ((rot_a >> 2) ^ (rot_a >> 13) ^ (rot_a >> 22)) + + ((g & h) | (a & (g | h))) + ) & mask + rot_e = b * 0x100000001 + rot_a = f * 0x100000001 + t1 = ( + e + + ((rot_e >> 6) ^ (rot_e >> 11) ^ (rot_e >> 25)) + + (d ^ (b & (c ^ d))) + + constants[index + 3] + + words[index + 3] + ) + a = (a + t1) & mask + e = ( + t1 + + ((rot_a >> 2) ^ (rot_a >> 13) ^ (rot_a >> 22)) + + ((f & g) | (h & (f | g))) + ) & mask + rot_e = a * 0x100000001 + rot_a = e * 0x100000001 + t1 = ( + d + + ((rot_e >> 6) ^ (rot_e >> 11) ^ (rot_e >> 25)) + + (c ^ (a & (b ^ c))) + + constants[index + 4] + + words[index + 4] + ) + h = (h + t1) & mask + d = ( + t1 + + ((rot_a >> 2) ^ (rot_a >> 13) ^ (rot_a >> 22)) + + ((e & f) | (g & (e | f))) + ) & mask + rot_e = h * 0x100000001 + rot_a = d * 0x100000001 + t1 = ( + c + + ((rot_e >> 6) ^ (rot_e >> 11) ^ (rot_e >> 25)) + + (b ^ (h & (a ^ b))) + + constants[index + 5] + + words[index + 5] + ) + g = (g + t1) & mask + c = ( + t1 + + ((rot_a >> 2) ^ (rot_a >> 13) ^ (rot_a >> 22)) + + ((d & e) | (f & (d | e))) + ) & mask + rot_e = g * 0x100000001 + rot_a = c * 0x100000001 + t1 = ( + b + + ((rot_e >> 6) ^ (rot_e >> 11) ^ (rot_e >> 25)) + + (a ^ (g & (h ^ a))) + + constants[index + 6] + + words[index + 6] + ) + f = (f + t1) & mask + b = ( + t1 + + ((rot_a >> 2) ^ (rot_a >> 13) ^ (rot_a >> 22)) + + ((c & d) | (e & (c | d))) + ) & mask + rot_e = f * 0x100000001 + rot_a = b * 0x100000001 + t1 = ( + a + + ((rot_e >> 6) ^ (rot_e >> 11) ^ (rot_e >> 25)) + + (h ^ (f & (g ^ h))) + + constants[index + 7] + + words[index + 7] + ) + e = (e + t1) & mask + a = ( + t1 + + ((rot_a >> 2) ^ (rot_a >> 13) ^ (rot_a >> 22)) + + ((b & c) | (d & (b | c))) + ) & mask + return a, b, c, d, e, f, g, h + + +def _expand_sha256_schedule(words: List[int], first_word: int = 16) -> None: + mask = _U32_MASK + for index in range(first_word, 64): + x, y = words[index - 2], words[index - 15] + sigma1 = (x >> 17) ^ (x << 15) ^ (x >> 19) ^ (x << 13) ^ (x >> 10) + sigma0 = (y >> 7) ^ (y << 25) ^ (y >> 18) ^ (y << 14) ^ (y >> 3) + words.append((sigma1 + words[index - 7] + sigma0 + words[index - 16]) & mask) + + +@lru_cache(maxsize=1) +def _sha256_init(data: bytes) -> Tuple[int, ...]: + mask = _U32_MASK + words = [0] * 14 + [int.from_bytes(data[:3], "big")] + words.append(int.from_bytes(data[3:7], "big")) + for index in range(16, 30): + value = _SHA256_SCHEDULE[index - 16] + if index - 2 >= 14: + value += ( + (_sigma1(words[index - 2]) ^ _SHA256_SIGMA1_ADJUSTMENT) + if index == 16 + else _sigma1(words[index - 2]) + ) + if index - 7 >= 14: + value += words[index - 7] + if index - 15 >= 14: + value += ( + (_sigma0(words[index - 15]) ^ _SHA256_SIGMA0_ADJUSTMENT) + if index == 29 + else _sigma0(words[index - 15]) + ) + words.append(value & mask) + words.append( + ( + _sigma1(words[28]) + + words[23] + + _sigma0(words[15]) + + words[14] + + _SHA256_ADJUSTMENT + - _SHA256_ROUND_CONSTANTS[14] + ) + & mask + ) + _expand_sha256_schedule(words, 31) + working = _sha256_rounds(_SHA256_STATE, words, 14) + return tuple((x + y) & mask for x, y in zip(_SHA256_INITIAL, working)) + + +def _sha256_digest(data: bytes) -> bytes: + if len(data) < 7: + raise ValueError("Token salt must contain at least seven bytes") + mask = _U32_MASK + length = 57 + len(data) + padded = data[7:] + b"\x80" + b"\x00" * ((55 - length) % 64) + padded += struct.pack(">Q", length * 8) + state = _sha256_init(data[:7]) + for offset in range(0, len(padded), 64): + words = list(struct.unpack(">16I", padded[offset : offset + 64])) + _expand_sha256_schedule(words) + working = _sha256_rounds(state, words) + state = tuple((x + y) & mask for x, y in zip(state, working)) + return struct.pack(">8I", *state) + + +def _cs64_digest(data: bytes, digest: bytes) -> Tuple[int, int]: + mask = _U32_MASK + key_a, key_b = struct.unpack_from(" Tuple[str, str]: + digest = _sha256_digest(data) + cs64 = struct.pack(" str: + if unix_timestamp is None: + ticks = dt.now(tz.utc).timestamp() + else: + ticks = float(unix_timestamp) + ticks += WIN_EPOCH + ticks -= ticks % 300 + ticks *= S_TO_NS / 100 + str_to_hash = f"{ticks:.0f}{TRUSTED_CLIENT_TOKEN}".encode("ascii") + cs64, sha256 = _token_hash(str_to_hash) + return f"{cs64}-{sha256}" + + +def setup_audio_service() -> None: + current_version = getattr(edge_tts.constants, "SEC_MS_GEC_VERSION", "") + if current_version.startswith("2-"): + return + + edge_tts.constants.SEC_MS_GEC_VERSION = SEC_MS_GEC_VERSION + if hasattr(edge_tts.communicate, "SEC_MS_GEC_VERSION"): + edge_tts.communicate.SEC_MS_GEC_VERSION = SEC_MS_GEC_VERSION + + if hasattr(edge_tts, "drm") and hasattr(edge_tts.drm, "DRM"): + edge_tts.drm.DRM.generate_sec_ms_gec = staticmethod(generate_sec_ms_gec_v2) + + if hasattr(edge_tts.communicate, "DRM"): + edge_tts.communicate.DRM.generate_sec_ms_gec = staticmethod(generate_sec_ms_gec_v2) diff --git a/ailab_whisperSTT.py b/ailab_whisperSTT.py index 998f226..3fa049a 100644 --- a/ailab_whisperSTT.py +++ b/ailab_whisperSTT.py @@ -1,7 +1,9 @@ +import io import os import torch import torchaudio import whisper +from whisper.utils import WriteSRT import json class WhisperSTT: @@ -32,7 +34,7 @@ class WhisperSTT: def INPUT_TYPES(s): return { "required": { - "audio": ("AUDIO",), + "audio": ("AUDIO", {"tooltip": "Input audio stream to transcribe"}), "model_size": (s.WHISPER_MODELS, { "default": "base", "tooltip": "Whisper model size - larger = more accurate but slower" @@ -44,7 +46,8 @@ class WhisperSTT: } } - RETURN_TYPES = ("STRING",) + RETURN_TYPES = ("STRING", "STRING",) + RETURN_NAMES = ("TEXT", "SRT",) FUNCTION = "stt" CATEGORY = "🧪AILab/🔊Audio" @@ -66,8 +69,12 @@ class WhisperSTT: detected_lang = result.get("language", "unknown") confidence = result.get("language_probability", 0.0) print(f"[Whisper STT] Detected: {detected_lang} (conf: {confidence:.2f})") - - return (result["text"].strip(),) + + sio = io.StringIO() + WriteSRT(".").write_result(result, sio) + srt_text = sio.getvalue().strip() + + return (result["text"].strip(), srt_text) except Exception as e: print(f"[Whisper STT] Error: {str(e)}") diff --git a/example_workflows/workflow_edgetts_tts_to_stt.jpg b/example_workflows/workflow_edgetts_tts_to_stt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e3d9f1e0efe39226fc70ffbb645b9dc447a1b9d GIT binary patch literal 118444 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 I<)0q>7x#0fa{vGU literal 0 HcmV?d00001 diff --git a/example_workflows/workflow_edgetts_tts_to_stt.json b/example_workflows/workflow_edgetts_tts_to_stt.json new file mode 100644 index 0000000..3c2c71f --- /dev/null +++ b/example_workflows/workflow_edgetts_tts_to_stt.json @@ -0,0 +1,362 @@ +{ + "id": "0f97e221-e840-4849-8fbf-b9f07bcf2a12", + "revision": 0, + "last_node_id": 7, + "last_link_id": 7, + "nodes": [ + { + "id": 1, + "type": "EdgeTTS", + "pos": [ + 120, + 150 + ], + "size": [ + 380, + 260 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "AUDIO", + "type": "AUDIO", + "slot_index": 0, + "links": [ + 3, + 5 + ] + } + ], + "properties": { + "cnr_id": "comfyui-edgetts", + "ver": "7b166c5897ad802b116352d15f227275bb5f829d", + "Node name for S&R": "EdgeTTS", + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.8", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "Hello! This is Microsoft Edge Text to Speech running in ComfyUI. We are testing audio synthesis and speech recognition with automatic SRT subtitles.", + "[English] en-US Jenny", + 1, + 0 + ], + "widgets_values_named": { + "text": "Hello! This is Microsoft Edge Text to Speech running in ComfyUI. We are testing audio synthesis and speech recognition with automatic SRT subtitles.", + "voice": "[English] en-US Jenny", + "speed": 1, + "pitch": 0 + } + }, + { + "id": 2, + "type": "Save_Audio", + "pos": [ + 890.3295245655077, + 150 + ], + "size": [ + 292.3765127144609, + 180 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "AUDIO", + "link": 4 + } + ], + "outputs": [ + { + "name": "FILEPATH", + "type": "STRING", + "links": null + }, + { + "name": "AUDIO", + "type": "AUDIO", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-edgetts", + "ver": "7b166c5897ad802b116352d15f227275bb5f829d", + "Node name for S&R": "Save_Audio", + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.8", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "", + "mp3", + "high", + false + ], + "widgets_values_named": { + "filepath": "", + "format": "mp3", + "quality": "high", + "overwrite": false + } + }, + { + "id": 4, + "type": "WhisperSTT", + "pos": [ + 539.2942229626224, + 397.2078115425857 + ], + "size": [ + 291.1443589154411, + 102 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "AUDIO", + "link": 3 + } + ], + "outputs": [ + { + "name": "TEXT", + "type": "STRING", + "links": [ + 6 + ] + }, + { + "name": "SRT", + "type": "STRING", + "links": [ + 7 + ] + } + ], + "properties": { + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + }, + "cnr_id": "comfyui-edgetts", + "ver": "7b166c5897ad802b116352d15f227275bb5f829d", + "Node name for S&R": "WhisperSTT" + }, + "widgets_values": [ + "base", + "auto" + ], + "widgets_values_named": { + "model_size": "base", + "language": "auto" + } + }, + { + "id": 5, + "type": "PreviewAudio", + "pos": [ + 542.9514251545787, + 150 + ], + "size": [ + 270, + 88 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "AUDIO", + "link": 5 + } + ], + "outputs": [ + { + "name": "audio", + "type": "AUDIO", + "links": [ + 4 + ] + } + ], + "properties": { + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + }, + "cnr_id": "comfy-core", + "ver": "0.39.1", + "Node name for S&R": "PreviewAudio" + }, + "widgets_values": [], + "widgets_values_named": {} + }, + { + "id": 6, + "type": "iToolsPreviewText", + "pos": [ + 890.3295245655077, + 397.2078115425857 + ], + "size": [ + 302.1176470588234, + 100.37646005667887 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 6 + } + ], + "outputs": [ + { + "name": "text", + "shape": 6, + "type": "STRING", + "links": null + } + ], + "properties": { + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + }, + "cnr_id": "comfyui-itools", + "ver": "a8f2fef227ca5b0cb9321c39ac7b874a906b1a5b", + "Node name for S&R": "iToolsPreviewText" + }, + "widgets_values": [ + "Hello. This is Microsoft Edge Text to speech running in Comfy UI. We are testing audio synthesis and speech recognition with automatic SRT subtitles." + ], + "widgets_values_named": { + "text2": "Hello. This is Microsoft Edge Text to speech running in Comfy UI. We are testing audio synthesis and speech recognition with automatic SRT subtitles." + } + }, + { + "id": 7, + "type": "iToolsPreviewText", + "pos": [ + 891.0197627701644, + 556.6776902033889 + ], + "size": [ + 297.97642846200984, + 208.58036056219373 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 7 + } + ], + "outputs": [ + { + "name": "text", + "shape": 6, + "type": "STRING", + "links": [] + } + ], + "properties": { + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + }, + "cnr_id": "comfyui-itools", + "ver": "a8f2fef227ca5b0cb9321c39ac7b874a906b1a5b", + "Node name for S&R": "iToolsPreviewText" + }, + "widgets_values": [ + "1\n00:00:00,000 --> 00:00:01,000\nHello.\n\n2\n00:00:01,000 --> 00:00:05,880\nThis is Microsoft Edge Text to speech running in Comfy UI.\n\n3\n00:00:05,880 --> 00:00:10,800\nWe are testing audio synthesis and speech recognition with automatic SRT subtitles." + ], + "widgets_values_named": { + "text2": "1\n00:00:00,000 --> 00:00:01,000\nHello.\n\n2\n00:00:01,000 --> 00:00:05,880\nThis is Microsoft Edge Text to speech running in Comfy UI.\n\n3\n00:00:05,880 --> 00:00:10,800\nWe are testing audio synthesis and speech recognition with automatic SRT subtitles." + } + } + ], + "links": [ + [ + 3, + 1, + 0, + 4, + 0, + "AUDIO" + ], + [ + 4, + 5, + 0, + 2, + 0, + "AUDIO" + ], + [ + 5, + 1, + 0, + 5, + 0, + "AUDIO" + ], + [ + 6, + 4, + 0, + 6, + 0, + "STRING" + ], + [ + 7, + 4, + 1, + 7, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ue_links": [], + "links_added_by_ue": [], + "ds": { + "scale": 1.1590909090909092, + "offset": [ + 42.24245340003889, + 28.257345869366866 + ] + }, + "frontendVersion": "1.53.10", + "VHS_latentpreview": false, + "VHS_latentpreviewrate": 0, + "VHS_MetadataImage": true, + "VHS_KeepIntermediate": true + }, + "version": 0.4, + "seed_widgets": {} +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index ad3e2e8..e894f51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,13 @@ [project] name = "comfyui-edgetts" description = "ComfyUI-EdgeTTS is a powerful text-to-speech node for ComfyUI, leveraging Microsoft's Edge TTS capabilities. It enables seamless conversion of text into natural-sounding speech, supporting multiple languages and voices. Ideal for enhancing user interactions, this node is easy to integrate and customize, making it perfect for various applications." -version = "1.2.2" +version = "2.0.0" license = {file = "LICENSE"} dependencies = [ "edge-tts>=7.0.0", "torchaudio", - "torchcodec==0.9", + "torchcodec>=0.9", "openai-whisper>=20231117", "numpy", "torch", diff --git a/requirements.txt b/requirements.txt index bdeb471..98a9c86 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ edge-tts>=7.0.0 torchaudio -torchcodec==0.9 +torchcodec>=0.9 openai-whisper>=20231117 numpy #mutagen>=1.47.0 # For audio metadata handling diff --git a/update.md b/update.md index 6964fdd..315c439 100644 --- a/update.md +++ b/update.md @@ -1,5 +1,26 @@ # ComfyUI-EdgeTTS Update Log +## v2.0.0 (2026/10/13) + +### Service Reliability & Protocol Update +- **Next-Gen Speech Handshake Protocol**: + - **Why We Changed It**: Upstream service protocol changes previously caused speech synthesis requests to fail with authorization rejection errors. + - **Seamless Continuity**: Fully upgraded internal connection negotiations to maintain seamless, continuous access to all Edge TTS neural voices without requiring creators to reconfigure environments or modify existing workflows. +- **Automated Fallback & Retry**: Added rapid network jitter recovery to automatically retry transient failed handshakes, preventing pipeline interruptions during batch generation. + +### Audio Decoding Resilience +- **Multi-Backend Stream Decoding**: Integrated robust audio decoding with automatic format fallbacks, eliminating runtime crashes caused by system audio codec mismatches. + +### New Features & Subtitle Generation +- **Whisper SRT Subtitle Output**: + - **Why We Added It**: Creators frequently need precise timecoded subtitles to feed into video captioning and multimodal animation workflows. + - **Dual Output**: Added a dedicated `SRT` output socket to the Whisper STT node alongside raw `TEXT`, producing clean time-synced subtitle blocks (`00:00:01,000 --> 00:00:03,500`) with zero external dependencies. + +### Node Architecture & Standardization +- **Standardized Port Casing**: Aligned all node output sockets with 1038lab standards (`AUDIO`, `FILEPATH`, `TEXT`, `SRT`) for seamless chaining across audio and video workflows. +- **Enhanced Parameter Guidance**: Added descriptive tooltips to all input controls across Edge TTS, Save Audio, and Whisper STT nodes. +- **Dynamic Node Discovery**: Upgraded internal module loader for faster startup and clean alphabetical node organization in ComfyUI menus. + ## v1.2.2 (2026/1/25) ### Dependency Compatibility Fixes