Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions SpeechSynthesizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@

@interface SpeechSynthesizer : NSObject <RCTBridgeModule, AVSpeechSynthesizerDelegate>
@property (nonatomic, strong) AVSpeechSynthesizer *synthesizer;
@property (nonatomic) RCTResponseSenderBlock cb;



@end
29 changes: 20 additions & 9 deletions SpeechSynthesizer.ios.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ var NativeSpeechSynthesizer = NativeModules.SpeechSynthesizer;
*/

var SpeechSynthesizer = {
speak(options) {
return new Promise(function(resolve, reject) {
NativeSpeechSynthesizer.speakUtterance(options, function(error, success) {
speak(options: { [string]: string | number }) {
return new Promise(function (resolve, reject) {
NativeSpeechSynthesizer.speakUtterance(options, function (error, success) {
if (error) {
return reject(error);
}
Expand All @@ -25,15 +25,26 @@ var SpeechSynthesizer = {
});
},

speakWithFinish(options: { [string]: string | number }) {
return new Promise(function (resolve, reject) {
NativeSpeechSynthesizer.speakUtteranceWithFinish(options, function (error, success) {
if (error) {
return reject(error);
}
resolve(true);
});
});
},

stop: NativeSpeechSynthesizer.stopSpeakingAtBoundary,

pause: NativeSpeechSynthesizer.pauseSpeakingAtBoundary,

resume: NativeSpeechSynthesizer.continueSpeakingAtBoundary,

isPaused() {
return new Promise(function(resolve, reject) {
NativeSpeechSynthesizer.paused(function(error, paused) {
return new Promise(function (resolve, reject) {
NativeSpeechSynthesizer.paused(function (error, paused) {
if (error) {
return reject(error);
}
Expand All @@ -48,8 +59,8 @@ var SpeechSynthesizer = {
},

isSpeaking() {
return new Promise(function(resolve, reject) {
NativeSpeechSynthesizer.speaking(function(error, speaking) {
return new Promise(function (resolve, reject) {
NativeSpeechSynthesizer.speaking(function (error, speaking) {
if (error) {
return reject(error);
}
Expand All @@ -64,8 +75,8 @@ var SpeechSynthesizer = {
},

supportedVoices() {
return new Promise(function(resolve, reject) {
NativeSpeechSynthesizer.speechVoices(function(error, locales) {
return new Promise(function (resolve, reject) {
NativeSpeechSynthesizer.speechVoices(function (error, locales) {
if (error) {
return reject(error);
}
Expand Down
56 changes: 56 additions & 0 deletions SpeechSynthesizer.m
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,56 @@ @implementation SpeechSynthesizer
callback(@[[NSNull null], @true]);
}

// SpeakWithFinish
RCT_EXPORT_METHOD(speakUtteranceWithFinish:(NSDictionary *)args callback:(RCTResponseSenderBlock)callback)
{
// Error if self.synthesizer was already initialized
if (self.synthesizer || self.cb) {
return callback(@[RCTMakeError(@"There is a speech in progress. Use the `paused` method to know if it's paused.", nil, nil)]);
}

self.cb = callback;

// Set args to variables
NSString *text = args[@"text"];
NSString *voice = args[@"voice"];
NSNumber *rate = args[@"rate"];

// Error if no text is passed
if (!text) {
RCTLogError(@"[Speech] You must specify a text to speak.");
return;
}

// Set default voice
NSString *voiceLanguage;

// Set voice if provided
if (voice) {
voiceLanguage = voice;

// Fallback to en-US
} else {
voiceLanguage = @"en-US";
}

// Setup utterance and voice
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:text];

utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:voiceLanguage];

if (rate) {
utterance.rate = [rate doubleValue];
}

self.synthesizer = [[AVSpeechSynthesizer alloc] init];
self.synthesizer.delegate = self;

// Speak
[self.synthesizer speakUtterance:utterance];
}


// Stops synthesizer
RCT_EXPORT_METHOD(stopSpeakingAtBoundary)
{
Expand Down Expand Up @@ -116,6 +166,12 @@ -(void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtter
{
NSLog(@"Speech finished");
self.synthesizer = nil;

if (self.cb) {
// Return that the speach has started
self.cb(@[[NSNull null], @true]);
self.cb = nil;
}
}

// Started Handler
Expand Down