From bf9a964e9dfeb82189432bc457ab6c3bd15a9deb Mon Sep 17 00:00:00 2001 From: Dewan Shakil Date: Tue, 2 Jun 2026 20:41:28 +0530 Subject: [PATCH] Refresh React Native example app UI --- examples/BareRNExample/App.tsx | 627 +++++++++++------- .../BareRNExample/assets/kittenml_logo.png | Bin 0 -> 35327 bytes examples/ExpoExample/App.tsx | 570 ++++++++++------ examples/ExpoExample/assets/kittenml_logo.png | Bin 0 -> 35327 bytes examples/ExpoWordTimingsExample/App.tsx | 480 +++++++++----- .../assets/kittenml_logo.png | Bin 0 -> 35327 bytes examples/OfflineBundledAssetsExample/App.tsx | 373 ++++++++--- .../assets/kittenml_logo.png | Bin 0 -> 35327 bytes 8 files changed, 1346 insertions(+), 704 deletions(-) create mode 100644 examples/BareRNExample/assets/kittenml_logo.png create mode 100644 examples/ExpoExample/assets/kittenml_logo.png create mode 100644 examples/ExpoWordTimingsExample/assets/kittenml_logo.png create mode 100644 examples/OfflineBundledAssetsExample/assets/kittenml_logo.png diff --git a/examples/BareRNExample/App.tsx b/examples/BareRNExample/App.tsx index f68d6eb..63286d9 100644 --- a/examples/BareRNExample/App.tsx +++ b/examples/BareRNExample/App.tsx @@ -1,5 +1,6 @@ import React, {useState, useCallback, useEffect, useRef} from 'react'; import { + Image, SafeAreaView, ScrollView, View, @@ -22,6 +23,8 @@ import { createRNSoundPlayer, } from '@kittentts/react-native'; +const LOGO = require('./assets/kittenml_logo.png'); + type AppState = | {kind: 'idle'} | {kind: 'preparing'} @@ -58,43 +61,43 @@ export default function App() { state.kind === 'generating' || state.kind === 'playing'; - const initTTS = useCallback( - async (model: KittenModel) => { - try { - await ttsRef.current?.dispose(); - setState({kind: 'preparing'}); - setResult(null); - - const instance = await KittenTTS.create( - {model, player: createRNSoundPlayer(Sound)}, - (progress, info) => { - if (mountedRef.current && info?.stage === 'downloading') { - setState({ - kind: 'downloading', - progress, - }); - } - }, - ); - - if (!mountedRef.current) { - if (!__DEV__) await instance.dispose(); - return; - } - - ttsRef.current = instance; - setTts(instance); - setState({kind: 'idle'}); - } catch (error: unknown) { - ttsRef.current = null; - if (mountedRef.current) { - setTts(null); - setState({kind: 'error', message: getErrorMessage(error, 'Init failed')}); - } + const initTTS = useCallback(async (model: KittenModel) => { + try { + await ttsRef.current?.dispose(); + setState({kind: 'preparing'}); + setResult(null); + + const instance = await KittenTTS.create( + {model, player: createRNSoundPlayer(Sound)}, + (progress, info) => { + if (mountedRef.current && info?.stage === 'downloading') { + setState({ + kind: 'downloading', + progress, + }); + } + }, + ); + + if (!mountedRef.current) { + if (!__DEV__) await instance.dispose(); + return; } - }, - [], - ); + + ttsRef.current = instance; + setTts(instance); + setState({kind: 'idle'}); + } catch (error: unknown) { + ttsRef.current = null; + if (mountedRef.current) { + setTts(null); + setState({ + kind: 'error', + message: getErrorMessage(error, 'Init failed'), + }); + } + } + }, []); useEffect(() => { mountedRef.current = true; @@ -121,7 +124,10 @@ export default function App() { setResult(res); setState({kind: 'idle'}); } catch (error: unknown) { - setState({kind: 'error', message: getErrorMessage(error, 'Generation failed')}); + setState({ + kind: 'error', + message: getErrorMessage(error, 'Generation failed'), + }); } }, [tts, inputText, selectedVoice, selectedSpeed]); @@ -135,7 +141,10 @@ export default function App() { setResult(res); setState({kind: 'idle'}); } catch (error: unknown) { - setState({kind: 'error', message: getErrorMessage(error, 'Playback failed')}); + setState({ + kind: 'error', + message: getErrorMessage(error, 'Playback failed'), + }); } }, [tts, inputText, selectedVoice, selectedSpeed]); @@ -150,128 +159,111 @@ export default function App() { return ( - KittenTTS - On-Device Text-to-Speech - - - - {/* Text Input */} - - Text - + + + + + + KittenTTS Example + + Bare React Native example of the React Native SDK for KittenTTS + + - {/* Model Picker */} - - Model - - {MODELS.map(model => ( - handleModelChange(model)} - disabled={isWorking}> - - {modelDisplayName(model)} - - - ))} + + + + Model + + {statusSummary(state)} + + + + + {modelDisplayName(selectedModel)} + + + + + + Text + - - {/* Voice Picker */} - - Voice - - {ALL_VOICES.map(voice => ( + + + + + + + + Playback + setSelectedVoice(voice)} - disabled={isWorking}> - - {voiceDisplayName(voice)} - + onPress={handleGenerate} + disabled={isWorking || !inputText.trim() || !tts}> + Generate - ))} - - - {/* Speed Picker */} - - Speed: {selectedSpeed.toFixed(1)}x - - {SPEED_OPTIONS.map(speed => ( setSelectedSpeed(speed)} - disabled={isWorking}> - - {speed.toFixed(1)}x + onPress={handleSpeak} + disabled={isWorking || !inputText.trim() || !tts}> + + Speak - ))} + - - {/* Action Buttons */} - - - Generate - - - - Speak - - + + + + This system is for demonstration purposes only and is not intended + to process sensitive or personal data. + - {/* Result Card */} - {result && } + {result && } + ); @@ -281,6 +273,70 @@ function getErrorMessage(error: unknown, fallback: string): string { return error instanceof Error ? error.message : fallback; } +function OptionGroup({ + label, + values, + selected, + disabled, + getLabel, + onSelect, +}: { + label: string; + values: readonly T[]; + selected: T; + disabled: boolean; + getLabel: (value: T) => string; + onSelect: (value: T) => void; +}) { + return ( + + {label} + + {values.map(value => { + const active = value === selected; + return ( + onSelect(value)}> + + {getLabel(value)} + + + ); + })} + + + ); +} + +function statusSummary(state: AppState): string { + switch (state.kind) { + case 'idle': + return 'Ready'; + case 'preparing': + return 'Preparing'; + case 'downloading': + return `${Math.round(state.progress * 100)}%`; + case 'generating': + return 'Generating'; + case 'playing': + return 'Playing'; + case 'error': + return 'Error'; + } +} + +function speedLabel(speed: number) { + return `${speed.toFixed(2).replace(/0$/, '')}x`; +} + function StatusBanner({state}: {state: AppState}) { switch (state.kind) { case 'idle': @@ -288,31 +344,33 @@ function StatusBanner({state}: {state: AppState}) { case 'preparing': return ( - - Preparing model... + + + Preparing model and phonemizer... + ); case 'downloading': return ( - + - Downloading model... {Math.round(state.progress * 100)}% + Downloading ({Math.round(state.progress * 100)}%) ); case 'generating': return ( - - Generating speech... + + Generating audio... ); case 'playing': return ( - - Playing... + + Playing audio... ); case 'error': @@ -330,9 +388,7 @@ function ResultCard({result}: {result: KittenTTSResult}) { Generated Audio Voice - - {voiceDisplayName(result.voice)} - + {voiceDisplayName(result.voice)} Duration @@ -357,167 +413,248 @@ function ResultCard({result}: {result: KittenTTSResult}) { const styles = StyleSheet.create({ container: { flex: 1, - backgroundColor: '#F2F2F7', + backgroundColor: '#FAFAFA', }, content: { - padding: 20, + alignSelf: 'center', + maxWidth: 430, + width: '100%', + paddingHorizontal: 16, + paddingTop: 24, paddingBottom: 40, }, - title: { - fontSize: 28, - fontWeight: '700', - color: '#000', - textAlign: 'center', - }, - subtitle: { - fontSize: 14, - color: '#666', - textAlign: 'center', + header: { + flexDirection: 'row', + alignItems: 'flex-start', marginBottom: 20, }, - section: { - marginBottom: 16, + logoMark: { + alignItems: 'center', + borderRadius: 8, + height: 48, + justifyContent: 'center', + marginRight: 12, + overflow: 'hidden', + width: 48, }, - label: { - fontSize: 13, - fontWeight: '600', - color: '#666', - marginBottom: 6, - textTransform: 'uppercase', - letterSpacing: 0.5, + logoImage: { + height: 48, + width: 48, }, - textInput: { - backgroundColor: '#FFF', - borderRadius: 12, - padding: 14, + headerCopy: { + flex: 1, + }, + title: { + fontSize: 30, + fontWeight: '700', + color: '#09090B', + lineHeight: 32, + }, + subtitle: { fontSize: 16, - color: '#000', - minHeight: 100, - textAlignVertical: 'top', + color: '#71717A', + lineHeight: 22, + marginTop: 6, + }, + demoCard: { + backgroundColor: '#FFFFFF', + borderColor: '#E4E4E7', + borderRadius: 8, + borderWidth: 1, + padding: 16, ...Platform.select({ ios: { shadowColor: '#000', shadowOffset: {width: 0, height: 1}, - shadowOpacity: 0.05, - shadowRadius: 3, + shadowOpacity: 0.04, + shadowRadius: 2, }, android: { elevation: 1, }, }), }, + modelRow: { + alignItems: 'center', + flexDirection: 'row', + justifyContent: 'space-between', + marginBottom: 18, + }, + modelRowLeft: { + alignItems: 'center', + flexDirection: 'row', + flexShrink: 1, + gap: 8, + }, + modelRowLabel: { + color: '#09090B', + fontSize: 14, + fontWeight: '600', + }, + pill: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + paddingHorizontal: 9, + paddingVertical: 4, + }, + pillText: { + color: '#52525B', + fontSize: 12, + fontWeight: '700', + }, + softBadge: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + flexShrink: 1, + paddingHorizontal: 10, + paddingVertical: 6, + }, + softBadgeText: { + color: '#09090B', + fontSize: 13, + fontWeight: '700', + }, + section: { + marginBottom: 18, + }, + label: { + color: '#52525B', + fontSize: 12, + fontWeight: '700', + letterSpacing: 0, + marginBottom: 8, + }, + textInput: { + backgroundColor: '#FFFFFF', + borderColor: '#E4E4E7', + borderRadius: 8, + borderWidth: 1, + color: '#09090B', + fontSize: 15, + lineHeight: 22, + minHeight: 122, + padding: 12, + textAlignVertical: 'top', + }, chipRow: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, }, chip: { - paddingHorizontal: 14, - paddingVertical: 8, - borderRadius: 20, - backgroundColor: '#FFF', - borderWidth: 1, - borderColor: '#E0E0E0', + backgroundColor: '#F4F4F5', + borderRadius: 8, + justifyContent: 'center', + minHeight: 38, + paddingHorizontal: 12, }, chipSelected: { - backgroundColor: '#007AFF', - borderColor: '#007AFF', + backgroundColor: '#D4D4D8', }, chipText: { - fontSize: 13, - fontWeight: '500', - color: '#333', + color: '#52525B', + fontSize: 14, + fontWeight: '600', }, chipTextSelected: { - color: '#FFF', + color: '#09090B', + }, + actionGroup: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + marginTop: 2, + padding: 10, + }, + actionGroupLabel: { + color: '#52525B', + fontSize: 12, + fontWeight: '700', + marginBottom: 8, }, buttonRow: { flexDirection: 'row', gap: 12, - marginTop: 8, - marginBottom: 16, }, button: { - flex: 1, - paddingVertical: 14, - borderRadius: 12, alignItems: 'center', + backgroundColor: '#FFFFFF', + borderRadius: 8, + flex: 1, + justifyContent: 'center', + minHeight: 46, }, buttonPrimary: { - backgroundColor: '#007AFF', + backgroundColor: '#18181B', }, - buttonSecondary: { - backgroundColor: '#FFF', - borderWidth: 1, - borderColor: '#007AFF', - }, - buttonDisabled: { - opacity: 0.5, + buttonText: { + color: '#09090B', + fontSize: 15, + fontWeight: '700', }, buttonPrimaryText: { - color: '#FFF', - fontSize: 16, - fontWeight: '600', + color: '#FFFFFF', }, - buttonSecondaryText: { - color: '#007AFF', - fontSize: 16, - fontWeight: '600', + disabled: { + opacity: 0.48, + }, + disclaimer: { + color: '#71717A', + fontSize: 12, + lineHeight: 17, + marginTop: 16, }, banner: { - flexDirection: 'row', alignItems: 'center', - backgroundColor: '#F0F4FF', - padding: 12, - borderRadius: 12, - marginBottom: 16, + flexDirection: 'row', gap: 10, + marginTop: 16, }, bannerText: { - fontSize: 14, - color: '#007AFF', + color: '#854D0E', + flex: 1, + fontSize: 13, + fontWeight: '600', + lineHeight: 18, }, bannerError: { - backgroundColor: '#FFF0F0', + alignItems: 'flex-start', }, bannerErrorText: { - fontSize: 14, - color: '#FF3B30', + color: '#B42318', + flex: 1, + fontSize: 13, + fontWeight: '600', + lineHeight: 18, }, resultCard: { - backgroundColor: '#FFF', - borderRadius: 12, - padding: 16, - ...Platform.select({ - ios: { - shadowColor: '#000', - shadowOffset: {width: 0, height: 2}, - shadowOpacity: 0.08, - shadowRadius: 4, - }, - android: { - elevation: 2, - }, - }), + backgroundColor: '#FAFAFA', + borderColor: '#E4E4E7', + borderRadius: 8, + borderWidth: 1, + marginTop: 18, + padding: 12, }, resultTitle: { + color: '#09090B', fontSize: 16, - fontWeight: '600', - color: '#34C759', + fontWeight: '700', marginBottom: 12, }, resultRow: { flexDirection: 'row', + gap: 12, justifyContent: 'space-between', paddingVertical: 4, }, resultLabel: { + color: '#71717A', fontSize: 14, - color: '#666', }, resultValue: { + color: '#09090B', + flexShrink: 1, fontSize: 14, - fontWeight: '500', - color: '#000', + fontWeight: '700', + textAlign: 'right', }, }); diff --git a/examples/BareRNExample/assets/kittenml_logo.png b/examples/BareRNExample/assets/kittenml_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d1093dfa20738e714c568815404c6df4afd8a064 GIT binary patch literal 35327 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 KrCO$J5&S=Ps`|kI literal 0 HcmV?d00001 diff --git a/examples/ExpoExample/App.tsx b/examples/ExpoExample/App.tsx index 0f6e7f9..7cda35c 100644 --- a/examples/ExpoExample/App.tsx +++ b/examples/ExpoExample/App.tsx @@ -1,6 +1,7 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import {useCallback, useEffect, useMemo, useRef, useState} from 'react'; import { ActivityIndicator, + Image, Platform, SafeAreaView, ScrollView, @@ -10,7 +11,7 @@ import { Pressable, View, } from 'react-native'; -import { StatusBar } from 'expo-status-bar'; +import {StatusBar} from 'expo-status-bar'; import * as ExpoAudio from 'expo-audio'; import { ALL_VOICES, @@ -23,14 +24,16 @@ import { voiceDisplayName, } from '@kittentts/react-native'; +const LOGO = require('./assets/kittenml_logo.png'); + type WorkState = - | { kind: 'booting' } - | { kind: 'ready' } - | { kind: 'preparing' } - | { kind: 'loading'; progress: number } - | { kind: 'generating' } - | { kind: 'playing' } - | { kind: 'error'; message: string }; + | {kind: 'booting'} + | {kind: 'ready'} + | {kind: 'preparing'} + | {kind: 'loading'; progress: number} + | {kind: 'generating'} + | {kind: 'playing'} + | {kind: 'error'; message: string}; const MODELS = [ KittenModel.Nano, @@ -44,49 +47,59 @@ const SPEEDS = [0.5, 0.75, 1, 1.25, 1.5, 2]; export default function App() { const [tts, setTts] = useState(null); const ttsRef = useRef(null); - const [state, setState] = useState({ kind: 'booting' }); + const [state, setState] = useState({kind: 'booting'}); const [model, setModel] = useState(KittenModel.Nano); const [voice, setVoice] = useState(KittenVoice.Bella); const [speed, setSpeed] = useState(1); - const [text, setText] = useState('Hello from KittenTTS. This is running on device with Expo.'); + const [text, setText] = useState( + 'Hello from KittenTTS. This is running on device with Expo.', + ); const [result, setResult] = useState(null); const mountedRef = useRef(true); - const busy = state.kind === 'booting' || state.kind === 'preparing' || state.kind === 'loading' || state.kind === 'generating' || state.kind === 'playing'; + const busy = + state.kind === 'booting' || + state.kind === 'preparing' || + state.kind === 'loading' || + state.kind === 'generating' || + state.kind === 'playing'; const player = useMemo(() => createExpoAudioPlayer(ExpoAudio), []); - const loadModel = useCallback(async (nextModel: KittenModel) => { - setState({ kind: 'preparing' }); - setResult(null); + const loadModel = useCallback( + async (nextModel: KittenModel) => { + setState({kind: 'preparing'}); + setResult(null); - try { - await ttsRef.current?.dispose(); - const instance = await KittenTTS.create( - { model: nextModel, player }, - (progress, info) => { - if (mountedRef.current && info?.stage === 'downloading') { - setState({ - kind: 'loading', - progress, - }); - } - }, - ); - if (!mountedRef.current) { - if (!__DEV__) await instance.dispose(); - return; + try { + await ttsRef.current?.dispose(); + const instance = await KittenTTS.create( + {model: nextModel, player}, + (progress, info) => { + if (mountedRef.current && info?.stage === 'downloading') { + setState({ + kind: 'loading', + progress, + }); + } + }, + ); + if (!mountedRef.current) { + if (!__DEV__) await instance.dispose(); + return; + } + ttsRef.current = instance; + setTts(instance); + setState({kind: 'ready'}); + } catch (error) { + ttsRef.current = null; + if (mountedRef.current) { + setTts(null); + setState({kind: 'error', message: friendlyError(error)}); + } } - ttsRef.current = instance; - setTts(instance); - setState({ kind: 'ready' }); - } catch (error) { - ttsRef.current = null; - if (mountedRef.current) { - setTts(null); - setState({ kind: 'error', message: friendlyError(error) }); - } - } - }, [player]); + }, + [player], + ); useEffect(() => { mountedRef.current = true; @@ -104,32 +117,35 @@ export default function App() { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const selectModel = useCallback((nextModel: KittenModel) => { - setModel(nextModel); - loadModel(nextModel); - }, [loadModel]); + const selectModel = useCallback( + (nextModel: KittenModel) => { + setModel(nextModel); + loadModel(nextModel); + }, + [loadModel], + ); const generate = useCallback(async () => { if (!tts || !text.trim()) return; - setState({ kind: 'generating' }); + setState({kind: 'generating'}); try { const nextResult = await tts.generate(text, voice, speed); setResult(nextResult); - setState({ kind: 'ready' }); + setState({kind: 'ready'}); } catch (error) { - setState({ kind: 'error', message: friendlyError(error) }); + setState({kind: 'error', message: friendlyError(error)}); } }, [speed, text, tts, voice]); const speak = useCallback(async () => { if (!tts || !text.trim()) return; - setState({ kind: 'playing' }); + setState({kind: 'playing'}); try { const nextResult = await tts.speak(text, voice, speed); setResult(nextResult); - setState({ kind: 'ready' }); + setState({kind: 'ready'}); } catch (error) { - setState({ kind: 'error', message: friendlyError(error) }); + setState({kind: 'error', message: friendlyError(error)}); } }, [speed, text, tts, voice]); @@ -138,72 +154,121 @@ export default function App() { - KittenTTS - Expo on-device text to speech + + + + + KittenTTS Example + + Expo example of the React Native SDK for KittenTTS + + - - - - Text - + + + Model + + {statusSummary(state)} + + + + + {modelDisplayName(model)} + + + + + + Text + + + + - - - - - - `${value.toFixed(2).replace(/0$/, '')}x`} - onSelect={setSpeed} - /> - - - - - + - {result ? ( - - Last Result - - - - + + + + Playback + + + + - ) : null} + + + + + This system is for demonstration purposes only and is not intended + to process sensitive or personal data. + + + {result ? ( + + Last Result + + + + + + ) : null} + ); } -function StatusPanel({ state }: { state: WorkState }) { +function StatusPanel({state}: {state: WorkState}) { if (state.kind === 'ready') return null; if (state.kind === 'error') { @@ -214,15 +279,16 @@ function StatusPanel({ state }: { state: WorkState }) { ); } - const text = state.kind === 'booting' - ? 'Preparing...' - : state.kind === 'preparing' + const text = + state.kind === 'booting' + ? 'Preparing...' + : state.kind === 'preparing' ? 'Preparing assets...' - : state.kind === 'loading' + : state.kind === 'loading' ? `Downloading assets... ${Math.round(state.progress * 100)}%` : state.kind === 'generating' - ? 'Generating audio...' - : 'Playing audio...'; + ? 'Generating audio...' + : 'Playing audio...'; return ( @@ -251,16 +317,22 @@ function OptionGroup({ {label} - {values.map((value) => { + {values.map(value => { const active = value === selected; return ( onSelect(value)} - > - {getLabel(value)} + onPress={() => onSelect(value)}> + + {getLabel(value)} + ); })} @@ -282,16 +354,22 @@ function ActionButton({ }) { return ( - {label} + onPress={onPress}> + + {label} + ); } -function ResultRow({ label, value }: { label: string; value: string }) { +function ResultRow({label, value}: {label: string; value: string}) { return ( {label} @@ -300,17 +378,51 @@ function ResultRow({ label, value }: { label: string; value: string }) { ); } +function statusSummary(state: WorkState): string { + switch (state.kind) { + case 'booting': + return 'Booting'; + case 'ready': + return 'Ready'; + case 'preparing': + return 'Preparing'; + case 'loading': + return `${Math.round(state.progress * 100)}%`; + case 'generating': + return 'Generating'; + case 'playing': + return 'Playing'; + case 'error': + return 'Error'; + } +} + +function speedLabel(value: number): string { + return `${value.toFixed(2).replace(/0$/, '')}x`; +} + function friendlyError(error: unknown): string { const message = error instanceof Error ? error.message : String(error); const lower = message.toLowerCase(); - if (lower.includes('onnxruntime') || lower.includes('react-native-fs') || lower.includes('nativemodule')) { + if ( + lower.includes('onnxruntime') || + lower.includes('react-native-fs') || + lower.includes('nativemodule') + ) { return 'This example needs an Expo development build because it uses native inference and filesystem modules.'; } - if (lower.includes('download') || lower.includes('network') || lower.includes('http')) { + if ( + lower.includes('download') || + lower.includes('network') || + lower.includes('http') + ) { return 'Could not download the model assets. Check the network connection and try again.'; } - if (lower.includes('unable to resolve') || lower.includes('cannot find module')) { + if ( + lower.includes('unable to resolve') || + lower.includes('cannot find module') + ) { return 'The local KittenTTS package could not be loaded. Run npm install and restart Expo with a cleared cache.'; } @@ -320,46 +432,116 @@ function friendlyError(error: unknown): string { const styles = StyleSheet.create({ screen: { flex: 1, - backgroundColor: '#F4F5F8', + backgroundColor: '#FAFAFA', }, content: { - padding: 20, + alignSelf: 'center', + maxWidth: 430, + width: '100%', + paddingHorizontal: 16, paddingTop: Platform.OS === 'android' ? 44 : 24, paddingBottom: 40, }, header: { + alignItems: 'flex-start', + flexDirection: 'row', + marginBottom: 20, + }, + logoMark: { alignItems: 'center', - marginBottom: 24, + borderRadius: 8, + height: 48, + justifyContent: 'center', + marginRight: 12, + overflow: 'hidden', + width: 48, + }, + logoImage: { + height: 48, + width: 48, + }, + headerCopy: { + flex: 1, }, title: { - color: '#111111', - fontSize: 34, - fontWeight: '800', + color: '#09090B', + fontSize: 30, + fontWeight: '700', + lineHeight: 32, }, subtitle: { - color: '#6F7178', - fontSize: 17, - marginTop: 4, + color: '#71717A', + fontSize: 16, + lineHeight: 22, + marginTop: 6, + }, + demoCard: { + backgroundColor: '#FFFFFF', + borderColor: '#E4E4E7', + borderRadius: 8, + borderWidth: 1, + padding: 16, + }, + modelRow: { + alignItems: 'center', + flexDirection: 'row', + justifyContent: 'space-between', + marginBottom: 18, + }, + modelRowLeft: { + alignItems: 'center', + flexDirection: 'row', + flexShrink: 1, + gap: 8, + }, + modelRowLabel: { + color: '#09090B', + fontSize: 14, + fontWeight: '600', + }, + pill: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + paddingHorizontal: 9, + paddingVertical: 4, + }, + pillText: { + color: '#52525B', + fontSize: 12, + fontWeight: '700', + }, + softBadge: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + flexShrink: 1, + paddingHorizontal: 10, + paddingVertical: 6, + }, + softBadgeText: { + color: '#09090B', + fontSize: 13, + fontWeight: '700', }, group: { marginBottom: 18, }, label: { - color: '#6D6F76', - fontSize: 13, + color: '#52525B', + fontSize: 12, fontWeight: '700', letterSpacing: 0, marginBottom: 8, - textTransform: 'uppercase', }, input: { - minHeight: 120, + minHeight: 122, + borderColor: '#E4E4E7', borderRadius: 8, + borderWidth: 1, backgroundColor: '#FFFFFF', - color: '#15171A', - fontSize: 18, - lineHeight: 25, - padding: 16, + color: '#09090B', + fontSize: 15, + lineHeight: 22, + padding: 12, textAlignVertical: 'top', }, options: { @@ -368,109 +550,123 @@ const styles = StyleSheet.create({ gap: 10, }, option: { - minHeight: 44, - borderWidth: 1, - borderColor: '#DADCE2', + backgroundColor: '#F4F4F5', borderRadius: 8, - backgroundColor: '#FFFFFF', justifyContent: 'center', - paddingHorizontal: 16, + minHeight: 44, + paddingHorizontal: 12, }, optionActive: { - borderColor: '#007AFF', - backgroundColor: '#007AFF', + backgroundColor: '#D4D4D8', }, optionText: { - color: '#2B2D33', - fontSize: 16, + color: '#52525B', + fontSize: 14, fontWeight: '600', }, optionTextActive: { - color: '#FFFFFF', + color: '#09090B', + }, + actionGroup: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + marginTop: 2, + padding: 10, + }, + actionGroupLabel: { + color: '#52525B', + fontSize: 12, + fontWeight: '700', + marginBottom: 8, }, actions: { flexDirection: 'row', gap: 12, - marginTop: 8, - marginBottom: 18, }, button: { + backgroundColor: '#FFFFFF', flex: 1, - minHeight: 54, + minHeight: 46, borderRadius: 8, alignItems: 'center', justifyContent: 'center', }, buttonPrimary: { - backgroundColor: '#007AFF', + backgroundColor: '#18181B', }, buttonSecondary: { backgroundColor: '#FFFFFF', - borderColor: '#007AFF', - borderWidth: 1, }, buttonPrimaryText: { color: '#FFFFFF', - fontSize: 17, + fontSize: 15, fontWeight: '700', }, buttonSecondaryText: { - color: '#007AFF', - fontSize: 17, + color: '#09090B', + fontSize: 15, fontWeight: '700', }, disabled: { - opacity: 0.45, + opacity: 0.48, }, status: { - minHeight: 52, - borderRadius: 8, - backgroundColor: '#EAF2FF', - flexDirection: 'row', alignItems: 'center', + flexDirection: 'row', gap: 10, - paddingHorizontal: 14, - marginBottom: 18, + marginTop: 16, }, statusText: { - color: '#0B63CE', - fontSize: 15, + color: '#854D0E', + flex: 1, + fontSize: 13, fontWeight: '600', + lineHeight: 18, }, statusError: { - backgroundColor: '#FFF0F0', + alignItems: 'flex-start', }, statusErrorText: { - color: '#D93025', - fontSize: 15, + color: '#B42318', + flex: 1, + fontSize: 13, fontWeight: '600', - lineHeight: 21, + lineHeight: 18, + }, + disclaimer: { + color: '#71717A', + fontSize: 12, + lineHeight: 17, + marginTop: 16, }, result: { + backgroundColor: '#FAFAFA', + borderColor: '#E4E4E7', borderRadius: 8, - backgroundColor: '#FFFFFF', - padding: 16, + borderWidth: 1, + marginTop: 18, + padding: 12, }, resultTitle: { - color: '#1F8F4D', - fontSize: 17, - fontWeight: '800', - marginBottom: 10, + color: '#09090B', + fontSize: 16, + fontWeight: '700', + marginBottom: 12, }, resultRow: { flexDirection: 'row', justifyContent: 'space-between', - gap: 16, - paddingVertical: 5, + gap: 12, + paddingVertical: 4, }, resultLabel: { - color: '#6F7178', - fontSize: 15, + color: '#71717A', + fontSize: 14, }, resultValue: { - color: '#15171A', + color: '#09090B', flexShrink: 1, - fontSize: 15, + fontSize: 14, fontWeight: '700', textAlign: 'right', }, diff --git a/examples/ExpoExample/assets/kittenml_logo.png b/examples/ExpoExample/assets/kittenml_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d1093dfa20738e714c568815404c6df4afd8a064 GIT binary patch literal 35327 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 KrCO$J5&S=Ps`|kI literal 0 HcmV?d00001 diff --git a/examples/ExpoWordTimingsExample/App.tsx b/examples/ExpoWordTimingsExample/App.tsx index b80c80c..2915d70 100644 --- a/examples/ExpoWordTimingsExample/App.tsx +++ b/examples/ExpoWordTimingsExample/App.tsx @@ -1,6 +1,7 @@ -import { useEffect, useMemo, useRef, useState } from 'react'; +import {useEffect, useMemo, useRef, useState} from 'react'; import { ActivityIndicator, + Image, Pressable, SafeAreaView, ScrollView, @@ -9,9 +10,10 @@ import { TextInput, View, } from 'react-native'; -import { StatusBar } from 'expo-status-bar'; +import {StatusBar} from 'expo-status-bar'; import * as ExpoAudio from 'expo-audio'; import { + ALL_VOICES, KittenModel, KittenTTS, KittenTTSResult, @@ -22,22 +24,18 @@ import { modelDisplayName, voiceDisplayName, } from '@kittentts/react-native'; -import type { KittenWordTiming } from '@kittentts/react-native'; +import type {KittenWordTiming} from '@kittentts/react-native'; + +const LOGO = require('./assets/kittenml_logo.png'); type Status = - | { kind: 'idle'; message: string } - | { kind: 'preparing' } - | { kind: 'loading'; progress: number } - | { kind: 'working'; message: string } - | { kind: 'error'; message: string }; + | {kind: 'idle'; message: string} + | {kind: 'preparing'} + | {kind: 'loading'; progress: number} + | {kind: 'working'; message: string} + | {kind: 'error'; message: string}; const MODEL = KittenModel.NanoInt8; -const VOICES = [ - KittenVoice.Bella, - KittenVoice.Luna, - KittenVoice.Jasper, - KittenVoice.Leo, -]; export default function App() { const [text, setText] = useState( @@ -54,7 +52,10 @@ export default function App() { const highlightTimerRef = useRef | null>(null); const player = useMemo(() => createExpoAudioPlayer(ExpoAudio), []); - const busy = status.kind === 'preparing' || status.kind === 'loading' || status.kind === 'working'; + const busy = + status.kind === 'preparing' || + status.kind === 'loading' || + status.kind === 'working'; useEffect(() => { return () => { @@ -68,13 +69,13 @@ export default function App() { async function getTTS(): Promise { if (ttsRef.current) return ttsRef.current; - setStatus({ kind: 'preparing' }); - const cached = await KittenTTS.isModelDownloaded({ model: MODEL }); + setStatus({kind: 'preparing'}); + const cached = await KittenTTS.isModelDownloaded({model: MODEL}); const instance = await KittenTTS.create( - { model: MODEL, defaultVoice: voice, player }, + {model: MODEL, defaultVoice: voice, player}, (progress, info) => { if (info?.stage === 'downloading') { - setStatus({ kind: 'loading', progress }); + setStatus({kind: 'loading', progress}); } }, ); @@ -89,7 +90,7 @@ export default function App() { async function speak() { if (!text.trim()) { - setStatus({ kind: 'error', message: 'Enter text before speaking.' }); + setStatus({kind: 'error', message: 'Enter text before speaking.'}); return; } @@ -97,24 +98,27 @@ export default function App() { setResult(null); setActiveWordIndex(null); const tts = await getTTS(); - setStatus({ kind: 'working', message: 'Generating audio...' }); + setStatus({kind: 'working', message: 'Generating audio...'}); const nextResult = await tts.generate(text, voice); setResult(nextResult); - setStatus({ kind: 'working', message: 'Playing with word highlighting...' }); + setStatus({ + kind: 'working', + message: 'Playing with word highlighting...', + }); await tts.play(nextResult, { onPlaybackStart: () => startWordHighlighting(nextResult), }); stopWordHighlighting(); - setStatus({ kind: 'idle', message: 'Playback finished.' }); + setStatus({kind: 'idle', message: 'Playback finished.'}); } catch (error) { stopWordHighlighting(); - setStatus({ kind: 'error', message: friendlyError(error) }); + setStatus({kind: 'error', message: friendlyError(error)}); } } async function generateOnly() { if (!text.trim()) { - setStatus({ kind: 'error', message: 'Enter text before generating.' }); + setStatus({kind: 'error', message: 'Enter text before generating.'}); return; } @@ -122,12 +126,12 @@ export default function App() { setResult(null); setActiveWordIndex(null); const tts = await getTTS(); - setStatus({ kind: 'working', message: 'Generating audio...' }); + setStatus({kind: 'working', message: 'Generating audio...'}); const nextResult = await tts.generate(text, voice); setResult(nextResult); - setStatus({ kind: 'idle', message: 'Generated audio with word timings.' }); + setStatus({kind: 'idle', message: 'Generated audio with word timings.'}); } catch (error) { - setStatus({ kind: 'error', message: friendlyError(error) }); + setStatus({kind: 'error', message: friendlyError(error)}); } } @@ -136,77 +140,105 @@ export default function App() { - Word Timings - - Expo SDK 55 development-build demo. Expo Go will not work. - + + + + + KittenTTS Example + + Word timings example of the React Native SDK for KittenTTS + + - - Model - {modelDisplayName(MODEL)} - + + + + Model + + {statusSummary(status)} + + + + + {modelDisplayName(MODEL)} + + + - - Text - - + + Text + + + + + Voice + + {ALL_VOICES.map(item => ( + setVoice(item)} + style={[ + styles.option, + voice === item && styles.optionSelected, + busy && styles.disabled, + ]}> + + {voiceDisplayName(item)} + + + ))} + + - - Voice - - {VOICES.map((item) => ( + + Playback + setVoice(item)} - style={[styles.option, voice === item && styles.optionSelected]} - > - - {voiceDisplayName(item)} + onPress={generateOnly} + style={[styles.button, busy && styles.disabled]}> + Generate + + + + Speak - ))} + - - - - - - Generate - - - - Speak - - - + + + {result ? ( + + ) : null} - {result ? ( - - ) : null} + + This system is for demonstration purposes only and is not intended + to process sensitive or personal data. + + ); @@ -222,7 +254,8 @@ export default function App() { highlightTimerRef.current = setInterval(() => { const elapsedSeconds = (Date.now() - startedAt) / 1000; const active = wordTimings.find( - item => elapsedSeconds >= item.startTime && elapsedSeconds < item.endTime, + item => + elapsedSeconds >= item.startTime && elapsedSeconds < item.endTime, ); setActiveWordIndex(active?.wordIndex ?? null); }, 50); @@ -271,9 +304,9 @@ function ResultCard({ key={`transcript-${item.wordIndex}-${item.word}`} style={[ styles.transcriptWord, - activeWordIndex === item.wordIndex && styles.transcriptWordActive, - ]} - > + activeWordIndex === item.wordIndex && + styles.transcriptWordActive, + ]}> {item.word} {index < transcriptWords.length - 1 ? ' ' : ''} @@ -281,28 +314,27 @@ function ResultCard({ - {timings.map((item) => ( + {timings.map(item => ( + ]}> + activeWordIndex === item.wordIndex && + styles.timingWordActive, + ]}> {item.word} + activeWordIndex === item.wordIndex && + styles.timingTimeActive, + ]}> {item.startTime.toFixed(2)}s - {item.endTime.toFixed(2)}s @@ -319,7 +351,22 @@ function ResultCard({ ); } -function StatusView({ status }: { status: Status }) { +function statusSummary(status: Status): string { + switch (status.kind) { + case 'idle': + return status.message.includes('Ready') ? 'Ready' : 'Loaded'; + case 'preparing': + return 'Preparing'; + case 'loading': + return `${Math.round(status.progress * 100)}%`; + case 'working': + return 'Working'; + case 'error': + return 'Error'; + } +} + +function StatusView({status}: {status: Status}) { if (status.kind === 'preparing') { return ( @@ -341,13 +388,13 @@ function StatusView({ status }: { status: Status }) { } return ( - + + ]}> {status.message} @@ -374,46 +421,112 @@ function friendlyError(error: unknown): string { const styles = StyleSheet.create({ screen: { flex: 1, - backgroundColor: '#F6F7F9', + backgroundColor: '#FAFAFA', }, content: { - gap: 16, - padding: 20, + alignSelf: 'center', + maxWidth: 430, + width: '100%', + paddingHorizontal: 16, + paddingTop: 24, + paddingBottom: 40, }, header: { - gap: 6, - paddingTop: 12, + alignItems: 'flex-start', + flexDirection: 'row', + marginBottom: 20, + }, + logoMark: { + alignItems: 'center', + borderRadius: 8, + height: 48, + justifyContent: 'center', + marginRight: 12, + overflow: 'hidden', + width: 48, + }, + logoImage: { + height: 48, + width: 48, + }, + headerCopy: { + flex: 1, }, title: { - color: '#111827', - fontSize: 28, + color: '#09090B', + fontSize: 30, fontWeight: '700', + lineHeight: 32, }, subtitle: { - color: '#5B6472', - fontSize: 15, - lineHeight: 21, + color: '#71717A', + fontSize: 16, + lineHeight: 22, + marginTop: 6, }, - panel: { - gap: 10, + demoCard: { + backgroundColor: '#FFFFFF', + borderColor: '#E4E4E7', + borderRadius: 8, + borderWidth: 1, + padding: 16, }, - label: { - color: '#374151', + modelRow: { + alignItems: 'center', + flexDirection: 'row', + justifyContent: 'space-between', + marginBottom: 18, + }, + modelRowLeft: { + alignItems: 'center', + flexDirection: 'row', + flexShrink: 1, + gap: 8, + }, + modelRowLabel: { + color: '#09090B', + fontSize: 14, + fontWeight: '600', + }, + pill: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + paddingHorizontal: 9, + paddingVertical: 4, + }, + pillText: { + color: '#52525B', + fontSize: 12, + fontWeight: '700', + }, + softBadge: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + flexShrink: 1, + paddingHorizontal: 10, + paddingVertical: 6, + }, + softBadgeText: { + color: '#09090B', fontSize: 13, fontWeight: '700', - textTransform: 'uppercase', }, - value: { - color: '#111827', - fontSize: 17, + panel: { + marginBottom: 18, + }, + label: { + color: '#52525B', + fontSize: 12, + fontWeight: '700', + marginBottom: 8, }, input: { - minHeight: 110, - borderColor: '#D5DAE1', + minHeight: 122, + borderColor: '#E4E4E7', borderRadius: 8, borderWidth: 1, - color: '#111827', - fontSize: 16, + color: '#09090B', + fontSize: 15, lineHeight: 22, padding: 12, textAlignVertical: 'top', @@ -425,44 +538,50 @@ const styles = StyleSheet.create({ gap: 8, }, option: { - borderColor: '#CAD1DB', + backgroundColor: '#F4F4F5', borderRadius: 8, - borderWidth: 1, + minHeight: 38, + justifyContent: 'center', paddingHorizontal: 12, - paddingVertical: 9, - backgroundColor: '#FFFFFF', }, optionSelected: { - borderColor: '#1F6FEB', - backgroundColor: '#EAF2FF', + backgroundColor: '#D4D4D8', }, optionText: { - color: '#1F2937', + color: '#52525B', fontSize: 14, fontWeight: '600', }, optionTextSelected: { - color: '#174EA6', + color: '#09090B', + }, + actionGroup: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + marginTop: 2, + padding: 10, + }, + actionGroupLabel: { + color: '#52525B', + fontSize: 12, + fontWeight: '700', + marginBottom: 8, }, status: { alignItems: 'center', - borderColor: '#D5DAE1', - borderRadius: 8, - borderWidth: 1, flexDirection: 'row', gap: 10, - minHeight: 48, - padding: 12, - backgroundColor: '#FFFFFF', + marginTop: 16, }, errorStatus: { - borderColor: '#F2B8B5', - backgroundColor: '#FFF1F1', + alignItems: 'flex-start', }, statusText: { - color: '#344054', + color: '#854D0E', flex: 1, - fontSize: 14, + fontSize: 13, + fontWeight: '600', + lineHeight: 18, }, errorStatusText: { color: '#B42318', @@ -473,72 +592,75 @@ const styles = StyleSheet.create({ }, button: { alignItems: 'center', - borderColor: '#1F2937', + backgroundColor: '#FFFFFF', borderRadius: 8, - borderWidth: 1, flex: 1, - minHeight: 48, + minHeight: 46, justifyContent: 'center', paddingHorizontal: 14, - backgroundColor: '#FFFFFF', }, primaryButton: { - borderColor: '#1F6FEB', - backgroundColor: '#1F6FEB', - }, - buttonDisabled: { - opacity: 0.55, + backgroundColor: '#18181B', }, buttonText: { - color: '#111827', - fontSize: 16, + color: '#09090B', + fontSize: 15, fontWeight: '700', }, primaryButtonText: { color: '#FFFFFF', }, + disabled: { + opacity: 0.48, + }, + disclaimer: { + color: '#71717A', + fontSize: 12, + lineHeight: 17, + marginTop: 16, + }, result: { - borderColor: '#D5DAE1', + backgroundColor: '#FAFAFA', + borderColor: '#E4E4E7', borderRadius: 8, borderWidth: 1, gap: 14, - padding: 14, - backgroundColor: '#FFFFFF', + marginTop: 18, + padding: 12, }, resultTitle: { - color: '#111827', - fontSize: 18, - fontWeight: '800', + color: '#09090B', + fontSize: 16, + fontWeight: '700', }, resultGrid: { flexDirection: 'row', gap: 28, }, resultLabel: { - color: '#5B6472', + color: '#71717A', fontSize: 13, }, resultValue: { - color: '#111827', - fontSize: 18, + color: '#09090B', + fontSize: 17, fontWeight: '700', }, timingsTitle: { - color: '#374151', - fontSize: 13, + color: '#52525B', + fontSize: 12, fontWeight: '700', - textTransform: 'uppercase', }, transcript: { - color: '#111827', + color: '#09090B', fontSize: 16, lineHeight: 30, }, transcriptWord: { - color: '#111827', + color: '#09090B', }, transcriptWordActive: { - backgroundColor: '#1F6FEB', + backgroundColor: '#18181B', color: '#FFFFFF', fontWeight: '800', }, @@ -547,7 +669,7 @@ const styles = StyleSheet.create({ }, timingRow: { alignItems: 'center', - borderColor: '#E4E7EC', + borderColor: '#E4E4E7', borderRadius: 8, borderWidth: 1, flexDirection: 'row', @@ -557,29 +679,29 @@ const styles = StyleSheet.create({ paddingVertical: 8, }, timingRowActive: { - borderColor: '#1F6FEB', - backgroundColor: '#EAF2FF', + borderColor: '#D4D4D8', + backgroundColor: '#F4F4F5', }, timingWord: { - color: '#111827', + color: '#09090B', flex: 1, fontSize: 14, fontWeight: '700', }, timingWordActive: { - color: '#174EA6', + color: '#09090B', }, timingTime: { - color: '#475467', + color: '#52525B', fontSize: 13, fontVariant: ['tabular-nums'], }, timingTimeActive: { - color: '#174EA6', + color: '#09090B', fontWeight: '700', }, emptyTimings: { - color: '#667085', + color: '#71717A', fontSize: 14, lineHeight: 20, }, diff --git a/examples/ExpoWordTimingsExample/assets/kittenml_logo.png b/examples/ExpoWordTimingsExample/assets/kittenml_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d1093dfa20738e714c568815404c6df4afd8a064 GIT binary patch literal 35327 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 KrCO$J5&S=Ps`|kI literal 0 HcmV?d00001 diff --git a/examples/OfflineBundledAssetsExample/App.tsx b/examples/OfflineBundledAssetsExample/App.tsx index 17d33e3..7039210 100644 --- a/examples/OfflineBundledAssetsExample/App.tsx +++ b/examples/OfflineBundledAssetsExample/App.tsx @@ -1,8 +1,9 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import {useCallback, useEffect, useMemo, useRef, useState} from 'react'; import * as ExpoAudio from 'expo-audio'; -import { StatusBar } from 'expo-status-bar'; +import {StatusBar} from 'expo-status-bar'; import { ActivityIndicator, + Image, SafeAreaView, ScrollView, StyleSheet, @@ -22,46 +23,53 @@ import { } from '@kittentts/react-native'; import manifestJson from './assets/kittentts/manifest.json'; +const LOGO = require('./assets/kittenml_logo.png'); + const manifest = manifestJson as KittenTTSBundledAssetsManifest; type WorkState = - | { kind: 'preparing' } - | { kind: 'ready' } - | { kind: 'speaking' } - | { kind: 'error'; message: string }; + | {kind: 'preparing'} + | {kind: 'ready'} + | {kind: 'speaking'} + | {kind: 'error'; message: string}; export default function App() { const ttsRef = useRef(null); const mountedRef = useRef(true); const player = useMemo(() => createExpoAudioPlayer(ExpoAudio), []); const models = useMemo(() => bundledAssetModels(manifest), []); - const [model, setModel] = useState(models[0] ?? KittenModel.NanoInt8); - const [state, setState] = useState({ kind: 'preparing' }); + const [model, setModel] = useState( + models[0] ?? KittenModel.NanoInt8, + ); + const [state, setState] = useState({kind: 'preparing'}); - const prepare = useCallback(async (nextModel: KittenModel) => { - setState({ kind: 'preparing' }); - try { - await ttsRef.current?.dispose(); - const config = await createBundledAssetConfig(manifest, { - model: nextModel, - defaultVoice: KittenVoice.Bella, - }); - const tts = await KittenTTS.create({ ...config, player }); - - if (!mountedRef.current) { - await tts.dispose(); - return; - } + const prepare = useCallback( + async (nextModel: KittenModel) => { + setState({kind: 'preparing'}); + try { + await ttsRef.current?.dispose(); + const config = await createBundledAssetConfig(manifest, { + model: nextModel, + defaultVoice: KittenVoice.Bella, + }); + const tts = await KittenTTS.create({...config, player}); - ttsRef.current = tts; - setState({ kind: 'ready' }); - } catch (error) { - if (mountedRef.current) { - ttsRef.current = null; - setState({ kind: 'error', message: errorMessage(error) }); + if (!mountedRef.current) { + await tts.dispose(); + return; + } + + ttsRef.current = tts; + setState({kind: 'ready'}); + } catch (error) { + if (mountedRef.current) { + ttsRef.current = null; + setState({kind: 'error', message: errorMessage(error)}); + } } - } - }, [player]); + }, + [player], + ); useEffect(() => { mountedRef.current = true; @@ -77,12 +85,12 @@ export default function App() { const tts = ttsRef.current; if (!tts) return; - setState({ kind: 'speaking' }); + setState({kind: 'speaking'}); try { await tts.speak('KittenTTS is running from bundled app assets.'); - setState({ kind: 'ready' }); + setState({kind: 'ready'}); } catch (error) { - setState({ kind: 'error', message: errorMessage(error) }); + setState({kind: 'error', message: errorMessage(error)}); } }, []); @@ -92,50 +100,117 @@ export default function App() { - Bundled KittenTTS - {statusText(state)} - - {busy ? : null} - - - Bundled model - - {models.map((candidate) => ( - setModel(candidate)} - > - + + + + + KittenTTS Example + + Offline bundled-assets example of the React Native SDK + + + + + + + + Model + + {statusSummary(state)} + + + + + {modelDisplayName(model)} + + + + + + Bundled model + + {models.map(candidate => ( + - {modelDisplayName(candidate)} - - - ))} + disabled={busy} + onPress={() => setModel(candidate)}> + + {modelDisplayName(candidate)} + + + ))} + - - - Speak - + + Playback + + Speak + + + + + + + This system is for demonstration purposes only and is not intended + to process sensitive or personal data. + + ); } +function StatusView({state}: {state: WorkState}) { + if (state.kind === 'ready') return null; + + if (state.kind === 'error') { + return ( + + + {state.message} + + + ); + } + + return ( + + + {statusText(state)} + + ); +} + +function statusSummary(state: WorkState): string { + switch (state.kind) { + case 'preparing': + return 'Preparing'; + case 'ready': + return 'Ready'; + case 'speaking': + return 'Speaking'; + case 'error': + return 'Error'; + } +} + function statusText(state: WorkState): string { switch (state.kind) { case 'preparing': @@ -156,31 +231,104 @@ function errorMessage(error: unknown): string { const styles = StyleSheet.create({ screen: { flex: 1, - backgroundColor: '#F7F7F8', + backgroundColor: '#FAFAFA', }, content: { - flexGrow: 1, + alignSelf: 'center', + maxWidth: 430, + width: '100%', + paddingHorizontal: 16, + paddingTop: 24, + paddingBottom: 40, + }, + header: { + alignItems: 'flex-start', + flexDirection: 'row', + marginBottom: 20, + }, + logoMark: { + alignItems: 'center', + borderRadius: 8, + height: 48, justifyContent: 'center', - gap: 18, - padding: 24, + marginRight: 12, + overflow: 'hidden', + width: 48, + }, + logoImage: { + height: 48, + width: 48, + }, + headerCopy: { + flex: 1, }, title: { - color: '#111827', - fontSize: 28, + color: '#09090B', + fontSize: 30, fontWeight: '700', + lineHeight: 32, }, subtitle: { - color: '#4B5563', - lineHeight: 20, + color: '#71717A', + fontSize: 16, + lineHeight: 22, + marginTop: 6, + }, + demoCard: { + backgroundColor: '#FFFFFF', + borderColor: '#E4E4E7', + borderRadius: 8, + borderWidth: 1, + padding: 16, + }, + modelRow: { + alignItems: 'center', + flexDirection: 'row', + justifyContent: 'space-between', + marginBottom: 18, + }, + modelRowLeft: { + alignItems: 'center', + flexDirection: 'row', + flexShrink: 1, + gap: 8, + }, + modelRowLabel: { + color: '#09090B', + fontSize: 14, + fontWeight: '600', + }, + pill: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + paddingHorizontal: 9, + paddingVertical: 4, + }, + pillText: { + color: '#52525B', + fontSize: 12, + fontWeight: '700', + }, + softBadge: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + flexShrink: 1, + paddingHorizontal: 10, + paddingVertical: 6, + }, + softBadgeText: { + color: '#09090B', + fontSize: 13, + fontWeight: '700', }, section: { - gap: 10, + marginBottom: 18, }, label: { - color: '#374151', - fontSize: 13, + color: '#52525B', + fontSize: 12, fontWeight: '700', - textTransform: 'uppercase', + marginBottom: 8, }, modelGrid: { flexDirection: 'row', @@ -188,35 +336,74 @@ const styles = StyleSheet.create({ gap: 10, }, modelButton: { - borderWidth: 1, - borderColor: '#D1D5DB', + backgroundColor: '#F4F4F5', borderRadius: 8, - paddingHorizontal: 14, - paddingVertical: 10, + justifyContent: 'center', + minHeight: 38, + paddingHorizontal: 12, }, modelButtonSelected: { - borderColor: '#2563EB', - backgroundColor: '#DBEAFE', + backgroundColor: '#D4D4D8', }, modelButtonText: { - color: '#374151', - fontWeight: '700', + color: '#52525B', + fontSize: 14, + fontWeight: '600', }, modelButtonTextSelected: { - color: '#1D4ED8', + color: '#09090B', + }, + actionGroup: { + backgroundColor: '#F4F4F5', + borderRadius: 8, + marginTop: 2, + padding: 10, + }, + actionGroupLabel: { + color: '#52525B', + fontSize: 12, + fontWeight: '700', + marginBottom: 8, }, speakButton: { alignItems: 'center', + backgroundColor: '#18181B', borderRadius: 8, - backgroundColor: '#2563EB', - paddingHorizontal: 18, - paddingVertical: 13, + justifyContent: 'center', + minHeight: 46, + paddingHorizontal: 14, }, speakButtonText: { color: '#FFFFFF', + fontSize: 15, fontWeight: '700', }, + status: { + alignItems: 'center', + flexDirection: 'row', + gap: 10, + marginTop: 16, + }, + statusText: { + color: '#854D0E', + flex: 1, + fontSize: 13, + fontWeight: '600', + lineHeight: 18, + }, + errorStatus: { + alignItems: 'flex-start', + }, + errorStatusText: { + color: '#B42318', + }, + disclaimer: { + color: '#71717A', + fontSize: 12, + lineHeight: 17, + marginTop: 16, + }, disabled: { - opacity: 0.45, + opacity: 0.48, }, }); diff --git a/examples/OfflineBundledAssetsExample/assets/kittenml_logo.png b/examples/OfflineBundledAssetsExample/assets/kittenml_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d1093dfa20738e714c568815404c6df4afd8a064 GIT binary patch literal 35327 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 KrCO$J5&S=Ps`|kI literal 0 HcmV?d00001