Understand the runtime
Review how conversation execution, speech/media components, and host application responsibilities fit together.
Explore architecture →FOR DEVELOPERS
Bring configurable conversational interaction into your native application. Explore the public documentation, then create a free developer account to download and evaluate the SDK under the developer terms.
Explore public developer documentation → · No account required
HOW DEVELOPMENT FITS TOGETHER
Andamento coordinates the conversation. Your application decides how to use its results, update its interface, and communicate with external services.
Review how conversation execution, speech/media components, and host application responsibilities fit together.
Explore architecture →Use conversation configuration to describe prompts, interaction steps, and transitions instead of hardcoding the entire dialogue in UI logic.
Explore configuration docs →Initialize the runtime, respond to callbacks and events, and pass application data or decisions into the interaction.
Read integration guidance →Study the public interfaces and integration requirements, then identify the components your application needs.
View developer reference →INSIDE A CONVERSATION
Consider a guided inspection. The configured flow prompts for an observation and requests confirmation. When the response is available, the host application can validate and record it.
Coordinates prompts, response collection, and configured flow progression.
Interprets business meaning, validates data, persists records, and updates UI.
The illustration is a conceptual execution outline, not a runnable JSON configuration or an SDK API signature. Use the developer documentation for exact schemas and calls.
SWIFT API & WORKING CONVERSATION FLOW
The Swift sequence loads audio prompts and a conversation flow. The JSON includes every node needed to navigate from CF_START to CF_END, including name capture, confirmation, and retry paths.
SWIFT · LOAD & RUN
let conversation = STConversationRunner()
let result = conversation.initialize()
guard result == .success else {
// Handle initialization failure.
return
}
_ = conversation.setConversationCallback(self)
_ = conversation.loadAudioPromptModules(from: "prompts.json")
_ = conversation.loadConversation(from: "conversation.json")
_ = conversation.runConversation()
This example uses prompts.json and conversation.json as application resources. Microphone permissions, required configuration and callbacks still need to be provided by the host app.
JSON · MULTI-STEP CONVERSATION
[
{
"id": "CF_START",
"type": "boundary",
"name": "Start",
"goTo": {"default": "node.configure"}
},
{
"id": "node.configure",
"type": "configure",
"name": "Configure",
"configureParams": {
"resourceLanguage": "en-US",
"speechRecognitionEngine": "apple",
"speechRecognitionLocale": "en-US",
"audioOutput": "speaker",
"audioProcessingMode": "conversational",
"runtimeFields": [{"name": "CollectedName", "value": ""}]
},
"goTo": {"default": "node.askName"}
},
{
"id": "node.askName",
"type": "interactiveCapture",
"name": "Ask Name",
"interactiveCapture": {
"dialogPrompts": [
{"type": "initial", "playbackMode": "sequence", "recognizeWhilePlaying": true, "promptID": "pm.askName"},
{
"type": "unrecognized",
"playbackMode": "sequence",
"recognizeWhilePlaying": true,
"promptID": "pm.nameDidntUnderstand"
},
{"type": "timeout", "playbackMode": "sequence", "recognizeWhilePlaying": true, "promptID": "pm.nameTimeout"}
],
"retryLimits": {"timeout": 2, "unrecognized": 2, "recognitionError": 1, "totalRetry": 3}
},
"speechRecognition": {
"speechRecognitionEngine": "apple",
"speechRecognitionLocale": "en-US",
"task": {
"taskID": "name",
"taskHint": "dictation",
"reportPartialResults": true,
"autoPunctuate": false,
"onDeviceRecognition": false
}
},
"audioRecording": {
"voiceActivityDetection": {
"enabled": true,
"minimumSpeechDurationMs": 200,
"minimumSilenceDurationMs": 500,
"sensitivity": "low",
"trimSilence": false,
"saveUntrimmedAudio": false
},
"stopConditions": {
"maximumAudioDurationMs": 15000,
"maximumSpeechDurationMs": 10000,
"maximumPreSpeechSilenceMs": 5000,
"maximumPostSpeechSilenceMs": 1200
},
"recordingPlayback": {
"recordWhilePlaying": true,
"stopPlaybackWhenSpeechDetected": true,
"stopPlaybackWhenValidHypothesis": false,
"includePartialHypothesis": true
}
},
"goTo": {
"default": "node.askContinue",
"timeoutLimitReached": "node.failed",
"unrecognizedLimitReached": "node.failed",
"recognitionErrorLimitReached": "node.failed",
"totalRetryLimitReached": "node.failed"
}
},
{
"id": "node.askContinue",
"type": "interactiveCapture",
"name": "Ask Continue",
"interactiveCapture": {
"unmatchedInputIsUnrecognized": true,
"dialogPrompts": [
{"type": "initial", "playbackMode": "sequence", "recognizeWhilePlaying": true, "promptID": "pm.askContinue"},
{
"type": "unrecognized",
"playbackMode": "sequence",
"recognizeWhilePlaying": true,
"promptID": "pm.yesNoDidntUnderstand"
},
{
"type": "timeout",
"playbackMode": "sequence",
"recognizeWhilePlaying": true,
"promptID": "pm.yesNoTimeout"
}
],
"retryLimits": {"timeout": 2, "unrecognized": 2, "recognitionError": 1, "totalRetry": 3}
},
"speechRecognition": {
"speechRecognitionEngine": "apple",
"speechRecognitionLocale": "en-US",
"task": {
"taskID": "yesNo",
"taskHint": "dictation",
"reportPartialResults": true,
"autoPunctuate": false,
"onDeviceRecognition": false
}
},
"audioRecording": {
"voiceActivityDetection": {
"enabled": true,
"minimumSpeechDurationMs": 200,
"minimumSilenceDurationMs": 500,
"sensitivity": "low",
"trimSilence": false,
"saveUntrimmedAudio": false
},
"stopConditions": {
"maximumAudioDurationMs": 10000,
"maximumSpeechDurationMs": 6000,
"maximumPreSpeechSilenceMs": 5000,
"maximumPostSpeechSilenceMs": 1000
},
"recordingPlayback": {
"recordWhilePlaying": true,
"stopPlaybackWhenSpeechDetected": true,
"stopPlaybackWhenValidHypothesis": false,
"includePartialHypothesis": true
}
},
"goTo": {
"default": "node.failed",
"timeoutLimitReached": "node.failed",
"unrecognizedLimitReached": "node.failed",
"recognitionErrorLimitReached": "node.failed",
"totalRetryLimitReached": "node.failed",
"userInputTransitions": [
{"comparator": "starts", "input": "yes", "goTo": "node.explainSpeechTiles"},
{"comparator": "starts", "input": "yeah", "goTo": "node.explainSpeechTiles"},
{"comparator": "starts", "input": "sure", "goTo": "node.explainSpeechTiles"},
{"comparator": "starts", "input": "no", "goTo": "node.goodbyeNo"}
]
}
},
{
"id": "node.explainSpeechTiles",
"type": "audioPlayback",
"name": "Explain SpeechTiles",
"audioPlayback": {"promptID": "pm.explainSpeechTiles"},
"goTo": {"default": "node.goodbyeYes"}
},
{
"id": "node.goodbyeYes",
"type": "audioPlayback",
"name": "Goodbye",
"audioPlayback": {"promptID": "pm.goodbyeYes"},
"goTo": {"default": "CF_END"}
},
{
"id": "node.goodbyeNo",
"type": "audioPlayback",
"name": "Goodbye",
"audioPlayback": {"promptID": "pm.goodbyeNo"},
"goTo": {"default": "CF_END"}
},
{
"id": "node.failed",
"type": "audioPlayback",
"name": "Conversation Failed",
"audioPlayback": {"promptID": "pm.couldNotGetName"},
"goTo": {"default": "CF_END"}
},
{
"id": "CF_END",
"type": "boundary",
"name": "End",
"goTo": {"default": ""}
}
]
This is a full conversation flow—not just boundary nodes. It references prompt IDs supplied by prompts.json and recognition tasks handled by your application. Scroll inside the code panel to explore the entire configuration. Download the JSON example ↓
FROM EXAMPLE TO EVALUATION
The JSON contains a connected flow with user-response branches and recovery paths. To run it, provide the matching prompt modules, speech-recognition tasks and permissions, then integrate the required application callbacks. Use the getting-started tutorial for the complete host-app setup.
Documentation is public. SDK downloads are subject to an eligible account, the applicable agreement, and authorized access.
DEVELOPER RESOURCES
Review the public interfaces, supported configuration, and integration guidance.
Open documentation ↗ 02 / FLOW DEFINITIONUnderstand how configured conversations and their execution are described.
Explore configuration ↗ 03 / SYSTEM DESIGNSee how the native host application, conversation runtime, speech/media, and optional external services interact.
View architecture ↗GETTING STARTED WITH THE SDK
Read the public documentation without an account. Create a developer account to begin the evaluation process, review the applicable terms and access the SDK or samples authorized for your account.
Need to test with external users? SpeechTiles plans to support controlled, time-limited public beta pilots under an approved scope. Production deployment requires a commercial license.
YOUR DEVELOPMENT PATH
Developer accounts: Public documentation is available without registration. SDK downloads require an eligible developer account, acceptance of the applicable agreement, and authorized access.
A DEEPER LOOK
Explore developer-focused capabilities, runtime boundaries, and the steps from a prototype to SDK evaluation.