From 27b5de3e67d57bf643d27dcee01885cfa4dfda4c Mon Sep 17 00:00:00 2001 From: IgorSwat Date: Wed, 4 Mar 2026 14:02:24 +0100 Subject: [PATCH 1/4] Implement TTS incremental input streaming --- apps/speech/App.tsx | 13 +- apps/speech/screens/TextToSpeechLLMScreen.tsx | 317 ++++++++++++++++++ .../host_objects/ModelHostObject.h | 3 + .../models/text_to_speech/kokoro/Constants.h | 4 + .../models/text_to_speech/kokoro/Kokoro.cpp | 147 +++++--- .../models/text_to_speech/kokoro/Kokoro.h | 46 ++- .../models/text_to_speech/kokoro/Params.h | 11 + .../useTextToSpeech.ts | 9 +- .../TextToSpeechModule.ts | 28 +- .../react-native-executorch/src/types/tts.ts | 22 +- 10 files changed, 528 insertions(+), 72 deletions(-) create mode 100644 apps/speech/screens/TextToSpeechLLMScreen.tsx diff --git a/apps/speech/App.tsx b/apps/speech/App.tsx index ab036678e..ddbfe3c98 100644 --- a/apps/speech/App.tsx +++ b/apps/speech/App.tsx @@ -5,6 +5,7 @@ import { SpeechToTextScreen } from './screens/SpeechToTextScreen'; import ColorPalette from './colors'; import ExecutorchLogo from './assets/executorch.svg'; import { Quiz } from './screens/Quiz'; +import { TextToSpeechLLMScreen } from './screens/TextToSpeechLLMScreen'; import { initExecutorch } from 'react-native-executorch'; import { ExpoResourceFetcher } from '@react-native-executorch/expo-resource-fetcher'; @@ -14,7 +15,7 @@ initExecutorch({ export default function App() { const [currentScreen, setCurrentScreen] = useState< - 'menu' | 'speech-to-text' | 'text-to-speech' | 'quiz' + 'menu' | 'speech-to-text' | 'text-to-speech' | 'quiz' | 'text-to-speech-llm' >('menu'); const goToMenu = () => setCurrentScreen('menu'); @@ -31,6 +32,10 @@ export default function App() { return ; } + if (currentScreen === 'text-to-speech-llm') { + return ; + } + return ( @@ -54,6 +59,12 @@ export default function App() { > Text to Speech - Quiz + setCurrentScreen('text-to-speech-llm')} + > + Text to Speech - LLM Streaming + ); diff --git a/apps/speech/screens/TextToSpeechLLMScreen.tsx b/apps/speech/screens/TextToSpeechLLMScreen.tsx new file mode 100644 index 000000000..5863a6f32 --- /dev/null +++ b/apps/speech/screens/TextToSpeechLLMScreen.tsx @@ -0,0 +1,317 @@ +import React, { useEffect, useState, useRef } from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + ScrollView, +} from 'react-native'; +import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context'; +import FontAwesome from '@expo/vector-icons/FontAwesome'; +import SWMIcon from '../assets/swm_icon.svg'; +import { + useLLM, + useTextToSpeech, + KOKORO_MEDIUM, + KOKORO_VOICE_AF_HEART, + LLAMA3_2_1B_QLORA, +} from 'react-native-executorch'; +import { + AudioManager, + AudioContext, + AudioBuffer, + AudioBufferSourceNode, +} from 'react-native-audio-api'; + +interface TextToSpeechLLMProps { + onBack: () => void; +} + +/** + * Converts an audio vector (Float32Array) to an AudioBuffer for playback + * @param audioVector - The generated audio samples from the model + * @param sampleRate - The sample rate (default: 24000 Hz for Kokoro) + * @returns AudioBuffer ready for playback + */ +const createAudioBufferFromVector = ( + audioVector: Float32Array, + audioContext: AudioContext, + sampleRate: number = 24000 +): AudioBuffer => { + const audioBuffer = audioContext.createBuffer( + 1, + audioVector.length, + sampleRate + ); + const channelData = audioBuffer.getChannelData(0); + channelData.set(audioVector); + + return audioBuffer; +}; + +export const TextToSpeechLLMScreen = ({ onBack }: TextToSpeechLLMProps) => { + const [displayText, setDisplayText] = useState(''); + const [isTtsStreaming, setIsTtsStreaming] = useState(false); + const llm = useLLM({ model: LLAMA3_2_1B_QLORA }); + const tts = useTextToSpeech({ + model: KOKORO_MEDIUM, + voice: KOKORO_VOICE_AF_HEART, + }); + + const processedLengthRef = useRef(0); + const audioContextRef = useRef(null); + const sourceRef = useRef(null); + + useEffect(() => { + AudioManager.setAudioSessionOptions({ + iosCategory: 'playAndRecord', + iosMode: 'spokenAudio', + iosOptions: ['defaultToSpeaker'], + }); + + audioContextRef.current = new AudioContext({ sampleRate: 24000 }); + audioContextRef.current.suspend(); + + return () => { + audioContextRef.current?.close(); + audioContextRef.current = null; + }; + }, []); + + // Update displayText gradually as response gets generated and insert new text chunks into TTS stream + useEffect(() => { + if (llm.response && tts.isReady) { + setDisplayText(llm.response); + + const previousLength = processedLengthRef.current; + if (llm.response.length > previousLength) { + const newChunk = llm.response.slice(previousLength); + tts.streamInsert(newChunk); + processedLengthRef.current = llm.response.length; + } + } else { + processedLengthRef.current = 0; + } + }, [llm.response, tts]); + + const handleGenerate = async () => { + setDisplayText(''); + processedLengthRef.current = 0; + setIsTtsStreaming(true); + + const startTTS = async () => { + try { + const audioContext = audioContextRef.current; + if (!audioContext) return; + + if (audioContext.state === 'suspended') { + await audioContext.resume(); + } + + const onNext = async (audioVec: Float32Array) => { + return new Promise((resolve) => { + const audioBuffer = createAudioBufferFromVector( + audioVec, + audioContext, + 24000 + ); + + const source = (sourceRef.current = + audioContext.createBufferSource()); + source.buffer = audioBuffer; + source.connect(audioContext.destination); + + source.onEnded = () => resolve(); + + source.start(); + }); + }; + + await tts.stream({ + text: '', + speed: 0.9, + stopAutomatically: false, + onNext, + }); + } catch (e) { + console.error('TTS streaming error:', e); + } finally { + setIsTtsStreaming(false); + } + }; + + const ttsPromise = startTTS(); + + try { + await llm.sendMessage( + 'Generate a short story about a robot learning to paint. The story should be around 200 words long.' + ); + } catch (e) { + console.error('Generation failed:', e); + } finally { + tts.streamStop(false); + await ttsPromise; + + if ( + audioContextRef.current && + audioContextRef.current.state === 'running' + ) { + await audioContextRef.current.suspend(); + } + } + }; + + const handleStop = () => { + llm.interrupt(); + tts.streamStop(true); + }; + + const isProcessing = llm.isGenerating || isTtsStreaming; + const isModelsReady = llm.isReady && tts.isReady; + + const getModelStatus = () => { + if (llm.error) return `LLM Error: ${llm.error.message}`; + if (tts.error) return `TTS Error: ${tts.error.message}`; + if (!llm.isReady) + return `Loading LLM: ${(100 * llm.downloadProgress).toFixed(2)}%`; + if (!tts.isReady) + return `Loading TTS: ${(100 * tts.downloadProgress).toFixed(2)}%`; + if (isProcessing) return 'Generating/Streaming...'; + return 'Ready'; + }; + + return ( + + + + + + + + React Native ExecuTorch + LLM to Speech Demo + + + + Status: {getModelStatus()} + + + + Generated Story + + + + {displayText || + (isModelsReady + ? 'Press the button to generate a story and hear it spoken aloud.' + : 'Please wait for models to load...')} + + + + + + + {isProcessing ? ( + + + Stop Generation + + ) : ( + + + Generate & Stream Speech + + )} + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + backgroundColor: 'white', + paddingHorizontal: 16, + }, + header: { + alignItems: 'center', + position: 'relative', + width: '100%', + }, + backButton: { + position: 'absolute', + left: 0, + top: 10, + padding: 10, + zIndex: 1, + }, + headerText: { + fontSize: 22, + fontWeight: 'bold', + color: '#0f186e', + }, + statusContainer: { + marginTop: 12, + alignItems: 'center', + }, + contentContainer: { + width: '100%', + marginTop: 24, + flex: 1, + marginBottom: 24, + }, + label: { + marginLeft: 12, + marginBottom: 4, + color: '#0f186e', + fontWeight: '600', + }, + responseContainer: { + borderRadius: 12, + borderWidth: 1, + borderColor: '#0f186e', + flex: 1, + }, + responseContent: { + padding: 12, + }, + responseText: { + fontSize: 16, + color: '#333', + lineHeight: 24, + }, + buttonContainer: { + marginBottom: 24, + width: '100%', + }, + actionButton: { + backgroundColor: '#0f186e', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + padding: 12, + borderRadius: 12, + gap: 8, + }, + stopButton: { + backgroundColor: '#ff4444', + }, + buttonText: { + color: 'white', + fontWeight: '600', + letterSpacing: -0.5, + fontSize: 16, + }, + disabled: { + opacity: 0.5, + }, +}); diff --git a/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h b/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h index 7712b2b9d..71108a632 100644 --- a/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h +++ b/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h @@ -168,6 +168,9 @@ template class ModelHostObject : public JsiHostObject { addFunctions(JSI_EXPORT_FUNCTION(ModelHostObject, promiseHostFunction<&Model::stream>, "stream")); + addFunctions(JSI_EXPORT_FUNCTION( + ModelHostObject, synchronousHostFunction<&Model::streamInsert>, + "streamInsert")); addFunctions(JSI_EXPORT_FUNCTION( ModelHostObject, synchronousHostFunction<&Model::streamStop>, "streamStop")); diff --git a/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Constants.h b/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Constants.h index 3bc7f7f83..050fb902c 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Constants.h +++ b/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Constants.h @@ -34,6 +34,10 @@ inline constexpr int32_t kSamplingRate = 24000; // Corresponds to Kokoro's model audio frequency inline constexpr int32_t kSamplesPerMilisecond = kSamplingRate / 1000; +// Special text characters +inline const std::unordered_set kEndOfSentenceCharacters = {'.', '?', '!', + ';'}; + // Special phonemes inline const std::unordered_set kEndOfSentencePhonemes = { U'.', U'?', U'!', U';', U'…'}; diff --git a/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Kokoro.cpp b/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Kokoro.cpp index d73fb6205..7ead055f9 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Kokoro.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Kokoro.cpp @@ -6,6 +6,9 @@ #include #include #include +#include + +#include namespace rnexecutorch::models::text_to_speech::kokoro { @@ -110,13 +113,8 @@ std::vector Kokoro::generate(std::string text, float speed) { return audio; } -void Kokoro::stream(std::string text, float speed, +void Kokoro::stream(float speed, bool stopOnEmptyBuffer, std::shared_ptr callback) { - if (text.size() > params::kMaxTextSize) { - throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, - "Kokoro: maximum input text size exceeded"); - } - // Build a full callback function auto nativeCallback = [this, callback](const std::vector &audioVec) { if (this->isStreaming_) { @@ -127,60 +125,111 @@ void Kokoro::stream(std::string text, float speed, } }; - // Mark the beginning of the streaming process isStreaming_ = true; + stopOnEmptyBuffer_ = stopOnEmptyBuffer; - // G2P (Grapheme to Phoneme) conversion - auto phonemes = phonemizer_.process(text); - - // Divide the phonemes string intro substrings. - // Use specialized implementation to minimize the latency between the - // sentences. - auto subsentences = - partitioner_.divide(phonemes); - - // We follow the implementation of generate() method, but - // instead of accumulating results in a vector, we push them - // back to the JS side with the callback. - for (size_t i = 0; i < subsentences.size(); i++) { - if (!isStreaming_) { + // The outer streaming loop is responsible for handling the input buffer. + // The extracted text is then passed to the inner loop, which performs a + // standard streaming on a fixed amount of input text. + while (isStreaming_) { + if (inputTextBuffer_.empty() && stopOnEmptyBuffer_) { break; } - const auto &subsentence = subsentences[i]; - - // Determine the silent padding duration to be stripped from the edges of - // the generated audio. If a chunk ends with a space or follows one that - // did, it indicates a word boundary split – we use a shorter padding (20ms) - // to ensure natural speech flow. Otherwise, we use 50ms for standard - // pauses. - bool endsWithSpace = (subsentence.back() == U' '); - bool prevEndsWithSpace = (i > 0 && subsentences[i - 1].back() == U' '); - size_t paddingMs = endsWithSpace || prevEndsWithSpace ? 15 : 50; // [ms] - - // Generate an audio vector with the Kokoro model - auto audioPart = synthesize(subsentence, speed, paddingMs); - - // Calculate a pause between the sentences - char32_t lastPhoneme = subsentence.back(); - size_t pauseMs = params::kPauseValues.contains(lastPhoneme) - ? params::kPauseValues.at(lastPhoneme) - : params::kDefaultPause; - std::vector pause(pauseMs * constants::kSamplesPerMilisecond, 0.F); - - // Add pause to the audio vector - audioPart.insert(audioPart.end(), std::make_move_iterator(pause.begin()), - std::make_move_iterator(pause.end())); + // Try to find the most recent available end of sentence character. + size_t searchLimit = + std::min(inputTextBuffer_.size(), params::kMaxTextSize); + auto eosIt = std::find_first_of( + inputTextBuffer_.rbegin() + (inputTextBuffer_.size() - searchLimit), + inputTextBuffer_.rend(), constants::kEndOfSentenceCharacters.begin(), + constants::kEndOfSentenceCharacters.end()); + size_t chunkSize = (eosIt != inputTextBuffer_.rend()) + ? std::distance(eosIt, inputTextBuffer_.rend()) + : 0; + + // To maximize the quality of the speech, we try to avoid processing + // chunks which end in the middle of a sentence. + if (chunkSize > 0 || + streamSkippedIterations >= params::kStreamMaxSkippedIterations) { + std::string text = inputTextBuffer_.substr(0, chunkSize); + inputTextBuffer_.erase(0, chunkSize); + + // Now we proceed with a standard streaming logic for fixed-size input. + auto phonemes = phonemizer_.process(text); + + // Divide the phonemes string intro substrings. + // Use specialized implementation to minimize the latency between the + // sentences. + auto subsentences = + partitioner_.divide(phonemes); + + // We follow the implementation of generate() method, but + // instead of accumulating results in a vector, we push them + // back to the JS side with the callback. + for (size_t i = 0; i < subsentences.size(); i++) { + if (!isStreaming_) { + break; + } + + const auto &subsentence = subsentences[i]; + + // Determine the silent padding duration to be stripped from the edges + // of the generated audio. If a chunk ends with a space or follows one + // that did, it indicates a word boundary split – we use a shorter + // padding (20ms) to ensure natural speech flow. Otherwise, we use 50ms + // for standard pauses. + bool endsWithSpace = (subsentence.back() == U' '); + bool prevEndsWithSpace = (i > 0 && subsentences[i - 1].back() == U' '); + size_t paddingMs = endsWithSpace || prevEndsWithSpace ? 15 : 50; // [ms] + + // Generate an audio vector with the Kokoro model + auto audioPart = synthesize(subsentence, speed, paddingMs); + + // Calculate a pause between the sentences + char32_t lastPhoneme = subsentence.back(); + size_t pauseMs = params::kPauseValues.contains(lastPhoneme) + ? params::kPauseValues.at(lastPhoneme) + : params::kDefaultPause; + std::vector pause(pauseMs * constants::kSamplesPerMilisecond, + 0.F); + + // Add pause to the audio vector + audioPart.insert(audioPart.end(), + std::make_move_iterator(pause.begin()), + std::make_move_iterator(pause.end())); + + // Push the audio right away to the JS side + nativeCallback(audioPart); + } + + streamSkippedIterations = 0; + } else { + streamSkippedIterations++; + } - // Push the audio right away to the JS side - nativeCallback(audioPart); + // A little bit of pause to not overload the thread. + if (isStreaming_) { + std::this_thread::sleep_for( + std::chrono::milliseconds(params::kStreamPause)); + } } - // Mark the end of the streaming process + inputTextBuffer_.clear(); isStreaming_ = false; + streamSkippedIterations = 0; } -void Kokoro::streamStop() noexcept { isStreaming_ = false; } +void Kokoro::streamInsert(std::string textChunk) noexcept { + inputTextBuffer_.append(textChunk); +} + +void Kokoro::streamStop(bool instant) noexcept { + if (instant) { + isStreaming_ = false; + } else { + stopOnEmptyBuffer_ = true; + } +} std::vector Kokoro::synthesize(const std::u32string &phonemes, float speed, size_t paddingMs) { diff --git a/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Kokoro.h b/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Kokoro.h index f27ba8018..b7091310c 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Kokoro.h +++ b/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Kokoro.h @@ -24,25 +24,50 @@ class Kokoro { const std::string &synthesizerSource, const std::string &voiceSource, std::shared_ptr callInvoker); - // Processes the entire text at once, before sending back to the JS side. + /** + * Processes the entire text at once, before sending back to the JS side. + * + * @param text An input text to be processed. + * @param speed Determines the speed of generated speech. Passed directly to + * the Kokoro model. + */ std::vector generate(std::string text, float speed = 1.F); - // Processes text in chunks, sending each chunk individualy to the JS side - // with asynchronous callbacks. - void stream(std::string text, float speed, + /** + * Processes text from inputTextBuffer_ in chunks, sending each chunk + * individualy to the JS side with asynchronous callbacks. + * + * @param speed Determines the speed of generated speech. Passed directly to + * the Kokoro model. + * @param stopOnEmptyBuffer If true, the streaming ends automatically when the + * input buffer is empty. + * @param callback A callback to the JS side. + */ + void stream(float speed, bool stopOnEmptyBuffer, std::shared_ptr callback); - // Stops the streaming process - void streamStop() noexcept; + /** + * Updates the input streaming buffer by adding more text to be processed. + * + * @param text A new chunk of text, appended to the end of the input buffer. + */ + void streamInsert(std::string textChunk) noexcept; + + /** + * Stops the streaming process. + * + * @param instant If true, stops the streaming as soon as possible by + * switching the isStreaming_ flag. Otherwise allows to process the rest of + * the buffer first, by switching the stopOnEmptyBuffer_ flag. + */ + void streamStop(bool instant) noexcept; std::size_t getMemoryLowerBound() const noexcept; void unload() noexcept; private: - // Helper function - loading voice array void loadVoice(const std::string &voiceSource); - // Helper function - generate specialization for given input size std::vector synthesize(const std::u32string &phonemes, float speed, size_t paddingMs = 50); @@ -65,8 +90,11 @@ class Kokoro { constants::kMaxInputTokens> voice_; - // Extra control variables + // Streaming state control variables + std::string inputTextBuffer_ = ""; bool isStreaming_ = false; + bool stopOnEmptyBuffer_ = true; + int32_t streamSkippedIterations = 0; }; } // namespace models::text_to_speech::kokoro diff --git a/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Params.h b/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Params.h index f6b910b03..f517db031 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Params.h +++ b/packages/react-native-executorch/common/rnexecutorch/models/text_to_speech/kokoro/Params.h @@ -20,6 +20,17 @@ namespace rnexecutorch::models::text_to_speech::kokoro::params { */ inline constexpr size_t kMaxTextSize = 2048; +/** + * A number of skipped streaming iterations after which we process the remaining + * input no matter how it looks like. + */ +inline constexpr int32_t kStreamMaxSkippedIterations = 3; + +/** + * A size of pause (in miliseconds) applied after each streaming iteration. + */ +inline constexpr int32_t kStreamPause = 200; + /** * A set of punctation - pause values. Determines how much pause (silence) is * being added at the end of each calculated audio vector. This is primarly used diff --git a/packages/react-native-executorch/src/hooks/natural_language_processing/useTextToSpeech.ts b/packages/react-native-executorch/src/hooks/natural_language_processing/useTextToSpeech.ts index b29b4bc8d..19d1645f2 100644 --- a/packages/react-native-executorch/src/hooks/natural_language_processing/useTextToSpeech.ts +++ b/packages/react-native-executorch/src/hooks/natural_language_processing/useTextToSpeech.ts @@ -95,10 +95,14 @@ export const useTextToSpeech = ({ ); setIsGenerating(true); try { + if (input.text) { + moduleInstance.streamInsert(input.text); + } + await input.onBegin?.(); for await (const audio of moduleInstance.stream({ - text: input.text, speed: input.speed ?? 1.0, + stopAutomatically: input.stopAutomatically ?? true, })) { if (input.onNext) { await input.onNext(audio); @@ -118,7 +122,8 @@ export const useTextToSpeech = ({ isGenerating, forward, stream, - streamStop: moduleInstance.streamStop, + streamInsert: (text: string) => moduleInstance.streamInsert(text), + streamStop: (instant: boolean = true) => moduleInstance.streamStop(instant), downloadProgress, }; }; diff --git a/packages/react-native-executorch/src/modules/natural_language_processing/TextToSpeechModule.ts b/packages/react-native-executorch/src/modules/natural_language_processing/TextToSpeechModule.ts index 849c25676..0f33f7839 100644 --- a/packages/react-native-executorch/src/modules/natural_language_processing/TextToSpeechModule.ts +++ b/packages/react-native-executorch/src/modules/natural_language_processing/TextToSpeechModule.ts @@ -125,8 +125,8 @@ export class TextToSpeechModule { * @returns An async generator yielding Float32Array audio chunks. */ public async *stream({ - text, speed, + stopAutomatically, }: TextToSpeechStreamingInput): AsyncGenerator { // Stores computed audio segments const queue: Float32Array[] = []; @@ -142,10 +142,14 @@ export class TextToSpeechModule { (async () => { try { - await this.nativeModule.stream(text, speed, (audio: number[]) => { - queue.push(new Float32Array(audio)); - wake(); - }); + await this.nativeModule.stream( + speed, + stopAutomatically, + (audio: number[]) => { + queue.push(new Float32Array(audio)); + wake(); + } + ); finished = true; wake(); } catch (e) { @@ -169,11 +173,21 @@ export class TextToSpeechModule { } } + /** + * Inserts new text chunk into the buffer to be processed in streaming mode. + */ + public streamInsert(textChunk: string): void { + this.nativeModule.streamInsert(textChunk); + } + /** * Stops the streaming process if there is any ongoing. + * + * * @param instant If true, stops the streaming as soon as possible. Otherwise + * allows the module to complete processing for the remains of the buffer. */ - public streamStop(): void { - this.nativeModule.streamStop(); + public streamStop(instant: boolean = true): void { + this.nativeModule.streamStop(instant); } /** diff --git a/packages/react-native-executorch/src/types/tts.ts b/packages/react-native-executorch/src/types/tts.ts index 55937be49..efe4e111f 100644 --- a/packages/react-native-executorch/src/types/tts.ts +++ b/packages/react-native-executorch/src/types/tts.ts @@ -134,10 +134,18 @@ export interface TextToSpeechType { */ stream: (input: TextToSpeechStreamingInput) => Promise; + /** + * Inserts new text chunk into the buffer to be processed in streaming mode. + */ + streamInsert: (textChunk: string) => void; + /** * Interrupts and stops the currently active audio generation stream. + * + * @param instant If true, stops the streaming as soon as possible. Otherwise + * allows the module to complete processing for the remains of the buffer. */ - streamStop: () => void; + streamStop: (instant?: boolean) => void; } /** @@ -149,11 +157,17 @@ export interface TextToSpeechType { * Callbacks can be both synchronous or asynchronous. * * @category Types - * @property {() => void | Promise} [onBegin] - Called when streaming begins + * @property {string} [text] - Initial text to be spoken. The streaming input buffer is initially filled with this value. + * @property {number} [speed] - Optional speed argument; higher values increase the speech rate. + * @property {boolean} [stopAutomatically] - If true, streaming will stop automatically when the buffer is empty. + * @property {() => void | Promise} [onBegin] - Called when streaming begins. * @property {(audio: Float32Array) => void | Promise} [onNext] - Called after each audio chunk gets calculated. - * @property {() => void | Promise} [onEnd] - Called when streaming ends + * @property {() => void | Promise} [onEnd] - Called when streaming ends. */ -export interface TextToSpeechStreamingInput extends TextToSpeechInput { +export interface TextToSpeechStreamingInput { + text?: string; + speed?: number; + stopAutomatically?: boolean; onBegin?: () => void | Promise; onNext?: (audio: Float32Array) => void | Promise; onEnd?: () => void | Promise; From 994efcc5320abda8c6b17e3a74d04fa554d97aa2 Mon Sep 17 00:00:00 2001 From: IgorSwat Date: Wed, 4 Mar 2026 17:50:07 +0100 Subject: [PATCH 2/4] Fix stopping the streaming --- apps/speech/screens/TextToSpeechLLMScreen.tsx | 7 +++++++ .../TextToSpeechModule.ts | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/apps/speech/screens/TextToSpeechLLMScreen.tsx b/apps/speech/screens/TextToSpeechLLMScreen.tsx index 5863a6f32..73df0f299 100644 --- a/apps/speech/screens/TextToSpeechLLMScreen.tsx +++ b/apps/speech/screens/TextToSpeechLLMScreen.tsx @@ -164,6 +164,13 @@ export const TextToSpeechLLMScreen = ({ onBack }: TextToSpeechLLMProps) => { const handleStop = () => { llm.interrupt(); tts.streamStop(true); + if (sourceRef.current) { + try { + sourceRef.current.stop(); + } catch (e) { + // Source might have already stopped or disconnected + } + } }; const isProcessing = llm.isGenerating || isTtsStreaming; diff --git a/packages/react-native-executorch/src/modules/natural_language_processing/TextToSpeechModule.ts b/packages/react-native-executorch/src/modules/natural_language_processing/TextToSpeechModule.ts index 0f33f7839..bbc36bdad 100644 --- a/packages/react-native-executorch/src/modules/natural_language_processing/TextToSpeechModule.ts +++ b/packages/react-native-executorch/src/modules/natural_language_processing/TextToSpeechModule.ts @@ -15,11 +15,10 @@ import { Logger } from '../../common/Logger'; * @category Typescript API */ export class TextToSpeechModule { - /** - * Native module instance - */ nativeModule: any = null; + streamFinished: boolean = false; + /** * Loads the model and voice assets specified by the config object. * `onDownloadProgressCallback` allows you to monitor the current progress. @@ -132,9 +131,10 @@ export class TextToSpeechModule { const queue: Float32Array[] = []; let waiter: (() => void) | null = null; - let finished = false; let error: unknown; + this.streamFinished = false; + const wake = () => { waiter?.(); waiter = null; @@ -150,25 +150,25 @@ export class TextToSpeechModule { wake(); } ); - finished = true; + this.streamFinished = true; wake(); } catch (e) { error = e; - finished = true; + this.streamFinished = true; wake(); } })(); - while (true) { + while (!this.streamFinished) { if (queue.length > 0) { yield queue.shift()!; - if (finished && queue.length === 0) { + if (this.streamFinished && queue.length === 0) { return; } continue; } if (error) throw error; - if (finished) return; + if (this.streamFinished) return; await new Promise((r) => (waiter = r)); } } @@ -188,6 +188,7 @@ export class TextToSpeechModule { */ public streamStop(instant: boolean = true): void { this.nativeModule.streamStop(instant); + this.streamFinished = true; } /** From cf6fb84f927f0579a7e745a047788e1297631b22 Mon Sep 17 00:00:00 2001 From: IgorSwat Date: Wed, 4 Mar 2026 20:56:11 +0100 Subject: [PATCH 3/4] Add simple T2S test cases --- .../common/rnexecutorch/tests/CMakeLists.txt | 17 ++- .../tests/integration/TextToSpeechTest.cpp | 123 ++++++++++++++++++ .../tests/integration/assets/test_speech.raw | Bin 0 -> 147904 bytes .../common/rnexecutorch/tests/run_tests.sh | 7 + 4 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 packages/react-native-executorch/common/rnexecutorch/tests/integration/TextToSpeechTest.cpp create mode 100644 packages/react-native-executorch/common/rnexecutorch/tests/integration/assets/test_speech.raw diff --git a/packages/react-native-executorch/common/rnexecutorch/tests/CMakeLists.txt b/packages/react-native-executorch/common/rnexecutorch/tests/CMakeLists.txt index c45ab9107..62842b517 100644 --- a/packages/react-native-executorch/common/rnexecutorch/tests/CMakeLists.txt +++ b/packages/react-native-executorch/common/rnexecutorch/tests/CMakeLists.txt @@ -63,7 +63,6 @@ elseif(ANDROID_ABI STREQUAL "x86_64") set(OPENCV_THIRD_PARTY_LIBS "") endif() - add_library(opencv_deps INTERFACE) target_link_libraries(opencv_deps INTERFACE ${OPENCV_LIBS_DIR}/libopencv_core.a @@ -84,6 +83,12 @@ target_link_options(opencv_deps INTERFACE -fopenmp -static-openmp) add_library(tokenizers_deps INTERFACE) target_include_directories(tokenizers_deps INTERFACE "${TOKENIZERS_DIR}") +# Phonemis +set(LIBS_DIR "${PACKAGE_ROOT}/third-party/android/libs") +set(PHONEMIS_LIBS + "${LIBS_DIR}/phonemis/${ANDROID_ABI}/libphonemis.a" +) + # Source Definitions set(CORE_SOURCES ${RNEXECUTORCH_DIR}/models/BaseModel.cpp @@ -261,3 +266,13 @@ add_rn_test(VerticalOCRTests integration/VerticalOCRTest.cpp ${IMAGE_UTILS_SOURCES} LIBS opencv_deps ) + +add_rn_test(TextToSpeechTests integration/TextToSpeechTest.cpp + SOURCES + ${RNEXECUTORCH_DIR}/models/text_to_speech/kokoro/Kokoro.cpp + ${RNEXECUTORCH_DIR}/models/text_to_speech/kokoro/DurationPredictor.cpp + ${RNEXECUTORCH_DIR}/models/text_to_speech/kokoro/Synthesizer.cpp + ${RNEXECUTORCH_DIR}/models/text_to_speech/kokoro/Partitioner.cpp + ${RNEXECUTORCH_DIR}/models/text_to_speech/kokoro/Utils.cpp + LIBS ${PHONEMIS_LIBS} +) diff --git a/packages/react-native-executorch/common/rnexecutorch/tests/integration/TextToSpeechTest.cpp b/packages/react-native-executorch/common/rnexecutorch/tests/integration/TextToSpeechTest.cpp new file mode 100644 index 000000000..997de11bb --- /dev/null +++ b/packages/react-native-executorch/common/rnexecutorch/tests/integration/TextToSpeechTest.cpp @@ -0,0 +1,123 @@ +#include "BaseModelTests.h" +#include "utils/TestUtils.h" +#include +#include +#include + +using namespace rnexecutorch; +using namespace rnexecutorch::models::text_to_speech::kokoro; + +constexpr auto kValidLang = "en-us"; +constexpr auto kValidTaggerPath = "kokoro_en_tagger.json"; +constexpr auto kValidPhonemizerPath = "kokoro_us_lexicon.json"; +constexpr auto kValidDurationPath = "kokoro_duration_predictor.pte"; +constexpr auto kValidSynthesizerPath = "kokoro_synthesizer.pte"; +constexpr auto kValidVoicePath = "kokoro_af_heart.bin"; + +namespace { +bool isAudioValid(const std::vector &audio) { + if (audio.empty()) + return false; + // Check for non-silence (amplitude greater than an arbitrary small noise + // threshold) + for (float sample : audio) { + if (std::abs(sample) > 1e-4f) { + return true; + } + } + return false; +} + +bool isAudioSimilar(const std::vector &audio1, + const std::vector &audio2, float tolerance = 0.1f) { + if (audio1.empty() || audio2.empty()) + return false; + + double sumSqDiff = 0; + size_t steps = std::max(audio1.size(), audio2.size()); + + for (size_t i = 0; i < steps; ++i) { + float idx1 = (static_cast(i) / steps) * audio1.size(); + float idx2 = (static_cast(i) / steps) * audio2.size(); + + float diff = + audio1[static_cast(idx1)] - audio2[static_cast(idx2)]; + sumSqDiff += diff * diff; + } + + double rmse = std::sqrt(sumSqDiff / steps); + if (rmse >= tolerance) { + std::cerr << "Audio structural RMSE difference: " << rmse + << " (tolerance: " << tolerance << ")" << std::endl; + return false; + } + return true; +} + +class KokoroTest : public ::testing::Test { +protected: + void SetUp() override { + try { + model_ = std::make_unique( + kValidLang, kValidTaggerPath, kValidPhonemizerPath, + kValidDurationPath, kValidSynthesizerPath, kValidVoicePath, nullptr); + } catch (...) { + model_ = nullptr; + } + } + + std::unique_ptr model_; +}; +} // namespace + +TEST(TTSCtorTests, InvalidVoicePathThrows) { + EXPECT_THROW(Kokoro(kValidLang, kValidTaggerPath, kValidPhonemizerPath, + kValidDurationPath, kValidSynthesizerPath, + "nonexistent_voice.bin", nullptr), + RnExecutorchError); +} + +TEST_F(KokoroTest, MaxTextSizeExceededThrows) { + if (!model_) { + GTEST_SKIP() << "Model assets not available, skipping test."; + } + std::string hugeText(10000, 'A'); // beyond params::kMaxTextSize + EXPECT_THROW(model_->generate(hugeText, 1.0f), RnExecutorchError); +} + +TEST_F(KokoroTest, EmptyStringReturnsEmptyVector) { + if (!model_) { + GTEST_SKIP() << "Model assets not available, skipping test."; + } + auto result = model_->generate("", 1.0f); + EXPECT_TRUE(result.empty()); +} + +TEST_F(KokoroTest, GenerateReturnsValidAudio) { + if (!model_) { + GTEST_SKIP() << "Model assets not available, skipping test."; + } + auto result = model_->generate("Hello world! How are you doing?", 1.0f); + auto reference = test_utils::loadAudioFromFile("test_speech.raw"); + + ASSERT_FALSE(reference.empty()) + << "Reference audio 'test_speech.raw' not found."; + + // Compare against an audio waveform obtained from the original + // Kokoro model (PyTorch) + EXPECT_TRUE(isAudioSimilar(result, reference)); +} + +TEST_F(KokoroTest, GenerateSpeedAdjustsAudioLength) { + if (!model_) { + GTEST_SKIP() << "Model assets not available, skipping test."; + } + std::string text = "This is a sentence to test the speed modifications."; + auto resultNormal = model_->generate(text, 1.0f); + auto resultFast = model_->generate(text, 1.5f); + + EXPECT_TRUE(isAudioValid(resultNormal)); + EXPECT_TRUE(isAudioValid(resultFast)); + // Fast speech should result in a noticeably shorter output waveform + EXPECT_LT(resultFast.size(), resultNormal.size()); +} diff --git a/packages/react-native-executorch/common/rnexecutorch/tests/integration/assets/test_speech.raw b/packages/react-native-executorch/common/rnexecutorch/tests/integration/assets/test_speech.raw new file mode 100644 index 0000000000000000000000000000000000000000..2cf55af04ffe774a2b14b9f6d7fbd4e632bcaa6e GIT binary patch literal 147904 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

9Y>c-&Slvb;laX*LF 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� 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 o`rukndb9$BN@nnMvKg$NO Date: Thu, 5 Mar 2026 09:41:01 +0100 Subject: [PATCH 4/4] Update T2S docs --- .../01-natural-language-processing/useTextToSpeech.md | 9 ++++++--- .../01-natural-language-processing/TextToSpeechModule.md | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/docs/03-hooks/01-natural-language-processing/useTextToSpeech.md b/docs/docs/03-hooks/01-natural-language-processing/useTextToSpeech.md index b52726c9e..8bd1d07e2 100644 --- a/docs/docs/03-hooks/01-natural-language-processing/useTextToSpeech.md +++ b/docs/docs/03-hooks/01-natural-language-processing/useTextToSpeech.md @@ -90,8 +90,8 @@ The module provides two ways to generate speech: Since it processes the entire text at once, it might take a significant amount of time to produce an audio for long text inputs. ::: -2. [**`stream({ text, speed })`**](../../06-api-reference/interfaces/TextToSpeechType.md#stream): An async generator that yields chunks of audio as they are computed. - This is ideal for reducing the "time to first audio" for long sentences. +2. [**`stream(input)`**](../../06-api-reference/interfaces/TextToSpeechType.md#stream): An async generator-like functionality (managed via callbacks like `onNext`) that yields chunks of audio as they are computed. + This is ideal for reducing the "time to first audio" for long sentences. You can also dynamically insert text during the generation process using `streamInsert(text)` and stop it with `streamStop(instant)`. ## Example @@ -160,8 +160,11 @@ export default function App() { const generateStream = async () => { const ctx = contextRef.current; + // Instead of using streamInsert() directly, we can pass initial text to the stream() method await tts.stream({ - text: "This is a longer text, which is being streamed chunk by chunk. Let's see how it works!", + text: "This is an initial text, which is being streamed chunk by chunk. Let's see how it works!", + onBegin: async () => console.log('Started streaming'), + onEnd: async () => console.log('Finished streaming'), onNext: async (chunk) => { return new Promise((resolve) => { const buffer = ctx.createBuffer(1, chunk.length, 24000); diff --git a/docs/docs/04-typescript-api/01-natural-language-processing/TextToSpeechModule.md b/docs/docs/04-typescript-api/01-natural-language-processing/TextToSpeechModule.md index bc297ecf4..5f2a66617 100644 --- a/docs/docs/04-typescript-api/01-natural-language-processing/TextToSpeechModule.md +++ b/docs/docs/04-typescript-api/01-natural-language-processing/TextToSpeechModule.md @@ -61,7 +61,7 @@ The module provides two ways to generate speech: Since it processes the entire text at once, it might take a significant amount of time to produce an audio for long text inputs. ::: -2. [**`stream({ text, speed })`**](../../06-api-reference/classes/TextToSpeechModule.md#stream): An async generator that yields chunks of audio as they are computed. This is ideal for reducing the "time to first audio" for long sentences. +2. [**`stream({ speed, stopAutomatically })`**](../../06-api-reference/classes/TextToSpeechModule.md#stream): An async generator that yields chunks of audio as they are computed. This is ideal for reducing the "time to first audio" for long sentences. In contrast to `forward`, it enables inserting text chunks dynamically into processing buffer with [**`streamInsert(text)`**](../../06-api-reference/classes/TextToSpeechModule.md#streaminsert) and allows stopping generation early with [**`streamStop(instant)`**](../../06-api-reference/classes/TextToSpeechModule.md#streamstop). ## Example @@ -115,9 +115,12 @@ const audioContext = new AudioContext({ sampleRate: 24000 }); await tts.load({ model: KOKORO_MEDIUM, voice: KOKORO_VOICE_AF_HEART }); try { + // Pre-load the first chunk of text to the buffer + tts.streamInsert('This is a streaming test, with a sample input.'); + for await (const chunk of tts.stream({ - text: 'This is a streaming test, with a sample input.', speed: 1.0, + stopAutomatically: true, // Will stop the stream automatically after clearing the input buffer })) { // Play each chunk sequentially await new Promise((resolve) => {