fix: Supertonic 3 compatibility across all language examples
- README Quick Start: format `duration[0]` instead of the ndarray itself
(numpy refuses `f"{ndarray:.2f}"`; matches official `dur[0]:.2f` pattern)
- py/example_pypi.py: print synthesized duration to mirror the docstring example
- Add `"na"` to AVAILABLE_LANGS / Languages.Available / availableLangs
across all 11 runtimes (Python/Node/Web/Java/C++/C#/Go/Swift/Rust/Flutter/iOS)
so the language-agnostic fallback advertised in the README actually passes
per-runtime lang validation before being sent to the v3 ONNX duration predictor
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -75,7 +75,7 @@ wav, duration = tts.synthesize(
|
|||||||
)
|
)
|
||||||
|
|
||||||
tts.save_audio(wav, "output.wav")
|
tts.save_audio(wav, "output.wav")
|
||||||
print(f"Generated {duration:.2f}s of audio")
|
print(f"Generated {duration[0]:.2f}s of audio")
|
||||||
```
|
```
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
// Available languages for multilingual TTS
|
// Available languages for multilingual TTS
|
||||||
const std::vector<std::string> AVAILABLE_LANGS = {"en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi"};
|
const std::vector<std::string> AVAILABLE_LANGS = {"en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi", "na"};
|
||||||
|
|
||||||
// Global tensor buffers for memory management
|
// Global tensor buffers for memory management
|
||||||
static std::vector<std::vector<float>> g_tensor_buffers_float;
|
static std::vector<std::vector<float>> g_tensor_buffers_float;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ namespace Supertonic
|
|||||||
// Available languages for multilingual TTS
|
// Available languages for multilingual TTS
|
||||||
public static class Languages
|
public static class Languages
|
||||||
{
|
{
|
||||||
public static readonly string[] Available = { "en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi" };
|
public static readonly string[] Available = { "en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi", "na" };
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ final logger = Logger(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Available languages for multilingual TTS
|
// Available languages for multilingual TTS
|
||||||
const List<String> availableLangs = ['en', 'ko', 'ja', 'ar', 'bg', 'cs', 'da', 'de', 'el', 'es', 'et', 'fi', 'fr', 'hi', 'hr', 'hu', 'id', 'it', 'lt', 'lv', 'nl', 'pl', 'pt', 'ro', 'ru', 'sk', 'sl', 'sv', 'tr', 'uk', 'vi'];
|
const List<String> availableLangs = ['en', 'ko', 'ja', 'ar', 'bg', 'cs', 'da', 'de', 'el', 'es', 'et', 'fi', 'fr', 'hi', 'hr', 'hu', 'id', 'it', 'lt', 'lv', 'nl', 'pl', 'pt', 'ro', 'ru', 'sk', 'sl', 'sv', 'tr', 'uk', 'vi', 'na'];
|
||||||
|
|
||||||
bool isValidLang(String lang) => availableLangs.contains(lang);
|
bool isValidLang(String lang) => availableLangs.contains(lang);
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Available languages for multilingual TTS
|
// Available languages for multilingual TTS
|
||||||
var AvailableLangs = []string{"en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi"}
|
var AvailableLangs = []string{"en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi", "na"}
|
||||||
|
|
||||||
// Config structures
|
// Config structures
|
||||||
type SpecProcessorConfig struct {
|
type SpecProcessorConfig struct {
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ final class TTSService {
|
|||||||
case tr = "tr"
|
case tr = "tr"
|
||||||
case uk = "uk"
|
case uk = "uk"
|
||||||
case vi = "vi"
|
case vi = "vi"
|
||||||
|
case na = "na"
|
||||||
|
|
||||||
var displayName: String {
|
var displayName: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .en: return "English"
|
case .en: return "English"
|
||||||
@@ -69,6 +70,7 @@ final class TTSService {
|
|||||||
case .tr: return "Turkish"
|
case .tr: return "Turkish"
|
||||||
case .uk: return "Ukrainian"
|
case .uk: return "Ukrainian"
|
||||||
case .vi: return "Vietnamese"
|
case .vi: return "Vietnamese"
|
||||||
|
case .na: return "Auto (language-agnostic)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import java.util.regex.Matcher;
|
|||||||
* Available languages for multilingual TTS
|
* Available languages for multilingual TTS
|
||||||
*/
|
*/
|
||||||
class Languages {
|
class Languages {
|
||||||
public static final List<String> AVAILABLE = Arrays.asList("en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi");
|
public static final List<String> AVAILABLE = Arrays.asList("en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi", "na");
|
||||||
|
|
||||||
public static boolean isValid(String lang) {
|
public static boolean isValid(String lang) {
|
||||||
return AVAILABLE.contains(lang);
|
return AVAILABLE.contains(lang);
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import * as ort from 'onnxruntime-node';
|
|||||||
|
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
|
||||||
const AVAILABLE_LANGS = ["en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi"];
|
const AVAILABLE_LANGS = ["en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi", "na"];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unicode text processor
|
* Unicode text processor
|
||||||
|
|||||||
@@ -13,4 +13,5 @@ wav, duration = tts.synthesize(text, voice_style=style)
|
|||||||
# duration: np.ndarray, shape = (1,)
|
# duration: np.ndarray, shape = (1,)
|
||||||
|
|
||||||
# Save to file
|
# Save to file
|
||||||
tts.save_audio(wav, "results/example_pypi.wav")
|
tts.save_audio(wav, "results/example_pypi.wav")
|
||||||
|
print(f"Generated {duration[0]:.2f}s of audio")
|
||||||
@@ -10,7 +10,7 @@ import onnxruntime as ort
|
|||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
AVAILABLE_LANGS = ["en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi"]
|
AVAILABLE_LANGS = ["en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi", "na"]
|
||||||
|
|
||||||
|
|
||||||
class UnicodeProcessor:
|
class UnicodeProcessor:
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ use rand_distr::{Distribution, Normal};
|
|||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
|
||||||
// Available languages for multilingual TTS
|
// Available languages for multilingual TTS
|
||||||
pub const AVAILABLE_LANGS: &[&str] = &["en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi"];
|
pub const AVAILABLE_LANGS: &[&str] = &["en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi", "na"];
|
||||||
|
|
||||||
pub fn is_valid_lang(lang: &str) -> bool {
|
pub fn is_valid_lang(lang: &str) -> bool {
|
||||||
AVAILABLE_LANGS.contains(&lang)
|
AVAILABLE_LANGS.contains(&lang)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import OnnxRuntimeBindings
|
|||||||
|
|
||||||
// MARK: - Available Languages
|
// MARK: - Available Languages
|
||||||
|
|
||||||
let AVAILABLE_LANGS = ["en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi"]
|
let AVAILABLE_LANGS = ["en", "ko", "ja", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hi", "hr", "hu", "id", "it", "lt", "lv", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "vi", "na"]
|
||||||
|
|
||||||
func isValidLang(_ lang: String) -> Bool {
|
func isValidLang(_ lang: String) -> Bool {
|
||||||
return AVAILABLE_LANGS.contains(lang)
|
return AVAILABLE_LANGS.contains(lang)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import * as ort from 'onnxruntime-web';
|
import * as ort from 'onnxruntime-web';
|
||||||
|
|
||||||
// Available languages for multilingual TTS
|
// Available languages for multilingual TTS
|
||||||
export const AVAILABLE_LANGS = ['en', 'ko', 'ja', 'ar', 'bg', 'cs', 'da', 'de', 'el', 'es', 'et', 'fi', 'fr', 'hi', 'hr', 'hu', 'id', 'it', 'lt', 'lv', 'nl', 'pl', 'pt', 'ro', 'ru', 'sk', 'sl', 'sv', 'tr', 'uk', 'vi'];
|
export const AVAILABLE_LANGS = ['en', 'ko', 'ja', 'ar', 'bg', 'cs', 'da', 'de', 'el', 'es', 'et', 'fi', 'fr', 'hi', 'hr', 'hu', 'id', 'it', 'lt', 'lv', 'nl', 'pl', 'pt', 'ro', 'ru', 'sk', 'sl', 'sv', 'tr', 'uk', 'vi', 'na'];
|
||||||
|
|
||||||
export function isValidLang(lang) {
|
export function isValidLang(lang) {
|
||||||
return AVAILABLE_LANGS.includes(lang);
|
return AVAILABLE_LANGS.includes(lang);
|
||||||
|
|||||||
Reference in New Issue
Block a user