Expand Minimize Picture-in-picture Power Device Status Voice Recognition Skip Back Skip Forward Minus Plus Play Search
Documentation
Sidebar

Playing Spoken Feedback

Since your user will be driving while interacting with your SDL app, speech phrases can provide important feedback to your user. At any time during your app's lifecycle you can send a speech phrase using the SDLSpeak request and the head unit's text-to-speech (TTS) engine will produce synthesized speech from your provided text.

When using the SDLSpeak RPC, you will receive a response from the head unit once the operation has completed. From the response you will be able to tell if the speech was completed, interrupted, rejected or aborted. It is important to keep in mind that a speech request can interrupt another on-going speech request. If you want to chain speech requests you must wait for for the current speech request to finish before sending the next speech request.

Creating the Speak Request

The speech request you send can simply be a text phrase, which will be played back in accordance with the user's current language settings, or it can consist of phoneme specifications to direct SDL’s TTS engine to speak a language-independent, speech-sculpted phrase. It is also possible to play a pre-recorded sound file (such as an MP3) using the speech request. For more information on how to play a sound file please refer to Playing Audio Indications.

Getting Head Unit Speech Capabilities

To get the head unit's supported speech capabilities, check the SDLSystemCapabilityManager.speechCapabilities after successfully connecting to the head unit. Below is a list of commonly supported speech capabilities.

Speech Capability Description
Text Text phrases
SAPI Phonemes Microsoft speech synthesis API
File A pre-recorded sound file

Text Phrase

Objective-C
SDLSpeak *speak = [[SDLSpeak alloc] initWithTTS:@"hello"];
Swift
let speech = SDLSpeak(tts: "hello")

SAPI Phonemes Phrase

Objective-C
NSArray<SDLTTSChunk *> *sapiPhonemesTTSChunks = [SDLTTSChunk sapiChunksFromString:@"h eh - l ow 1"];
SDLSpeak *speak = [[SDLSpeak alloc] initWithTTSChunks:sapiPhonemesTTSChunks];
Swift
let sapiPhonemesTTSChunks = SDLTTSChunk.sapiChunks(from: "h eh - l ow 1")
let speech = SDLSpeak(ttsChunks: sapiPhonemesTTSChunk)

Sending the Speak Request

Objective-C
[self.sdlManager sendRequest:speak withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
     if (!response.success.boolValue) { 
        if ([response.resultCode isEqualToEnum:SDLResultDisallowed]) {
            <#The app does not have permission to use the speech request#>
        } else if ([response.resultCode isEqualToEnum:SDLResultRejected]) {
            <#The request was rejected because a higher priority request is in progress#>
        } else if ([response.resultCode isEqualToEnum:SDLResultAborted]) {
            <#The request was aborted by another higher priority request#>
        } else {
            <#Some other error occurred#>
        }

        return;
    }

    <#Speech was successfully spoken#>
}];
Swift
sdlManager.send(request: speech) { (request, response, error) in
    guard let response = response as? SDLSpeakResponse else { return }
    guard response?.success.boolValue == true else {
        switch response.resultCode {
        case .disallowed:
            <#The app does not have permission to use the speech request#>
        case .rejected:
            <#The request was rejected because a higher priority request is in progress#>
        case .aborted:
            <#The request was aborted by another higher priority request#>
        default:
            <#Some other error occurred#>
        }
        return
    }

    <#Speech was successfully spoken#>
}
View on GitHub.com
Previous Section Next Section