// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.speech;

[Discoverable]
protocol SpeechToText {
    // Starts capturing speech from the microphone.
    BeginCapture(TranscriptionListener transcription_listener);

    // Begins hotword detection. Detected hotword utterances are reported on the
    // given listener.
    ListenForHotword(HotwordListener hotword_listener);
};

// Represents an active transcription session. Either side may close this
// interface to indicate that transcription should stop. If the transcription is
// unexpectedly closed before |OnReady| is called, the implementer should treat
// it as an error (in such cases, |OnError| is called).
protocol TranscriptionListener {
    // Indicates that capture has begun. Prior to this, parts of the system may
    // not have been initialized and audio may have been dropped. No calls to
    // |OnTranscriptUpdate| will occur before |OnReady| is called.
    OnReady();

    // Receives updated transcripts. Each call receives the most likely
    // transcription of the entire utterance at that time. Previously transcribed
    // text may mutate in response to later input.
    OnTranscriptUpdate(string spoken_text);

    // Provides periodic updates on the user's speech signal power, when the
    // microphone is open and streaming to the backend.
    // |speech_level| is instantaneous speech power, in decibels (negative).
    OnSpeechLevelUpdate(float32 speech_level);

    // An error occurred before or during transcription. Depending on the nature
    // of the error, this may occur before |OnReady| is called, and |OnReady| may
    // never be called. This binding will be closed immediately after sending this
    // message.
    OnError();
};

// Listens for hotwords. Each detected hotword utterance triggers |OnHotword|.
// Closure of this handle by the speech service indicates an error.
protocol HotwordListener {
    // Indicates that capture has begun. Prior to this, parts of the system may
    // not have been initialized and audio may have been dropped. No calls to
    // |OnHotword| will occur before |OnReady| is called.
    OnReady();

    // Called for each detected hotword utterance.
    OnHotword();
};
