// 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]
interface SpeechToText {
    // Starts capturing speech from the microphone.
    1: BeginCapture(TranscriptionListener transcription_listener);

    // Begins hotword detection. Detected hotword utterances are reported on the
    // given listener.
    2: 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).
interface 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.
    1: 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.
    2: 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).
    4: 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.
    3: OnError();
};

// Listens for hotwords. Each detected hotword utterance triggers |OnHotword|.
// Closure of this handle by the speech service indicates an error.
interface 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.
    1: OnReady();

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