GitBucket
4.6.0
Toggle navigation
Sign in
Files
Branches
1
Tags
Issues
Pull Requests
Labels
Milestones
Wiki
Forks
12255
/
react-native-hi-baidu-tts
Browse code
1、speak添加回调事件
2、ios初始化声音6
master
1 parent
8f99f05
commit
6f67e11d8c28ba7a045b2adbb4846c904979276d
xiaobaoafei
authored
on 6 May 2022
Showing
5 changed files
ios/HiBaiduTts.m
ios/HiSpeechSynthesizer.h
ios/HiSpeechSynthesizer.m
package.json
src/index.tsx
Ignore Space
Show notes
View
ios/HiBaiduTts.m
#import "HiBaiduTts.h" #import "HiSpeechSynthesizer.h" #import <Foundation/Foundation.h> @interface HiBaiduTts () <HiSpeechSynthesizerDelegate> @property(nonatomic,strong)HiSpeechSynthesizer *speechSynthesizer; @end @implementation HiBaiduTts - (void)willRemoveAllTexts:(nonnull NSArray *)texts error:(nullable NSError *)error { for (int i=0; i<[texts count]; i++) { NSDictionary *text = texts[i]; RCTPromiseRejectBlock reject = [text objectForKey:@"reject"]; if(reject)reject(@"error",@"cancel",error); } } - (void)didEndSpeakText:(nonnull NSDictionary *)text{ RCTPromiseResolveBlock resolve = [text objectForKey:@"resolve"]; if(resolve)resolve(@{@"success" : @(true)}); } RCT_EXPORT_MODULE() // Example method // See // https://reactnative.dev/docs/native-modules-ios RCT_EXPORT_METHOD(initSDK:(NSString *)apiKey secretKey:(NSString *)secretKey appId:(NSString *)appId) { if(!_speechSynthesizer){ _speechSynthesizer = [[HiSpeechSynthesizer alloc] initApiKey:apiKey secretKey:secretKey]; _speechSynthesizer.delegate = self; [_speechSynthesizer setSpeed:@(6)]; } } RCT_REMAP_METHOD(speak,text:(NSString *)text resolve:(RCTPromiseResolveBlock )resolve reject:(RCTPromiseRejectBlock )reject) { if(_speechSynthesizer){ NSMutableDictionary *dic = [_speechSynthesizer synthesizeText:text]; if(dic){ if(resolve){ [dic setObject:[resolve copy] forKey:@"resolve"]; if(reject)[dic setObject:[reject copy]forKey:@"reject"]; } } else { if(reject) reject(@"speak fail!", nil, nil); } } } RCT_EXPORT_METHOD(setSpeaker:(NSString *)speaker) { if(_speechSynthesizer){ [_speechSynthesizer setSpeaker:speaker]; } } RCT_EXPORT_METHOD(setVolume:(nonnull NSNumber *)value) { if(_speechSynthesizer){ [_speechSynthesizer setVolume:value]; } } RCT_EXPORT_METHOD(setSpeed:(nonnull NSNumber *)value) { if(_speechSynthesizer){ [_speechSynthesizer setSpeed:value]; } } RCT_EXPORT_METHOD(setPitch:(nonnull NSNumber *)value) { if(_speechSynthesizer){ [_speechSynthesizer setPitch:value]; } } RCT_EXPORT_METHOD(setAudioSessionCategory:(nonnull NSNumber *)category) { if(_speechSynthesizer){ [_speechSynthesizer setAudioSessionCategory:category]; } } RCT_EXPORT_METHOD(setAudioSessionEnable:(nonnull NSNumber *)value) { if(_speechSynthesizer){ [_speechSynthesizer setAudioSessionEnable:value]; } } RCT_EXPORT_METHOD(cancel) { if(_speechSynthesizer){ [_speechSynthesizer cancel]; } } - (dispatch_queue_t)methodQueue { return dispatch_get_main_queue(); } @end
#import "HiBaiduTts.h" #import "HiSpeechSynthesizer.h" @interface HiBaiduTts () @property(nonatomic,strong)HiSpeechSynthesizer *speechSynthesizer; @end @implementation HiBaiduTts RCT_EXPORT_MODULE() // Example method // See // https://reactnative.dev/docs/native-modules-ios RCT_EXPORT_METHOD(initSDK:(NSString *)apiKey secretKey:(NSString *)secretKey) { if(!_speechSynthesizer){ _speechSynthesizer = [[HiSpeechSynthesizer alloc] initApiKey:apiKey secretKey:secretKey]; } } RCT_EXPORT_METHOD(speak:(NSString *)text) { if(_speechSynthesizer){ [_speechSynthesizer synthesizeText:text]; } } RCT_EXPORT_METHOD(setSpeaker:(NSString *)speaker) { if(_speechSynthesizer){ [_speechSynthesizer setSpeaker:speaker]; } } RCT_EXPORT_METHOD(setVolume:(NSNumber *)value) { if(_speechSynthesizer){ [_speechSynthesizer setVolume:value]; } } RCT_EXPORT_METHOD(setSpeed:(NSNumber *)value) { if(_speechSynthesizer){ [_speechSynthesizer setSpeed:value]; } } RCT_EXPORT_METHOD(setPitch:(NSNumber *)value) { if(_speechSynthesizer){ [_speechSynthesizer setPitch:value]; } } RCT_EXPORT_METHOD(setAudioSessionCategory:(NSNumber *)category) { if(_speechSynthesizer){ [_speechSynthesizer setAudioSessionCategory:category]; } } RCT_EXPORT_METHOD(setAudioSessionEnable:(NSNumber *)value) { if(_speechSynthesizer){ [_speechSynthesizer setAudioSessionEnable:value]; } } RCT_EXPORT_METHOD(cancel) { if(_speechSynthesizer){ [_speechSynthesizer cancel]; } } - (dispatch_queue_t)methodQueue { return dispatch_get_main_queue(); } @end
Ignore Space
Show notes
View
ios/HiSpeechSynthesizer.h
// // HiSpeechSynthesizer.h // HiBaiduTts // // Created by 连仁辉 on 2022/4/22. // Copyright © 2022 Facebook. All rights reserved. // #import <Foundation/Foundation.h> #import "BDSSpeechSynthesizerDelegate.h" #import "BDS_EttsModelManagerInterface.h" #import "BDSTTSEventManager.h" @protocol HiSpeechSynthesizerDelegate - (void)willRemoveAllTexts:(nonnull NSArray *)texts error:(nullable NSError *)error; - (void)didEndSpeakText:(nonnull NSDictionary *)text; @end NS_ASSUME_NONNULL_BEGIN @interface HiSpeechSynthesizer : NSObject <BDSSpeechSynthesizerDelegate> @property(assign,nonatomic)id<HiSpeechSynthesizerDelegate>delegate; - (instancetype)initApiKey:(NSString *)apiKey secretKey:(NSString *)secretKey; - (nullable NSMutableDictionary*)synthesizeText:(NSString *)text; - (void)setSpeaker:(NSString *)speaker; - (void)setVolume:(NSNumber *)value; - (void)setSpeed:(NSNumber *)value; - (void)setPitch:(NSNumber *)value; - (void)setAudioSessionEnable:(NSNumber *)value; - (void)setAudioSessionCategory:(NSNumber *)category; - (void)pauseOrResume; - (void)cancel; - (void)releaseInstance; + (BOOL)isFileSynthesisEnabled; + (BOOL)isSpeakEnabled; + (void)setFileSynthesisEnabled:(BOOL)isEnabled; + (void)setSpeakEnabled:(BOOL)isEnabled; @end NS_ASSUME_NONNULL_END
// // HiSpeechSynthesizer.h // HiBaiduTts // // Created by 连仁辉 on 2022/4/22. // Copyright © 2022 Facebook. All rights reserved. // #import <Foundation/Foundation.h> #import "BDSSpeechSynthesizerDelegate.h" #import "BDS_EttsModelManagerInterface.h" #import "BDSTTSEventManager.h" NS_ASSUME_NONNULL_BEGIN @interface HiSpeechSynthesizer : NSObject <BDSSpeechSynthesizerDelegate> - (instancetype)initApiKey:(NSString *)apiKey secretKey:(NSString *)secretKey; - (void)synthesizeText:(NSString *)text; - (void)setSpeaker:(NSString *)speaker; - (void)pauseOrResume; - (void)cancel; - (void)releaseInstance; + (BOOL)isFileSynthesisEnabled; + (BOOL)isSpeakEnabled; + (void)setFileSynthesisEnabled:(BOOL)isEnabled; + (void)setSpeakEnabled:(BOOL)isEnabled; @end NS_ASSUME_NONNULL_END
Ignore Space
Show notes
View
ios/HiSpeechSynthesizer.m
// // HiSpeechSynthesizer.m // HiBaiduTts // // Created by 连仁辉 on 2022/4/22. // Copyright © 2022 Facebook. All rights reserved. // #import "HiSpeechSynthesizer.h" #import "BDSSpeechSynthesizer.h" #import "TTDFileReader.h" #import "BDSSpeechSynthesizerParams.h" #import <AVFoundation/AVFoundation.h> #define READ_SYNTHESIS_TEXT_FROM_FILE (NO) static BOOL isSpeak = YES; static BOOL textFromFile = READ_SYNTHESIS_TEXT_FROM_FILE; static BOOL displayAllSentences = !READ_SYNTHESIS_TEXT_FROM_FILE; @interface HiSpeechSynthesizer () @property (nonatomic,assign)BOOL pauseOrResumeEnable; @property (nonatomic,assign)BOOL cancelEnable; @property (nonatomic,copy)NSString* apiKey; @property (nonatomic,copy)NSString* secretKey; @property (nonatomic,strong)NSMutableArray* synthesisTexts; @property (nonatomic,strong)NSMutableArray* addTextQueue; /*used with textFromFile*/ @end @implementation HiSpeechSynthesizer + (BOOL)isFileSynthesisEnabled{ return textFromFile; } + (BOOL)isSpeakEnabled{ return isSpeak; } + (void)setFileSynthesisEnabled:(BOOL)isEnabled{ textFromFile = isEnabled; displayAllSentences = !textFromFile; } + (void)setSpeakEnabled:(BOOL)isEnabled{ isSpeak = isEnabled; } - (instancetype)initApiKey:(NSString *)apiKey secretKey:(NSString *)secretKey { self = [super init]; if(self){ self.synthesisTexts = [[NSMutableArray alloc] init]; self.apiKey = apiKey; self.secretKey = secretKey; self.pauseOrResumeEnable = FALSE; self.cancelEnable = FALSE; [self configureSDK]; } return self; } - (void)setSpeaker:(NSString *)speaker { NSError *err = [[BDSSpeechSynthesizer sharedInstance] setSynthParam:speaker forKey:BDS_SYNTHESIZER_PARAM_SPEAKER]; if(err){ [self displayError:err withTitle:@"Failed set online TTS speaker"]; } } - (void)setVolume:(NSNumber *)value{ NSError* err = [[BDSSpeechSynthesizer sharedInstance] setSynthParam:value forKey:BDS_SYNTHESIZER_PARAM_VOLUME]; if(err){ [self displayError:err withTitle:@"Failed set synth volume"]; } } - (void)setSpeed:(NSNumber *)value{ NSError* err = [[BDSSpeechSynthesizer sharedInstance] setSynthParam:value forKey:BDS_SYNTHESIZER_PARAM_SPEED]; if(err){ [self displayError:err withTitle:@"Failed set synth speed"]; } } - (void)setPitch:(NSNumber *)value{ NSError* err = [[BDSSpeechSynthesizer sharedInstance] setSynthParam:value forKey:BDS_SYNTHESIZER_PARAM_PITCH]; if(err){ [self displayError:err withTitle:@"Failed set synth pitch"]; } } - (void)setAudioSessionEnable:(NSNumber *)value { NSError* err = [[BDSSpeechSynthesizer sharedInstance] setSynthParam:value forKey:BDS_SYNTHESIZER_PARAM_ENABLE_AVSESSION_MGMT]; if(err){ [self displayError:err withTitle:@"Failed set synth session enable"]; } } - (void)setAudioSessionCategory:(NSNumber *)category{ int _category = category.intValue; NSString *avCategory = nil; switch (_category) { case 0: avCategory = AVAudioSessionCategoryAmbient; break; case 1: avCategory = AVAudioSessionCategorySoloAmbient; break; case 2: avCategory = AVAudioSessionCategoryPlayback; break; case 3: avCategory = AVAudioSessionCategoryPlayAndRecord; break; default: break; } if (avCategory) { [[BDSSpeechSynthesizer sharedInstance] setAudioSessionCategory:avCategory]; // [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; } } - (NSMutableArray *)addTextQueue { if(!_addTextQueue){ _addTextQueue = [[NSMutableArray alloc] init]; } return _addTextQueue; } -(void)configureSDK{ NSLog(@"TTS version info: %@", [BDSSpeechSynthesizer version]); [BDSSpeechSynthesizer setLogLevel:BDS_PUBLIC_LOG_VERBOSE]; [[BDSSpeechSynthesizer sharedInstance] setSynthesizerDelegate:self]; [self configureOnlineTTS]; } -(void)configureOnlineTTS{ [[BDSSpeechSynthesizer sharedInstance] setApiKey:self.apiKey withSecretKey:self.secretKey]; [[BDSSpeechSynthesizer sharedInstance] setSynthParam:@(BDS_SYNTHESIZER_SPEAKER_FEMALE) forKey:BDS_SYNTHESIZER_PARAM_SPEAKER]; [[BDSSpeechSynthesizer sharedInstance] setSynthParam:@(7) forKey:BDS_SYNTHESIZER_PARAM_SPEED]; } -(void)configureOfflineTTS{ } -(void)logTitle:(NSString *)title message:(NSString *)message { NSLog(@"error: %@ detail: %@",title,message); } -(void)displayError:(NSError*)error withTitle:(NSString*)title{ NSString* errMessage = error.localizedDescription; NSLog(@"error: %@ detail: %@",title,errMessage); } -(void)updateSynthProgress{ // [self.SynthesizeTextProgressView setText:nil]; NSMutableAttributedString *str = [[NSMutableAttributedString alloc] init]; if(displayAllSentences){ for(NSDictionary* contentDict in self.synthesisTexts){ [str appendAttributedString:[contentDict objectForKey:@"TEXT"]]; } } else{ if(self.synthesisTexts.count > 0){ NSDictionary* contentDict = [self.synthesisTexts objectAtIndex:0]; [str appendAttributedString:[contentDict objectForKey:@"TEXT"]]; } } // [self.SynthesizeTextProgressView setAttributedText:str]; } -(void)addFileTextLoop { if(self.addTextQueue.count > 0){ NSAttributedString* string = [[NSAttributedString alloc] initWithString:[self.addTextQueue objectAtIndex:0]]; [self.addTextQueue removeObjectAtIndex:0]; NSInteger sentenceID; NSError* err = nil; if(isSpeak) sentenceID = [[BDSSpeechSynthesizer sharedInstance] speakSentence:[string string] withError:&err]; else sentenceID = [[BDSSpeechSynthesizer sharedInstance] synthesizeSentence:[string string] withError:&err]; if(err == nil){ NSMutableDictionary *addedString = [[NSMutableDictionary alloc] initWithObjects:@[string, [NSNumber numberWithInteger:sentenceID], [NSNumber numberWithInteger:0], [NSNumber numberWithInteger:0]] forKeys:@[@"TEXT", @"ID", @"SPEAK_LEN", @"SYNTH_LEN"]]; [self.synthesisTexts addObject:addedString]; [self updateSynthProgress]; if(self.synthesisTexts.count == 1){ self.cancelEnable = YES; self.pauseOrResumeEnable = YES; } } else{ [self displayError:err withTitle:@"Add sentence Error"]; [self.addTextQueue removeAllObjects]; } } if(self.addTextQueue.count > 0){ [self performSelector:@selector(addFileTextLoop) withObject:nil afterDelay:0.2]; } } - (void)synthesizeFile:(NSString *)text_file { if(textFromFile){ if(text_file == nil){ NSString *domain = @"cn.histron"; NSString *desc = [NSString stringWithFormat:@"Couldn't find text file \"%@\" from mainBundle",text_file];//NSLocalizedString国际化 NSDictionary *userInfo = @{NSLocalizedDescriptionKey:desc}; NSError *error = [NSError errorWithDomain:domain code:500 userInfo:userInfo]; [self displayError:error withTitle:@"File not found"]; return; } int total = 0; TTDFileReader* reader = [[TTDFileReader alloc] initWithFilePath:text_file]; NSString *line = @""; NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(/*kCFStringEncodingUTF8*/kCFStringEncodingGB_18030_2000); while ( (line = [reader readLineWithEncoding:gbkEncoding]) ) { total++; } total = total*4; int added = 1; // for(int i = 0;i < 4; i++){ reader = [[TTDFileReader alloc] initWithFilePath:text_file]; // NSString *line = @""; // NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(/*kCFStringEncodingUTF8*/kCFStringEncodingGB_18030_2000); while ( (line = [reader readLineWithEncoding:gbkEncoding]) ) { [self.addTextQueue addObject:[NSString stringWithFormat:@"Text %d of %d: %@", added, total, line]]; added++; } // } [self performSelector:@selector(addFileTextLoop) withObject:nil afterDelay:0.2]; } } - (nullable NSMutableDictionary*)synthesizeText:(NSString *)text { if(textFromFile)return nil; //[self.SynthesizeButton setEnabled:NO]; NSAttributedString* string = [[NSAttributedString alloc] initWithString:text]; NSInteger sentenceID; NSError* err = nil; if(isSpeak) sentenceID = [[BDSSpeechSynthesizer sharedInstance] speakSentence:[string string] withError:&err]; else sentenceID = [[BDSSpeechSynthesizer sharedInstance] synthesizeSentence:[string string] withError:&err]; if(err == nil){ NSMutableDictionary *addedString = [[NSMutableDictionary alloc] initWithObjects:@[string, [NSNumber numberWithInteger:sentenceID], [NSNumber numberWithInteger:0], [NSNumber numberWithInteger:0]] forKeys:@[@"TEXT", @"ID", @"SPEAK_LEN", @"SYNTH_LEN"]]; [self.synthesisTexts addObject:addedString]; [self updateSynthProgress]; if(self.synthesisTexts.count == 1){ self.cancelEnable = YES; self.pauseOrResumeEnable = YES; } return addedString; } else{ [self displayError:err withTitle:@"Add sentence Error"]; return nil; } } - (void)pauseOrResume { if([[BDSSpeechSynthesizer sharedInstance] synthesizerStatus] == BDS_SYNTHESIZER_STATUS_PAUSED){ [[BDSSpeechSynthesizer sharedInstance] resume]; }else if([[BDSSpeechSynthesizer sharedInstance] synthesizerStatus] == BDS_SYNTHESIZER_STATUS_WORKING){ [[BDSSpeechSynthesizer sharedInstance] pause]; }else{ [self logTitle:@"Error" message:@"Synthesis doesn't seem to be running so can't pause or resume..."]; self.cancelEnable = NO; self.pauseOrResumeEnable = NO; } } - (void)cancel{ if(self.addTextQueue){ [self.addTextQueue removeAllObjects]; } [[BDSSpeechSynthesizer sharedInstance] cancel]; [self.synthesisTexts removeAllObjects]; [self updateSynthProgress]; self.cancelEnable = NO; self.pauseOrResumeEnable = NO; } - (void)releaseInstance{ [self cancel]; [BDSSpeechSynthesizer releaseInstance]; } -(void)refreshAfterProgressUpdate:(NSMutableDictionary*)updatedSentence{ NSString* totalText = [((NSAttributedString*)[updatedSentence objectForKey:@"TEXT"]) string]; NSInteger readOffset = [[updatedSentence objectForKey:@"SPEAK_LEN"] integerValue]; NSInteger synthOffset = [[updatedSentence objectForKey:@"SYNTH_LEN"] integerValue]; NSLog(@"UPDATE PROGRESS: ReadLen: %ld, SynthLen: %ld, TotalLen: %ld", readOffset, synthOffset, totalText.length); NSRange readRange = NSMakeRange(0, readOffset); NSRange synthRange = NSMakeRange(readOffset, synthOffset-readOffset); NSRange unprocessedRange = NSMakeRange(synthOffset, totalText.length-synthOffset); NSString* readText = [totalText substringWithRange: readRange]; NSString* synthesizeSentenceText = [totalText substringWithRange: synthRange]; NSString* unProcessedText = [totalText substringWithRange: unprocessedRange]; NSLog(@"readText: %@",readText); NSLog(@"synthesizeSentenceText: %@",synthesizeSentenceText); NSLog(@"unProcessedText: %@",unProcessedText); // [updatedSentence setObject:allMessage forKey:@"TEXT"]; // [self updateSynthProgress]; } #pragma mark - implement BDSSpeechSynthesizerDelegate - (void)synthesizerStartWorkingSentence:(NSInteger)SynthesizeSentence{ NSLog(@"Did start synth %ld", SynthesizeSentence); self.cancelEnable = YES; self.pauseOrResumeEnable = YES; } - (void)synthesizerFinishWorkingSentence:(NSInteger)SynthesizeSentence{ NSLog(@"Did finish synth, %ld", SynthesizeSentence); if(!isSpeak){ if(self.synthesisTexts.count > 0 && SynthesizeSentence == [[[self.synthesisTexts objectAtIndex:0] objectForKey:@"ID"] integerValue]){ [self.synthesisTexts removeObjectAtIndex:0]; [self updateSynthProgress]; } else{ NSLog(@"Sentence ID mismatch??? received ID: %ld\nKnown sentences:", (long)SynthesizeSentence); for(NSDictionary* dict in self.synthesisTexts){ NSLog(@"ID: %ld Text:\"%@\"", [[dict objectForKey:@"ID"] integerValue], [((NSAttributedString*)[dict objectForKey:@"TEXT"]) string]); } } if(self.synthesisTexts.count == 0){ self.cancelEnable = NO; self.pauseOrResumeEnable = NO; } } } - (void)synthesizerSpeechStartSentence:(NSInteger)SpeakSentence{ NSLog(@"Did start speak %ld", SpeakSentence); } - (void)synthesizerSpeechEndSentence:(NSInteger)SpeakSentence{ NSLog(@"Did end speak %ld", SpeakSentence); if(self.synthesisTexts.count > 0 && SpeakSentence == [[[self.synthesisTexts objectAtIndex:0] objectForKey:@"ID"] integerValue]){ if(self.delegate)[self.delegate didEndSpeakText:[self.synthesisTexts objectAtIndex:0]]; [self.synthesisTexts removeObjectAtIndex:0]; [self updateSynthProgress]; } else{ NSLog(@"Sentence ID mismatch??? received ID: %ld\nKnown sentences:", (long)SpeakSentence); for(NSDictionary* dict in self.synthesisTexts){ NSLog(@"ID: %ld Text:\"%@\"", [[dict objectForKey:@"ID"] integerValue], [((NSAttributedString*)[dict objectForKey:@"TEXT"]) string]); } } if(self.synthesisTexts.count == 0){ self.cancelEnable = NO; self.pauseOrResumeEnable = NO; } } - (void)synthesizerNewDataArrived:(NSData *)newData DataFormat:(BDSAudioFormat)fmt characterCount:(int)newLength sentenceNumber:(NSInteger)SynthesizeSentence{ NSMutableDictionary* sentenceDict = nil; for(NSMutableDictionary *dict in self.synthesisTexts){ if([[dict objectForKey:@"ID"] integerValue] == SynthesizeSentence){ sentenceDict = dict; break; } } if(sentenceDict == nil){ NSLog(@"Sentence ID mismatch??? received ID: %ld\nKnown sentences:", (long)SynthesizeSentence); for(NSDictionary* dict in self.synthesisTexts){ NSLog(@"ID: %ld Text:\"%@\"", [[dict objectForKey:@"ID"] integerValue], [((NSAttributedString*)[dict objectForKey:@"TEXT"]) string]); } return; } [sentenceDict setObject:[NSNumber numberWithInteger:newLength] forKey:@"SYNTH_LEN"]; [self refreshAfterProgressUpdate:sentenceDict]; } - (void)synthesizerTextSpeakLengthChanged:(int)newLength sentenceNumber:(NSInteger)SpeakSentence{ NSLog(@"SpeakLen %ld, %d", SpeakSentence, newLength); NSMutableDictionary* sentenceDict = nil; for(NSMutableDictionary *dict in self.synthesisTexts){ if([[dict objectForKey:@"ID"] integerValue] == SpeakSentence){ sentenceDict = dict; break; } } if(sentenceDict == nil){ NSLog(@"Sentence ID mismatch??? received ID: %ld\nKnown sentences:", (long)SpeakSentence); for(NSDictionary* dict in self.synthesisTexts){ NSLog(@"ID: %ld Text:\"%@\"", [[dict objectForKey:@"ID"] integerValue], [((NSAttributedString*)[dict objectForKey:@"TEXT"]) string]); } return; } [sentenceDict setObject:[NSNumber numberWithInteger:newLength] forKey:@"SPEAK_LEN"]; [self refreshAfterProgressUpdate:sentenceDict]; } - (void)synthesizerdidPause{ [self logTitle:@"synthesizer did pause" message:@""]; } - (void)synthesizerResumed{ NSLog(@"Did resume"); [self logTitle:@"synthesizer Resumed" message:@""]; } - (void)synthesizerCanceled{ NSLog(@"Did cancel"); } - (void)synthesizerErrorOccurred:(NSError *)error speaking:(NSInteger)SpeakSentence synthesizing:(NSInteger)SynthesizeSentence{ NSLog(@"Did error %ld, %ld", SpeakSentence, SynthesizeSentence); if(self.addTextQueue){ [self.addTextQueue removeAllObjects]; } self.cancelEnable = NO; self.pauseOrResumeEnable = NO; if(self.delegate) [self.delegate willRemoveAllTexts:self.synthesisTexts error:error]; [self.synthesisTexts removeAllObjects]; [self updateSynthProgress]; [[BDSSpeechSynthesizer sharedInstance] cancel]; [self displayError:error withTitle:@"Synthesis failed"]; } @end
// // HiSpeechSynthesizer.m // HiBaiduTts // // Created by 连仁辉 on 2022/4/22. // Copyright © 2022 Facebook. All rights reserved. // #import "HiSpeechSynthesizer.h" #import "BDSSpeechSynthesizer.h" #import "TTDFileReader.h" #import "BDSSpeechSynthesizerParams.h" #import <AVFoundation/AVFoundation.h> #define READ_SYNTHESIS_TEXT_FROM_FILE (NO) static BOOL isSpeak = YES; static BOOL textFromFile = READ_SYNTHESIS_TEXT_FROM_FILE; static BOOL displayAllSentences = !READ_SYNTHESIS_TEXT_FROM_FILE; @interface HiSpeechSynthesizer () @property (nonatomic,assign)BOOL pauseOrResumeEnable; @property (nonatomic,assign)BOOL cancelEnable; @property (nonatomic,copy)NSString* apiKey; @property (nonatomic,copy)NSString* secretKey; @property (nonatomic,strong)NSMutableArray* synthesisTexts; @property (nonatomic,strong)NSMutableArray* addTextQueue; /*used with textFromFile*/ @end @implementation HiSpeechSynthesizer + (BOOL)isFileSynthesisEnabled{ return textFromFile; } + (BOOL)isSpeakEnabled{ return isSpeak; } + (void)setFileSynthesisEnabled:(BOOL)isEnabled{ textFromFile = isEnabled; displayAllSentences = !textFromFile; } + (void)setSpeakEnabled:(BOOL)isEnabled{ isSpeak = isEnabled; } - (instancetype)initApiKey:(NSString *)apiKey secretKey:(NSString *)secretKey { self = [super init]; if(self){ self.synthesisTexts = [[NSMutableArray alloc] init]; self.apiKey = apiKey; self.secretKey = secretKey; self.pauseOrResumeEnable = FALSE; self.cancelEnable = FALSE; [self configureSDK]; } return self; } - (void)setSpeaker:(NSString *)speaker { NSError *err = [[BDSSpeechSynthesizer sharedInstance] setSynthParam:speaker forKey:BDS_SYNTHESIZER_PARAM_SPEAKER]; if(err){ [self displayError:err withTitle:@"Failed set online TTS speaker"]; } } - (void)setVolume:(NSNumber *)value{ NSError* err = [[BDSSpeechSynthesizer sharedInstance] setSynthParam:value forKey:BDS_SYNTHESIZER_PARAM_VOLUME]; if(err){ [self displayError:err withTitle:@"Failed set synth volume"]; } } - (void)setSpeed:(NSNumber *)value{ NSError* err = [[BDSSpeechSynthesizer sharedInstance] setSynthParam:value forKey:BDS_SYNTHESIZER_PARAM_SPEED]; if(err){ [self displayError:err withTitle:@"Failed set synth speed"]; } } - (void)setPitch:(NSNumber *)value{ NSError* err = [[BDSSpeechSynthesizer sharedInstance] setSynthParam:value forKey:BDS_SYNTHESIZER_PARAM_PITCH]; if(err){ [self displayError:err withTitle:@"Failed set synth pitch"]; } } - (void)setAudioSessionEnable:(NSNumber *)value { NSError* err = [[BDSSpeechSynthesizer sharedInstance] setSynthParam:value forKey:BDS_SYNTHESIZER_PARAM_ENABLE_AVSESSION_MGMT]; if(err){ [self displayError:err withTitle:@"Failed set synth session enable"]; } } - (void)setAudioSessionCategory:(NSNumber *)category{ int _category = category.intValue; NSString *avCategory = nil; switch (_category) { case 0: avCategory = AVAudioSessionCategoryAmbient; break; case 1: avCategory = AVAudioSessionCategorySoloAmbient; break; case 2: avCategory = AVAudioSessionCategoryPlayback; break; case 3: avCategory = AVAudioSessionCategoryPlayAndRecord; break; default: break; } if (avCategory) { <#statements#> } } - (NSMutableArray *)addTextQueue { if(!_addTextQueue){ _addTextQueue = [[NSMutableArray alloc] init]; } return _addTextQueue; } -(void)configureSDK{ NSLog(@"TTS version info: %@", [BDSSpeechSynthesizer version]); [BDSSpeechSynthesizer setLogLevel:BDS_PUBLIC_LOG_VERBOSE]; [[BDSSpeechSynthesizer sharedInstance] setSynthesizerDelegate:self]; [self configureOnlineTTS]; } -(void)configureOnlineTTS{ [[BDSSpeechSynthesizer sharedInstance] setApiKey:self.apiKey withSecretKey:self.secretKey]; [[BDSSpeechSynthesizer sharedInstance] setSynthParam:@(BDS_SYNTHESIZER_SPEAKER_FEMALE) forKey:BDS_SYNTHESIZER_PARAM_SPEAKER]; [[BDSSpeechSynthesizer sharedInstance] setSynthParam:@(7) forKey:BDS_SYNTHESIZER_PARAM_SPEED]; } -(void)configureOfflineTTS{ } -(void)logTitle:(NSString *)title message:(NSString *)message { NSLog(@"error: %@ detail: %@",title,message); } -(void)displayError:(NSError*)error withTitle:(NSString*)title{ NSString* errMessage = error.localizedDescription; NSLog(@"error: %@ detail: %@",title,errMessage); } -(void)updateSynthProgress{ // [self.SynthesizeTextProgressView setText:nil]; NSMutableAttributedString *str = [[NSMutableAttributedString alloc] init]; if(displayAllSentences){ for(NSDictionary* contentDict in self.synthesisTexts){ [str appendAttributedString:[contentDict objectForKey:@"TEXT"]]; } } else{ if(self.synthesisTexts.count > 0){ NSDictionary* contentDict = [self.synthesisTexts objectAtIndex:0]; [str appendAttributedString:[contentDict objectForKey:@"TEXT"]]; } } // [self.SynthesizeTextProgressView setAttributedText:str]; } -(void)addFileTextLoop { if(self.addTextQueue.count > 0){ NSAttributedString* string = [[NSAttributedString alloc] initWithString:[self.addTextQueue objectAtIndex:0]]; [self.addTextQueue removeObjectAtIndex:0]; NSInteger sentenceID; NSError* err = nil; if(isSpeak) sentenceID = [[BDSSpeechSynthesizer sharedInstance] speakSentence:[string string] withError:&err]; else sentenceID = [[BDSSpeechSynthesizer sharedInstance] synthesizeSentence:[string string] withError:&err]; if(err == nil){ NSMutableDictionary *addedString = [[NSMutableDictionary alloc] initWithObjects:@[string, [NSNumber numberWithInteger:sentenceID], [NSNumber numberWithInteger:0], [NSNumber numberWithInteger:0]] forKeys:@[@"TEXT", @"ID", @"SPEAK_LEN", @"SYNTH_LEN"]]; [self.synthesisTexts addObject:addedString]; [self updateSynthProgress]; if(self.synthesisTexts.count == 1){ self.cancelEnable = YES; self.pauseOrResumeEnable = YES; } } else{ [self displayError:err withTitle:@"Add sentence Error"]; [self.addTextQueue removeAllObjects]; } } if(self.addTextQueue.count > 0){ [self performSelector:@selector(addFileTextLoop) withObject:nil afterDelay:0.2]; } } - (void)synthesizeFile:(NSString *)text_file { if(textFromFile){ if(text_file == nil){ NSString *domain = @"cn.histron"; NSString *desc = [NSString stringWithFormat:@"Couldn't find text file \"%@\" from mainBundle",text_file];//NSLocalizedString国际化 NSDictionary *userInfo = @{NSLocalizedDescriptionKey:desc}; NSError *error = [NSError errorWithDomain:domain code:500 userInfo:userInfo]; [self displayError:error withTitle:@"File not found"]; return; } int total = 0; TTDFileReader* reader = [[TTDFileReader alloc] initWithFilePath:text_file]; NSString *line = @""; NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(/*kCFStringEncodingUTF8*/kCFStringEncodingGB_18030_2000); while ( (line = [reader readLineWithEncoding:gbkEncoding]) ) { total++; } total = total*4; int added = 1; // for(int i = 0;i < 4; i++){ reader = [[TTDFileReader alloc] initWithFilePath:text_file]; // NSString *line = @""; // NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(/*kCFStringEncodingUTF8*/kCFStringEncodingGB_18030_2000); while ( (line = [reader readLineWithEncoding:gbkEncoding]) ) { [self.addTextQueue addObject:[NSString stringWithFormat:@"Text %d of %d: %@", added, total, line]]; added++; } // } [self performSelector:@selector(addFileTextLoop) withObject:nil afterDelay:0.2]; } } - (void)synthesizeText:(NSString *)text { if(textFromFile)return; //[self.SynthesizeButton setEnabled:NO]; NSAttributedString* string = [[NSAttributedString alloc] initWithString:text]; NSInteger sentenceID; NSError* err = nil; if(isSpeak) sentenceID = [[BDSSpeechSynthesizer sharedInstance] speakSentence:[string string] withError:&err]; else sentenceID = [[BDSSpeechSynthesizer sharedInstance] synthesizeSentence:[string string] withError:&err]; if(err == nil){ NSMutableDictionary *addedString = [[NSMutableDictionary alloc] initWithObjects:@[string, [NSNumber numberWithInteger:sentenceID], [NSNumber numberWithInteger:0], [NSNumber numberWithInteger:0]] forKeys:@[@"TEXT", @"ID", @"SPEAK_LEN", @"SYNTH_LEN"]]; [self.synthesisTexts addObject:addedString]; [self updateSynthProgress]; if(self.synthesisTexts.count == 1){ self.cancelEnable = YES; self.pauseOrResumeEnable = YES; } } else{ [self displayError:err withTitle:@"Add sentence Error"]; } } - (void)pauseOrResume { if([[BDSSpeechSynthesizer sharedInstance] synthesizerStatus] == BDS_SYNTHESIZER_STATUS_PAUSED){ [[BDSSpeechSynthesizer sharedInstance] resume]; }else if([[BDSSpeechSynthesizer sharedInstance] synthesizerStatus] == BDS_SYNTHESIZER_STATUS_WORKING){ [[BDSSpeechSynthesizer sharedInstance] pause]; }else{ [self logTitle:@"Error" message:@"Synthesis doesn't seem to be running so can't pause or resume..."]; self.cancelEnable = NO; self.pauseOrResumeEnable = NO; } } - (void)cancel{ if(self.addTextQueue){ [self.addTextQueue removeAllObjects]; } [[BDSSpeechSynthesizer sharedInstance] cancel]; [self.synthesisTexts removeAllObjects]; [self updateSynthProgress]; self.cancelEnable = NO; self.pauseOrResumeEnable = NO; } - (void)releaseInstance{ [self cancel]; [BDSSpeechSynthesizer releaseInstance]; } -(void)refreshAfterProgressUpdate:(NSMutableDictionary*)updatedSentence{ NSString* totalText = [((NSAttributedString*)[updatedSentence objectForKey:@"TEXT"]) string]; NSInteger readOffset = [[updatedSentence objectForKey:@"SPEAK_LEN"] integerValue]; NSInteger synthOffset = [[updatedSentence objectForKey:@"SYNTH_LEN"] integerValue]; NSLog(@"UPDATE PROGRESS: ReadLen: %ld, SynthLen: %ld, TotalLen: %ld", readOffset, synthOffset, totalText.length); NSRange readRange = NSMakeRange(0, readOffset); NSRange synthRange = NSMakeRange(readOffset, synthOffset-readOffset); NSRange unprocessedRange = NSMakeRange(synthOffset, totalText.length-synthOffset); NSString* readText = [totalText substringWithRange: readRange]; NSString* synthesizeSentenceText = [totalText substringWithRange: synthRange]; NSString* unProcessedText = [totalText substringWithRange: unprocessedRange]; NSLog(@"readText: %@",readText); NSLog(@"synthesizeSentenceText: %@",synthesizeSentenceText); NSLog(@"unProcessedText: %@",unProcessedText); // [updatedSentence setObject:allMessage forKey:@"TEXT"]; // [self updateSynthProgress]; } #pragma mark - implement BDSSpeechSynthesizerDelegate - (void)synthesizerStartWorkingSentence:(NSInteger)SynthesizeSentence{ NSLog(@"Did start synth %ld", SynthesizeSentence); self.cancelEnable = YES; self.pauseOrResumeEnable = YES; } - (void)synthesizerFinishWorkingSentence:(NSInteger)SynthesizeSentence{ NSLog(@"Did finish synth, %ld", SynthesizeSentence); if(!isSpeak){ if(self.synthesisTexts.count > 0 && SynthesizeSentence == [[[self.synthesisTexts objectAtIndex:0] objectForKey:@"ID"] integerValue]){ [self.synthesisTexts removeObjectAtIndex:0]; [self updateSynthProgress]; } else{ NSLog(@"Sentence ID mismatch??? received ID: %ld\nKnown sentences:", (long)SynthesizeSentence); for(NSDictionary* dict in self.synthesisTexts){ NSLog(@"ID: %ld Text:\"%@\"", [[dict objectForKey:@"ID"] integerValue], [((NSAttributedString*)[dict objectForKey:@"TEXT"]) string]); } } if(self.synthesisTexts.count == 0){ self.cancelEnable = NO; self.pauseOrResumeEnable = NO; } } } - (void)synthesizerSpeechStartSentence:(NSInteger)SpeakSentence{ NSLog(@"Did start speak %ld", SpeakSentence); } - (void)synthesizerSpeechEndSentence:(NSInteger)SpeakSentence{ NSLog(@"Did end speak %ld", SpeakSentence); if(self.synthesisTexts.count > 0 && SpeakSentence == [[[self.synthesisTexts objectAtIndex:0] objectForKey:@"ID"] integerValue]){ [self.synthesisTexts removeObjectAtIndex:0]; [self updateSynthProgress]; } else{ NSLog(@"Sentence ID mismatch??? received ID: %ld\nKnown sentences:", (long)SpeakSentence); for(NSDictionary* dict in self.synthesisTexts){ NSLog(@"ID: %ld Text:\"%@\"", [[dict objectForKey:@"ID"] integerValue], [((NSAttributedString*)[dict objectForKey:@"TEXT"]) string]); } } if(self.synthesisTexts.count == 0){ self.cancelEnable = NO; self.pauseOrResumeEnable = NO; } } - (void)synthesizerNewDataArrived:(NSData *)newData DataFormat:(BDSAudioFormat)fmt characterCount:(int)newLength sentenceNumber:(NSInteger)SynthesizeSentence{ NSMutableDictionary* sentenceDict = nil; for(NSMutableDictionary *dict in self.synthesisTexts){ if([[dict objectForKey:@"ID"] integerValue] == SynthesizeSentence){ sentenceDict = dict; break; } } if(sentenceDict == nil){ NSLog(@"Sentence ID mismatch??? received ID: %ld\nKnown sentences:", (long)SynthesizeSentence); for(NSDictionary* dict in self.synthesisTexts){ NSLog(@"ID: %ld Text:\"%@\"", [[dict objectForKey:@"ID"] integerValue], [((NSAttributedString*)[dict objectForKey:@"TEXT"]) string]); } return; } [sentenceDict setObject:[NSNumber numberWithInteger:newLength] forKey:@"SYNTH_LEN"]; [self refreshAfterProgressUpdate:sentenceDict]; } - (void)synthesizerTextSpeakLengthChanged:(int)newLength sentenceNumber:(NSInteger)SpeakSentence{ NSLog(@"SpeakLen %ld, %d", SpeakSentence, newLength); NSMutableDictionary* sentenceDict = nil; for(NSMutableDictionary *dict in self.synthesisTexts){ if([[dict objectForKey:@"ID"] integerValue] == SpeakSentence){ sentenceDict = dict; break; } } if(sentenceDict == nil){ NSLog(@"Sentence ID mismatch??? received ID: %ld\nKnown sentences:", (long)SpeakSentence); for(NSDictionary* dict in self.synthesisTexts){ NSLog(@"ID: %ld Text:\"%@\"", [[dict objectForKey:@"ID"] integerValue], [((NSAttributedString*)[dict objectForKey:@"TEXT"]) string]); } return; } [sentenceDict setObject:[NSNumber numberWithInteger:newLength] forKey:@"SPEAK_LEN"]; [self refreshAfterProgressUpdate:sentenceDict]; } - (void)synthesizerdidPause{ [self logTitle:@"synthesizer did pause" message:@""]; } - (void)synthesizerResumed{ NSLog(@"Did resume"); [self logTitle:@"synthesizer Resumed" message:@""]; } - (void)synthesizerCanceled{ NSLog(@"Did cancel"); } - (void)synthesizerErrorOccurred:(NSError *)error speaking:(NSInteger)SpeakSentence synthesizing:(NSInteger)SynthesizeSentence{ NSLog(@"Did error %ld, %ld", SpeakSentence, SynthesizeSentence); if(self.addTextQueue){ [self.addTextQueue removeAllObjects]; } self.cancelEnable = NO; self.pauseOrResumeEnable = NO; [self.synthesisTexts removeAllObjects]; [self updateSynthProgress]; [[BDSSpeechSynthesizer sharedInstance] cancel]; [self displayError:error withTitle:@"Synthesis failed"]; } @end
Ignore Space
Show notes
View
package.json
{ "name": "react-native-hi-baidu-tts", "version": "1.0.6", "description": "baidu tts", "main": "lib/commonjs/index", "module": "lib/module/index", "types": "lib/typescript/index.d.ts", "react-native": "src/index", "source": "src/index", "files": [ "src", "lib", "android", "ios", "cpp", "react-native-hi-baidu-tts.podspec", "!lib/typescript/example", "!android/build", "!ios/build", "!**/__tests__", "!**/__fixtures__", "!**/__mocks__" ], "scripts": { "test": "jest", "typescript": "tsc --noEmit", "lint": "eslint \"**/*.{js,ts,tsx}\"", "prepare": "bob build", "release": "release-it", "example": "yarn --cwd example", "pods": "cd example && pod-install --quiet", "bootstrap": "yarn example && yarn && yarn pods" }, "keywords": [ "react-native", "ios", "android" ], "repository": "http://git.hieap.cn/gitbucket/git/12255/react-native-hi-baidu-tts.git", "author": "xiaobaoafei <1374214006@qq.com> (http://git.hieap.cn/gitbucket/git/12255/react-native-hi-baidu-tts.git)", "license": "MIT", "bugs": { "url": "http://git.hieap.cn/gitbucket/git/12255/react-native-hi-baidu-tts.git/issues" }, "homepage": "http://git.hieap.cn/gitbucket/git/12255/react-native-hi-baidu-tts.git#readme", "publishConfig": { "registry": "https://registry.npmjs.org/" }, "devDependencies": { "@commitlint/config-conventional": "^11.0.0", "@react-native-community/eslint-config": "^2.0.0", "@release-it/conventional-changelog": "^2.0.0", "@types/jest": "^26.0.0", "@types/react": "^16.9.19", "@types/react-native": "0.62.13", "commitlint": "^11.0.0", "eslint": "^7.2.0", "eslint-config-prettier": "^7.0.0", "eslint-plugin-prettier": "^3.1.3", "husky": "^6.0.0", "jest": "^26.0.1", "pod-install": "^0.1.0", "prettier": "^2.0.5", "react": "16.13.1", "react-native": "0.63.4", "react-native-builder-bob": "^0.18.0", "release-it": "^14.2.2", "typescript": "^4.1.3" }, "peerDependencies": { "react": "*", "react-native": "*" }, "jest": { "preset": "react-native", "modulePathIgnorePatterns": [ "<rootDir>/example/node_modules", "<rootDir>/lib/" ] }, "commitlint": { "extends": [ "@commitlint/config-conventional" ] }, "release-it": { "git": { "commitMessage": "chore: release ${version}", "tagName": "v${version}" }, "npm": { "publish": true }, "github": { "release": true }, "plugins": { "@release-it/conventional-changelog": { "preset": "angular" } } }, "eslintConfig": { "root": true, "extends": [ "@react-native-community", "prettier" ], "rules": { "prettier/prettier": [ "error", { "quoteProps": "consistent", "singleQuote": true, "tabWidth": 2, "trailingComma": "es5", "useTabs": false } ] } }, "eslintIgnore": [ "node_modules/", "lib/" ], "prettier": { "quoteProps": "consistent", "singleQuote": true, "tabWidth": 2, "trailingComma": "es5", "useTabs": false }, "react-native-builder-bob": { "source": "src", "output": "lib", "targets": [ "commonjs", "module", [ "typescript", { "project": "tsconfig.build.json" } ] ] }, "dependencies": { "react-native-hi-baidu-tts": "^0.1.1" } }
{ "name": "react-native-hi-baidu-tts", "version": "1.0.4", "description": "baidu tts", "main": "lib/commonjs/index", "module": "lib/module/index", "types": "lib/typescript/index.d.ts", "react-native": "src/index", "source": "src/index", "files": [ "src", "lib", "android", "ios", "cpp", "react-native-hi-baidu-tts.podspec", "!lib/typescript/example", "!android/build", "!ios/build", "!**/__tests__", "!**/__fixtures__", "!**/__mocks__" ], "scripts": { "test": "jest", "typescript": "tsc --noEmit", "lint": "eslint \"**/*.{js,ts,tsx}\"", "prepare": "bob build", "release": "release-it", "example": "yarn --cwd example", "pods": "cd example && pod-install --quiet", "bootstrap": "yarn example && yarn && yarn pods" }, "keywords": [ "react-native", "ios", "android" ], "repository": "http://git.hieap.cn/gitbucket/git/12255/react-native-hi-baidu-tts.git", "author": "xiaobaoafei <1374214006@qq.com> (http://git.hieap.cn/gitbucket/git/12255/react-native-hi-baidu-tts.git)", "license": "MIT", "bugs": { "url": "http://git.hieap.cn/gitbucket/git/12255/react-native-hi-baidu-tts.git/issues" }, "homepage": "http://git.hieap.cn/gitbucket/git/12255/react-native-hi-baidu-tts.git#readme", "publishConfig": { "registry": "https://registry.npmjs.org/" }, "devDependencies": { "@commitlint/config-conventional": "^11.0.0", "@react-native-community/eslint-config": "^2.0.0", "@release-it/conventional-changelog": "^2.0.0", "@types/jest": "^26.0.0", "@types/react": "^16.9.19", "@types/react-native": "0.62.13", "commitlint": "^11.0.0", "eslint": "^7.2.0", "eslint-config-prettier": "^7.0.0", "eslint-plugin-prettier": "^3.1.3", "husky": "^6.0.0", "jest": "^26.0.1", "pod-install": "^0.1.0", "prettier": "^2.0.5", "react": "16.13.1", "react-native": "0.63.4", "react-native-builder-bob": "^0.18.0", "release-it": "^14.2.2", "typescript": "^4.1.3" }, "peerDependencies": { "react": "*", "react-native": "*" }, "jest": { "preset": "react-native", "modulePathIgnorePatterns": [ "<rootDir>/example/node_modules", "<rootDir>/lib/" ] }, "commitlint": { "extends": [ "@commitlint/config-conventional" ] }, "release-it": { "git": { "commitMessage": "chore: release ${version}", "tagName": "v${version}" }, "npm": { "publish": true }, "github": { "release": true }, "plugins": { "@release-it/conventional-changelog": { "preset": "angular" } } }, "eslintConfig": { "root": true, "extends": [ "@react-native-community", "prettier" ], "rules": { "prettier/prettier": [ "error", { "quoteProps": "consistent", "singleQuote": true, "tabWidth": 2, "trailingComma": "es5", "useTabs": false } ] } }, "eslintIgnore": [ "node_modules/", "lib/" ], "prettier": { "quoteProps": "consistent", "singleQuote": true, "tabWidth": 2, "trailingComma": "es5", "useTabs": false }, "react-native-builder-bob": { "source": "src", "output": "lib", "targets": [ "commonjs", "module", [ "typescript", { "project": "tsconfig.build.json" } ] ] }, "dependencies": { "react-native-hi-baidu-tts": "^0.1.1" } }
Ignore Space
Show notes
View
src/index.tsx
import { NativeModules, Platform } from 'react-native'; const LINKING_ERROR = `The package 'react-native-hi-baidu-tts' doesn't seem to be linked. Make sure: \n\n` + Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo managed workflow\n'; const HiBaiduTts = NativeModules.HiBaiduTts ? NativeModules.HiBaiduTts : new Proxy( {}, { get() { throw new Error(LINKING_ERROR); }, } ); export enum AudioSessionCategory { AudioSessionCategoryAmbient, AudioSessionCategorySoloAmbient, AudioSessionCategoryPlayback, AudioSessionCategoryPlayAndRecord, } export function initSDK(apiKey: string, secretKey: string, appId: string) { HiBaiduTts.initSDK(apiKey, secretKey, appId); } export function speak(text: string): Promise<string> { return HiBaiduTts.speak(text); } export function setSpeaker(text: string) { HiBaiduTts.setSpeaker(text); } //0~15 export function setVolume(value: number) { HiBaiduTts.setVolume(value); } //0~9 export function setSpeed(value: number) { HiBaiduTts.setSpeed(value); } //0~9 export function setPitch(value: number) { HiBaiduTts.setPitch(value); } //only ios export function setAudioSessionCategory(category: AudioSessionCategory) { if (Platform.OS === 'ios') HiBaiduTts.setAudioSessionCategory(category); } export function setAudioSessionEnable(enable: boolean) { if (Platform.OS === 'ios') HiBaiduTts.setAudioSessionEnable(enable); } export default { initSDK, speak, setSpeaker, setVolume, setSpeed, setPitch, setAudioSessionEnable, setAudioSessionCategory, };
import { NativeModules, Platform } from 'react-native'; const LINKING_ERROR = `The package 'react-native-hi-baidu-tts' doesn't seem to be linked. Make sure: \n\n` + Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo managed workflow\n'; const HiBaiduTts = NativeModules.HiBaiduTts ? NativeModules.HiBaiduTts : new Proxy( {}, { get() { throw new Error(LINKING_ERROR); }, } ); export enum AudioSessionCategory { AudioSessionCategoryAmbient, AudioSessionCategorySoloAmbient, AudioSessionCategoryPlayback, AudioSessionCategoryPlayAndRecord, } export function initSDK(apiKey: string, secretKey: string, appId: string) { HiBaiduTts.initSDK(apiKey, secretKey, appId); } export function speak(text: string) { HiBaiduTts.speak(text); } export function setSpeaker(text: string) { HiBaiduTts.setSpeaker(text); } //0~15 export function setVolume(value: number) { HiBaiduTts.setVolume(value); } //0~9 export function setSpeed(value: number) { HiBaiduTts.setSpeed(value); } //0~9 export function setPitch(value: number) { HiBaiduTts.setPitch(value); } //only ios export function setAudioSessionCategory(category: AudioSessionCategory) { if (Platform.OS === 'ios') HiBaiduTts.setAudioSessionCategory(category); } export function setAudioSessionEnable(enable: boolean) { if (Platform.OS === 'ios') HiBaiduTts.setAudioSessionEnable(enable); } export default { initSDK, speak, setSpeaker, setVolume, setSpeed, setPitch, setAudioSessionEnable, setAudioSessionCategory, };
Show line notes below