FOR DEVELOPERS

Start building with Andamento.

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

Public documentation · No account requiredFree developer registration · Self-service SDK evaluation

HOW DEVELOPMENT FITS TOGETHER

A practical path from flow definition to application behavior.

Andamento coordinates the conversation. Your application decides how to use its results, update its interface, and communicate with external services.

01
◇

Understand the runtime

Review how conversation execution, speech/media components, and host application responsibilities fit together.

Explore architecture →
02
≡

Define the conversation

Use conversation configuration to describe prompts, interaction steps, and transitions instead of hardcoding the entire dialogue in UI logic.

Explore configuration docs →
03
↔

Connect your application

Initialize the runtime, respond to callbacks and events, and pass application data or decisions into the interaction.

Read integration guidance →
04
{ }

Explore the APIs

Study the public interfaces and integration requirements, then identify the components your application needs.

View developer reference →

INSIDE A CONVERSATION

Configuration drives the interaction. Your app owns the outcome.

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.

Andamento

Coordinates prompts, response collection, and configured flow progression.

Host application

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.

CONVERSATION EXECUTION · CONCEPTUALNOT SDK CODE
01CF_START → begin configured flow
02PROMPT → “What do you observe?”
03RESPONSE → collect user input
04CONFIRM → confirm captured information
05HOST APP → validate and save record
06CF_END → configured flow ends
Runtime / flow Application responsibility

SWIFT API & WORKING CONVERSATION FLOW

Load and run a configured conversation.

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

Initialize and run the conversation

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.

Explore the complete getting-started sequence →

JSON · MULTI-STEP CONVERSATION

Configure a real multi-step flow

[
  {
    "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 ↓

Read the complete configuration reference →

FROM EXAMPLE TO EVALUATION

Load the example, then test your own application.

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.

GETTING STARTED WITH THE SDK

Explore the SDK at your own pace.

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.

✓ Public documentation without registration✓ Free developer registration; SDK access subject to terms and authorization✓ Discuss a scoped, time-limited beta pilot for your application✓ Commercial licensing before production deployment

YOUR DEVELOPMENT PATH

Explore → Build → Pilot → Deploy

Create free developer account → Discuss a beta pilot or production license →

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

Evaluate the conversational runtime before integrating.

Explore developer-focused capabilities, runtime boundaries, and the steps from a prototype to SDK evaluation.

Developer capabilities → Evaluation process →