objective-cavspeechsynthesizeravspeechutterance

OBJC AVSpeechUtterance writeUtterance how?


I am trying to create a TTS to file in Objc. Since iOS13 can write it to a file. But I'm stuck with writeUtterance:toBufferCallback.

Do someone has an exemple with this function in objc?

[synth speakUtterance:utterance];


Solution

  • Referring to the potential answer in Swift, this would be the Objective-C implementation

    AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
    AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:@"test 123"];
    AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"];
    [utterance setVoice:voice];
    
    __block AVAudioFile *output = nil;
    
    [synthesizer writeUtterance:utterance
               toBufferCallback:^(AVAudioBuffer * _Nonnull buffer) {
        AVAudioPCMBuffer *pcmBuffer = (AVAudioPCMBuffer*)buffer;
        if (!pcmBuffer) {
            NSLog(@"Error");
            return;
        }
        if (pcmBuffer.frameLength != 0) {
            //append buffer to file
            if (output == nil) {
                output = [[AVAudioFile alloc] initForWriting:[NSURL fileURLWithPath:@"test.caf"]
                                                    settings:pcmBuffer.format.settings
                                                commonFormat:AVAudioPCMFormatInt16
                                                 interleaved:NO error:nil];
            }
            [output writeFromBuffer:pcmBuffer error:nil];
        }
    }];