/*
 * Copyright 2022 Bernhard Kölbl
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "asyncinfo.idl";
import "eventtoken.idl";
import "windowscontracts.idl";
import "windows.foundation.idl";
import "windows.globalization.idl";
/*import "windows.phone.idl";*/
/*import "windows.storage.idl";*/

namespace Windows {
    namespace Media {
        namespace SpeechRecognition {
            typedef enum SpeechContinuousRecognitionMode SpeechContinuousRecognitionMode;
            typedef enum SpeechRecognitionAudioProblem SpeechRecognitionAudioProblem;
            typedef enum SpeechRecognitionConfidence SpeechRecognitionConfidence;
            typedef enum SpeechRecognitionConstraintProbability SpeechRecognitionConstraintProbability;
            typedef enum SpeechRecognitionConstraintType SpeechRecognitionConstraintType;
            typedef enum SpeechRecognitionResultStatus SpeechRecognitionResultStatus;
            typedef enum SpeechRecognizerState SpeechRecognizerState;
            interface ISpeechContinuousRecognitionCompletedEventArgs;
            interface ISpeechContinuousRecognitionResultGeneratedEventArgs;
            interface ISpeechContinuousRecognitionSession;
            interface ISpeechRecognitionCompilationResult;
            interface ISpeechRecognitionConstraint;
            interface ISpeechRecognitionHypothesis;
            interface ISpeechRecognitionHypothesisGeneratedEventArgs;
            interface ISpeechRecognitionListConstraint;
            interface ISpeechRecognitionListConstraintFactory;
            interface ISpeechRecognitionQualityDegradingEventArgs;
            interface ISpeechRecognitionResult;
            interface ISpeechRecognitionResult2;
            interface ISpeechRecognitionSemanticInterpretation;
            interface ISpeechRecognizer;
            interface ISpeechRecognizer2;
            interface ISpeechRecognizerFactory;
            interface ISpeechRecognizerStateChangedEventArgs;
            interface ISpeechRecognizerStatics;
            interface ISpeechRecognizerStatics2;
            interface ISpeechRecognizerTimeouts;
            interface ISpeechRecognizerUIOptions;
            runtimeclass SpeechContinuousRecognitionCompletedEventArgs;
            runtimeclass SpeechContinuousRecognitionResultGeneratedEventArgs;
            runtimeclass SpeechContinuousRecognitionSession;
            runtimeclass SpeechRecognitionCompilationResult;
            runtimeclass SpeechRecognitionHypothesis;
            runtimeclass SpeechRecognitionHypothesisGeneratedEventArgs;
            runtimeclass SpeechRecognitionListConstraint;
            runtimeclass SpeechRecognitionQualityDegradingEventArgs;
            runtimeclass SpeechRecognitionResult;
            runtimeclass SpeechRecognitionSemanticInterpretation;
            runtimeclass SpeechRecognizer;
            runtimeclass SpeechRecognizerStateChangedEventArgs;
            runtimeclass SpeechRecognizerTimeouts;
            runtimeclass SpeechRecognizerUIOptions;
        }
    }
}

namespace Windows {
    namespace Media {
        namespace SpeechRecognition {
            declare {
                interface Windows.Foundation.Collections.IIterable<Windows.Media.SpeechRecognition.ISpeechRecognitionConstraint*>;
                interface Windows.Foundation.Collections.IIterator<Windows.Media.SpeechRecognition.ISpeechRecognitionConstraint*>;
                interface Windows.Foundation.Collections.IVectorView<Windows.Media.SpeechRecognition.ISpeechRecognitionConstraint*>;
                interface Windows.Foundation.Collections.IVector<Windows.Media.SpeechRecognition.ISpeechRecognitionConstraint*>;
                interface Windows.Foundation.Collections.IIterable<Windows.Media.SpeechRecognition.SpeechRecognitionResult*>;
                interface Windows.Foundation.Collections.IIterator<Windows.Media.SpeechRecognition.SpeechRecognitionResult*>;
                interface Windows.Foundation.Collections.IVectorView<Windows.Media.SpeechRecognition.SpeechRecognitionResult*>;
                interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Media.SpeechRecognition.SpeechRecognitionCompilationResult*>;
                interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Media.SpeechRecognition.SpeechRecognitionResult*>;
                interface Windows.Foundation.IAsyncOperation<Windows.Media.SpeechRecognition.SpeechRecognitionCompilationResult*>;
                interface Windows.Foundation.IAsyncOperation<Windows.Media.SpeechRecognition.SpeechRecognitionResult*>;
                interface Windows.Foundation.TypedEventHandler<Windows.Media.SpeechRecognition.SpeechContinuousRecognitionSession*, Windows.Media.SpeechRecognition.SpeechContinuousRecognitionCompletedEventArgs*>;
                interface Windows.Foundation.TypedEventHandler<Windows.Media.SpeechRecognition.SpeechContinuousRecognitionSession*, Windows.Media.SpeechRecognition.SpeechContinuousRecognitionResultGeneratedEventArgs*>;
                interface Windows.Foundation.TypedEventHandler<Windows.Media.SpeechRecognition.SpeechRecognizer*, Windows.Media.SpeechRecognition.SpeechRecognitionHypothesisGeneratedEventArgs*>;
                interface Windows.Foundation.TypedEventHandler<Windows.Media.SpeechRecognition.SpeechRecognizer*, Windows.Media.SpeechRecognition.SpeechRecognitionQualityDegradingEventArgs*>;
                interface Windows.Foundation.TypedEventHandler<Windows.Media.SpeechRecognition.SpeechRecognizer*, Windows.Media.SpeechRecognition.SpeechRecognizerStateChangedEventArgs*>;
            }
        }
    }
}

namespace Windows {
    namespace Media {
        namespace SpeechRecognition {

            [contract(Windows.Foundation.UniversalApiContract, 1.0)]
            enum SpeechContinuousRecognitionMode
            {
                Default = 0,
                PauseOnRecognition = 1,
            };

            [contract(Windows.Foundation.UniversalApiContract, 1.0)]
            enum SpeechRecognitionAudioProblem
            {
                None = 0,
                TooNoisy = 1,
                NoSignal = 2,
                TooLoud = 3,
                TooQuiet = 4,
                TooFast = 5,
                TooSlow = 6,
            };

            [contract(Windows.Foundation.UniversalApiContract, 1.0)]
            enum SpeechRecognitionConfidence
            {
                High = 0,
                Medium = 1,
                Low = 2,
                Rejected = 3,
            };

            [contract(Windows.Foundation.UniversalApiContract, 1.0)]
            enum SpeechRecognitionConstraintProbability
            {
                Default = 0,
                Min = 1,
                Max = 2,
            };

            [contract(Windows.Foundation.UniversalApiContract, 1.0)]
            enum SpeechRecognitionConstraintType
            {
                Topic = 0,
                List = 1,
                Grammar = 2,
                VoiceCommandDefinition = 3,
            };

            [contract(Windows.Foundation.UniversalApiContract, 1.0)]
            enum SpeechRecognitionResultStatus
            {
                Success = 0,
                TopicLanguageNotSupported = 1,
                GrammarLanguageMismatch = 2,
                GrammarCompilationFailure = 3,
                AudioQualityFailure = 4,
                UserCanceled = 5,
                Unknown = 6,
                [contract(Windows.Foundation.UniversalApiContract, 1.0)]
                TimeoutExceeded = 7,
                [contract(Windows.Foundation.UniversalApiContract, 1.0)]
                PauseLimitExceeded = 8,
                [contract(Windows.Foundation.UniversalApiContract, 1.0)]
                NetworkFailure = 9,
                [contract(Windows.Foundation.UniversalApiContract, 1.0)]
                MicrophoneUnavailable = 10,
            };

            [contract(Windows.Foundation.UniversalApiContract, 1.0)]
            enum SpeechRecognizerState
            {
                Idle = 0,
                Capturing = 1,
                Processing = 2,
                SoundStarted = 3,
                SoundEnded = 4,
                [contract(Windows.Foundation.UniversalApiContract, 1.0)]
                SpeechDetected = 5,
                [contract(Windows.Foundation.UniversalApiContract, 1.0)]
                Paused = 6,
            };

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechContinuousRecognitionCompletedEventArgs),
                uuid(e3d069bb-e30c-5e18-424b-7fbe81f8fbd0)
            ]
            interface ISpeechContinuousRecognitionCompletedEventArgs : IInspectable
            {
                [propget] HRESULT Status([out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionResultStatus *value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechContinuousRecognitionResultGeneratedEventArgs),
                uuid(19091e1e-6e7e-5a46-40fb-76594f786504)
            ]
            interface ISpeechContinuousRecognitionResultGeneratedEventArgs : IInspectable
            {
                [propget] HRESULT Result([out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionResult **value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechContinuousRecognitionSession),
                uuid(6a213c04-6614-49f8-99a2-b5e9b3a085c8)
            ]
            interface ISpeechContinuousRecognitionSession : IInspectable
            {
                [propget] HRESULT AutoStopSilenceTimeout([out, retval] Windows.Foundation.TimeSpan *value);
                [propput] HRESULT AutoStopSilenceTimeout([in] Windows.Foundation.TimeSpan value);
                [overload("StartAsync")] HRESULT StartAsync([out, retval] Windows.Foundation.IAsyncAction **action);
                [overload("StartAsync")] HRESULT StartWithModeAsync([in] Windows.Media.SpeechRecognition.SpeechContinuousRecognitionMode mode, [out, retval] Windows.Foundation.IAsyncAction **action);
                HRESULT StopAsync([out, retval] Windows.Foundation.IAsyncAction **action);
                HRESULT CancelAsync([out, retval] Windows.Foundation.IAsyncAction **action);
                HRESULT PauseAsync([out, retval] Windows.Foundation.IAsyncAction **action);
                HRESULT Resume();
                [eventadd] HRESULT Completed(
                    [in] Windows.Foundation.TypedEventHandler<Windows.Media.SpeechRecognition.SpeechContinuousRecognitionSession*, Windows.Media.SpeechRecognition.SpeechContinuousRecognitionCompletedEventArgs*> *value,
                    [out, retval] EventRegistrationToken *token);
                [eventremove] HRESULT Completed([in] EventRegistrationToken token);
                [eventadd] HRESULT ResultGenerated(
                    [in] Windows.Foundation.TypedEventHandler<Windows.Media.SpeechRecognition.SpeechContinuousRecognitionSession*, Windows.Media.SpeechRecognition.SpeechContinuousRecognitionResultGeneratedEventArgs*> *value,
                    [out, retval] EventRegistrationToken *token);
                [eventremove] HRESULT ResultGenerated([in] EventRegistrationToken token);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognitionCompilationResult),
                uuid(407e6c5d-6ac7-4da4-9cc1-2fce32cf7489)
            ]
            interface ISpeechRecognitionCompilationResult : IInspectable
            {
                [propget] HRESULT Status([out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionResultStatus *value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                uuid(79ac1628-4d68-43c4-8911-40dc4101b55b)
            ]
            interface ISpeechRecognitionConstraint : IInspectable
            {
                [propget] HRESULT IsEnabled([out, retval] boolean *value);
                [propput] HRESULT IsEnabled([in] boolean value);
                [propget] HRESULT Tag([out, retval] HSTRING *value);
                [propput] HRESULT Tag([in] HSTRING value);
                [propget] HRESULT Type([out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionConstraintType *value);
                [propget] HRESULT Probability([out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionConstraintProbability *value);
                [propput] HRESULT Probability([in] Windows.Media.SpeechRecognition.SpeechRecognitionConstraintProbability value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognitionHypothesis),
                uuid(7a7b25b0-99c5-4f7d-bf84-10aa1302b634)
            ]
            interface ISpeechRecognitionHypothesis : IInspectable
            {
                [propget] HRESULT Text([out, retval] HSTRING *value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognitionHypothesisGeneratedEventArgs),
                uuid(55161a7a-8023-5866-411d-1213bb271476)
            ]
            interface ISpeechRecognitionHypothesisGeneratedEventArgs : IInspectable
            {
                [propget] HRESULT Hypothesis([out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionHypothesis **value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint),
                uuid(09c487e9-e4ad-4526-81f2-4946fb481d98)
            ]
            interface ISpeechRecognitionListConstraint : IInspectable
                requires
                    Windows.Media.SpeechRecognition.ISpeechRecognitionConstraint
            {
                [propget] HRESULT Commands([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint),
                uuid(40f3cdc7-562a-426a-9f3b-3b4e282be1d5)
            ]
            interface ISpeechRecognitionListConstraintFactory : IInspectable
            {
                HRESULT Create(
                    [in] Windows.Foundation.Collections.IIterable<HSTRING> *commands,
                    [out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint **listconstraint);

                HRESULT CreateWithTag(
                    [in] Windows.Foundation.Collections.IIterable<HSTRING> *commands,
                    [in] HSTRING tag,
                    [out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint **listconstraint);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognitionQualityDegradingEventArgs),
                uuid(4fe24105-8c3a-4c7e-8d0a-5bd4f5b14ad8)
            ]
            interface ISpeechRecognitionQualityDegradingEventArgs : IInspectable
            {
                [propget] HRESULT Problem([out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionAudioProblem *value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognitionResult),
                uuid(4e303157-034e-4652-857e-d0454cc4beec)
            ]
            interface ISpeechRecognitionResult : IInspectable
            {
                [propget] HRESULT Status([out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionResultStatus *value);
                [propget] HRESULT Text([out, retval] HSTRING *value);
                [propget] HRESULT Confidence([out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionConfidence *value);
                [propget] HRESULT SemanticInterpretation([out, retval] Windows.Media.SpeechRecognition.SpeechRecognitionSemanticInterpretation **value);
                HRESULT GetAlternates([in] UINT32 max_amount, [out, retval] Windows.Foundation.Collections.IVectorView<Windows.Media.SpeechRecognition.SpeechRecognitionResult*> **results);
                [propget] HRESULT Constraint([out, retval] Windows.Media.SpeechRecognition.ISpeechRecognitionConstraint **value);
                [propget] HRESULT RulePath([out, retval] Windows.Foundation.Collections.IVectorView<HSTRING> **value);
                [propget] HRESULT RawConfidence([out, retval] DOUBLE *value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognitionResult),
                uuid(af7ed1ba-451b-4166-a0c1-1ffe84032d03)
            ]
            interface ISpeechRecognitionResult2 : IInspectable
            {
                [propget] HRESULT PhraseStartTime([out, retval] Windows.Foundation.DateTime *value);
                [propget] HRESULT PhraseDuration([out, retval] Windows.Foundation.TimeSpan *value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognitionSemanticInterpretation),
                uuid(aae1da9b-7e32-4c1f-89fe-0c65f486f52e)
            ]
            interface ISpeechRecognitionSemanticInterpretation : IInspectable
            {
                [propget] HRESULT Properties([out, retval] Windows.Foundation.Collections.IMapView<HSTRING, Windows.Foundation.Collections.IVectorView<HSTRING>*> **value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognizer),
                uuid(0bc3c9cb-c26a-40f2-aeb5-8096b2e48073)
            ]
            interface ISpeechRecognizer : IInspectable
                requires
                    Windows.Foundation.IClosable
            {
                [propget] HRESULT CurrentLanguage([out, retval] Windows.Globalization.Language **value);
                [propget] HRESULT Constraints([out, retval] Windows.Foundation.Collections.IVector<Windows.Media.SpeechRecognition.ISpeechRecognitionConstraint*> **value);
                [propget] HRESULT Timeouts([out, retval] Windows.Media.SpeechRecognition.SpeechRecognizerTimeouts **value);
                [propget] HRESULT UIOptions([out, retval] Windows.Media.SpeechRecognition.SpeechRecognizerUIOptions **value);
                HRESULT CompileConstraintsAsync([out, retval] Windows.Foundation.IAsyncOperation<Windows.Media.SpeechRecognition.SpeechRecognitionCompilationResult*> **operation);
                HRESULT RecognizeAsync([out, retval] Windows.Foundation.IAsyncOperation<Windows.Media.SpeechRecognition.SpeechRecognitionResult*> **operation);
                HRESULT RecognizeWithUIAsync([out, retval] Windows.Foundation.IAsyncOperation<Windows.Media.SpeechRecognition.SpeechRecognitionResult*> **operation);
                [eventadd] HRESULT RecognitionQualityDegrading(
                    [in] Windows.Foundation.TypedEventHandler<Windows.Media.SpeechRecognition.SpeechRecognizer*, Windows.Media.SpeechRecognition.SpeechRecognitionQualityDegradingEventArgs*> *handler,
                    [out, retval] EventRegistrationToken *token);
                [eventremove] HRESULT RecognitionQualityDegrading([in] EventRegistrationToken token);
                [eventadd] HRESULT StateChanged(
                    [in] Windows.Foundation.TypedEventHandler<Windows.Media.SpeechRecognition.SpeechRecognizer*, Windows.Media.SpeechRecognition.SpeechRecognizerStateChangedEventArgs*> *handler,
                    [out, retval] EventRegistrationToken *token);
                [eventremove] HRESULT StateChanged([in] EventRegistrationToken token);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognizer),
                uuid(63c9baf1-91e3-4ea4-86a1-7c3867d084a6)
            ]
            interface ISpeechRecognizer2 : IInspectable
            {
                [propget] HRESULT ContinuousRecognitionSession([out, retval] Windows.Media.SpeechRecognition.SpeechContinuousRecognitionSession **value);
                [propget] HRESULT State([out, retval] Windows.Media.SpeechRecognition.SpeechRecognizerState *value);
                HRESULT StopRecognitionAsync([out, retval] Windows.Foundation.IAsyncAction **action);
                [eventadd] HRESULT HypothesisGenerated(
                    [in] Windows.Foundation.TypedEventHandler<Windows.Media.SpeechRecognition.SpeechRecognizer*, Windows.Media.SpeechRecognition.SpeechRecognitionHypothesisGeneratedEventArgs*> *handler,
                    [out, retval] EventRegistrationToken *token);
                [eventremove] HRESULT HypothesisGenerated([in] EventRegistrationToken token);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognizer),
                uuid(60c488dd-7fb8-4033-ac70-d046f64818e1)
            ]
            interface ISpeechRecognizerFactory : IInspectable
            {
                HRESULT Create(
                    [in] Windows.Globalization.Language *language,
                    [out, retval] Windows.Media.SpeechRecognition.SpeechRecognizer **speechrecognizer);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognizerStateChangedEventArgs),
                uuid(563d4f09-ba03-4bad-ad81-ddc6c4dab0c3)
            ]
            interface ISpeechRecognizerStateChangedEventArgs : IInspectable
            {
                [propget] HRESULT State([out, retval] Windows.Media.SpeechRecognition.SpeechRecognizerState *value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognizer),
                uuid(87a35eac-a7dc-4b0b-bcc9-24f47c0b7ebf)
            ]
            interface ISpeechRecognizerStatics : IInspectable
            {
                [propget] HRESULT SystemSpeechLanguage([out, retval] Windows.Globalization.Language **language);
                [propget] HRESULT SupportedTopicLanguages([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Globalization.Language*> **languages);
                [propget] HRESULT SupportedGrammarLanguages([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Globalization.Language*> **languages);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 5.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognizer),
                uuid(1d1b0d95-7565-4ef9-a2f3-ba15162a96cf)
            ]
            interface ISpeechRecognizerStatics2 : IInspectable
            {
                HRESULT TrySetSystemSpeechLanguageAsync([in] Windows.Globalization.Language *language, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognizerTimeouts),
                uuid(2ef76fca-6a3c-4dca-a153-df1bc88a79af)
            ]
            interface ISpeechRecognizerTimeouts : IInspectable
            {
                [propget] HRESULT InitialSilenceTimeout([out, retval] Windows.Foundation.TimeSpan *value);
                [propput] HRESULT InitialSilenceTimeout([in] Windows.Foundation.TimeSpan value);
                [propget] HRESULT EndSilenceTimeout([out, retval] Windows.Foundation.TimeSpan *value);
                [propput] HRESULT EndSilenceTimeout([in] Windows.Foundation.TimeSpan value);
                [propget] HRESULT BabbleTimeout([out, retval] Windows.Foundation.TimeSpan *value);
                [propput] HRESULT BabbleTimeout([in] Windows.Foundation.TimeSpan value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                exclusiveto(Windows.Media.SpeechRecognition.SpeechRecognizerUIOptions),
                uuid(7888d641-b92b-44ba-a25f-d1864630641f)
            ]
            interface ISpeechRecognizerUIOptions : IInspectable
            {
                [propget] HRESULT ExampleText([out, retval] HSTRING *value);
                [propput] HRESULT ExampleText([in] HSTRING value);
                [propget] HRESULT AudiblePrompt([out, retval] HSTRING *value);
                [propput] HRESULT AudiblePrompt([in] HSTRING value);
                [propget] HRESULT IsReadBackEnabled([out, retval] boolean *value);
                [propput] HRESULT IsReadBackEnabled([in] boolean value);
                [propget] HRESULT ShowConfirmation([out, retval] boolean *value);
                [propput] HRESULT ShowConfirmation([in] boolean value);
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile),
                threading(both)
            ]
            runtimeclass SpeechContinuousRecognitionCompletedEventArgs
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechContinuousRecognitionCompletedEventArgs;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile),
                threading(both)
            ]
            runtimeclass SpeechContinuousRecognitionResultGeneratedEventArgs
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechContinuousRecognitionResultGeneratedEventArgs;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile),
                threading(both)
            ]
            runtimeclass SpeechContinuousRecognitionSession
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechContinuousRecognitionSession;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile)
            ]
            runtimeclass SpeechRecognitionCompilationResult
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognitionCompilationResult;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile),
                threading(both)
            ]
            runtimeclass SpeechRecognitionHypothesis
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognitionHypothesis;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile),
                threading(both)
            ]
            runtimeclass SpeechRecognitionHypothesisGeneratedEventArgs
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognitionHypothesisGeneratedEventArgs;
            }

            [
                activatable(Windows.Media.SpeechRecognition.ISpeechRecognitionListConstraintFactory, Windows.Foundation.UniversalApiContract, 1.0),
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile)
            ]
            runtimeclass SpeechRecognitionListConstraint
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognitionListConstraint;
                interface Windows.Media.SpeechRecognition.ISpeechRecognitionConstraint;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile)
            ]
            runtimeclass SpeechRecognitionQualityDegradingEventArgs
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognitionQualityDegradingEventArgs;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile)
            ]
            runtimeclass SpeechRecognitionResult
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognitionResult;
                [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Media.SpeechRecognition.ISpeechRecognitionResult2;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile)
            ]
            runtimeclass SpeechRecognitionSemanticInterpretation
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognitionSemanticInterpretation;
            }

            [
                activatable(Windows.Foundation.UniversalApiContract, 1.0),
                activatable(Windows.Media.SpeechRecognition.ISpeechRecognizerFactory, Windows.Foundation.UniversalApiContract, 1.0),
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile),
                static(Windows.Media.SpeechRecognition.ISpeechRecognizerStatics, Windows.Foundation.UniversalApiContract, 1.0),
                static(Windows.Media.SpeechRecognition.ISpeechRecognizerStatics2, Windows.Foundation.UniversalApiContract, 5.0)
            ]
            runtimeclass SpeechRecognizer
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognizer;
                interface Windows.Foundation.IClosable;
                [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Media.SpeechRecognition.ISpeechRecognizer2;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile)
            ]
            runtimeclass SpeechRecognizerStateChangedEventArgs
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognizerStateChangedEventArgs;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile)
            ]
            runtimeclass SpeechRecognizerTimeouts
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognizerTimeouts;
            }

            [
                contract(Windows.Foundation.UniversalApiContract, 1.0),
                marshaling_behavior(agile)
            ]
            runtimeclass SpeechRecognizerUIOptions
            {
                [default] interface Windows.Media.SpeechRecognition.ISpeechRecognizerUIOptions;
            }
        }
    }
}
