Date: Fri, 15 May 2026 19:38:32 +0900
Subject: [PATCH 2/4] Fix Docs url
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 8a5f664..75446f8 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
[](https://supertonic3.github.io/)
[](https://supertonic.supertone.ai/voice_builder)
[](https://github.com/supertone-inc/supertonic-py)
-[](https://github.com/supertone-inc/supertonic-py)
+[](https://supertone-inc.github.io/supertonic-py/)
From 912c54b435276d68d41c7347c9aac5cf4f8aa4b7 Mon Sep 17 00:00:00 2001
From: fbdp1202
Date: Fri, 15 May 2026 23:22:42 +0900
Subject: [PATCH 3/4] 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)
---
README.md | 2 +-
cpp/helper.cpp | 2 +-
csharp/Helper.cs | 2 +-
flutter/lib/helper.dart | 2 +-
go/helper.go | 2 +-
ios/ExampleiOSApp/TTSService.swift | 4 +++-
java/Helper.java | 2 +-
nodejs/helper.js | 2 +-
py/example_pypi.py | 3 ++-
py/helper.py | 2 +-
rust/src/helper.rs | 2 +-
swift/Sources/Helper.swift | 2 +-
web/helper.js | 2 +-
13 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/README.md b/README.md
index 75446f8..78bb674 100644
--- a/README.md
+++ b/README.md
@@ -75,7 +75,7 @@ wav, duration = tts.synthesize(
)
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
diff --git a/cpp/helper.cpp b/cpp/helper.cpp
index 5933c9e..1545c99 100644
--- a/cpp/helper.cpp
+++ b/cpp/helper.cpp
@@ -12,7 +12,7 @@
using json = nlohmann::json;
// Available languages for multilingual TTS
-const std::vector 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 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
static std::vector> g_tensor_buffers_float;
diff --git a/csharp/Helper.cs b/csharp/Helper.cs
index 72867b9..3569ea1 100644
--- a/csharp/Helper.cs
+++ b/csharp/Helper.cs
@@ -13,7 +13,7 @@ namespace Supertonic
// Available languages for multilingual TTS
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" };
}
// ============================================================================
diff --git a/flutter/lib/helper.dart b/flutter/lib/helper.dart
index ed554b6..734380e 100644
--- a/flutter/lib/helper.dart
+++ b/flutter/lib/helper.dart
@@ -12,7 +12,7 @@ final logger = Logger(
);
// Available languages for multilingual TTS
-const List 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 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);
diff --git a/go/helper.go b/go/helper.go
index f3c1d97..f456469 100644
--- a/go/helper.go
+++ b/go/helper.go
@@ -19,7 +19,7 @@ import (
)
// 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
type SpecProcessorConfig struct {
diff --git a/ios/ExampleiOSApp/TTSService.swift b/ios/ExampleiOSApp/TTSService.swift
index 58a25b8..65c9096 100644
--- a/ios/ExampleiOSApp/TTSService.swift
+++ b/ios/ExampleiOSApp/TTSService.swift
@@ -35,7 +35,8 @@ final class TTSService {
case tr = "tr"
case uk = "uk"
case vi = "vi"
-
+ case na = "na"
+
var displayName: String {
switch self {
case .en: return "English"
@@ -69,6 +70,7 @@ final class TTSService {
case .tr: return "Turkish"
case .uk: return "Ukrainian"
case .vi: return "Vietnamese"
+ case .na: return "Auto (language-agnostic)"
}
}
}
diff --git a/java/Helper.java b/java/Helper.java
index 0f1c978..e09cbad 100644
--- a/java/Helper.java
+++ b/java/Helper.java
@@ -22,7 +22,7 @@ import java.util.regex.Matcher;
* Available languages for multilingual TTS
*/
class Languages {
- public static final List 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 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) {
return AVAILABLE.contains(lang);
diff --git a/nodejs/helper.js b/nodejs/helper.js
index 2bfedfc..a455e76 100644
--- a/nodejs/helper.js
+++ b/nodejs/helper.js
@@ -5,7 +5,7 @@ import * as ort from 'onnxruntime-node';
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
diff --git a/py/example_pypi.py b/py/example_pypi.py
index 26f091f..d1c1c6f 100644
--- a/py/example_pypi.py
+++ b/py/example_pypi.py
@@ -13,4 +13,5 @@ wav, duration = tts.synthesize(text, voice_style=style)
# duration: np.ndarray, shape = (1,)
# Save to file
-tts.save_audio(wav, "results/example_pypi.wav")
\ No newline at end of file
+tts.save_audio(wav, "results/example_pypi.wav")
+print(f"Generated {duration[0]:.2f}s of audio")
\ No newline at end of file
diff --git a/py/helper.py b/py/helper.py
index c0f12a3..ff9e4da 100644
--- a/py/helper.py
+++ b/py/helper.py
@@ -10,7 +10,7 @@ import onnxruntime as ort
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:
diff --git a/rust/src/helper.rs b/rust/src/helper.rs
index 032541f..8f3acbd 100644
--- a/rust/src/helper.rs
+++ b/rust/src/helper.rs
@@ -15,7 +15,7 @@ use rand_distr::{Distribution, Normal};
use regex::Regex;
// 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 {
AVAILABLE_LANGS.contains(&lang)
diff --git a/swift/Sources/Helper.swift b/swift/Sources/Helper.swift
index cc551ee..f9f4260 100644
--- a/swift/Sources/Helper.swift
+++ b/swift/Sources/Helper.swift
@@ -4,7 +4,7 @@ import OnnxRuntimeBindings
// 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 {
return AVAILABLE_LANGS.contains(lang)
diff --git a/web/helper.js b/web/helper.js
index 3513e8d..8e16388 100644
--- a/web/helper.js
+++ b/web/helper.js
@@ -1,7 +1,7 @@
import * as ort from 'onnxruntime-web';
// 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) {
return AVAILABLE_LANGS.includes(lang);
From 26c1f17ee12991279a082c77b9e7fb8727d3fe10 Mon Sep 17 00:00:00 2001
From: fbdp1202
Date: Fri, 15 May 2026 23:35:33 +0900
Subject: [PATCH 4/4] docs: annotate Quick Start with wav/duration shapes and
soundfile alternative
Co-Authored-By: Claude Opus 4.7 (1M context)
---
README.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/README.md b/README.md
index 78bb674..0fc05b6 100644
--- a/README.md
+++ b/README.md
@@ -73,8 +73,13 @@ wav, duration = tts.synthesize(
total_steps=8, # Quality: 5 (low) to 12 (high), default 8 (medium)
speed=1.05, # Speed: 0.7 (slow) to 2.0 (fast)
)
+# wav: numpy array of shape (1, num_samples,) with dtype=np.float32, sampled at 44100 Hz
+# duration: numpy array of shape (1,) containing the duration of the generated audio in seconds
tts.save_audio(wav, "output.wav")
+# import soundfile as sf
+# sf.write("output.wav", wav.squeeze(), 44100)
+
print(f"Generated {duration[0]:.2f}s of audio")
```