2011-04-22 46 views
2

我对使用一些输入文本生成语音非常新颖。我试着用下面的例子,我成功了。演讲是一个男人的声音,但我需要把它作为女人的。有没有可能处理这个问题?而且你们可以向我建议我们可以改变的设置是什么。使用iPhone sdk的文本到语音

#import <Foundation/Foundation.h> 
#import <AVFoundation/AVFoundation.h> 


@interface FliteTTS : NSObject <AVAudioPlayerDelegate> 
{ 
    //NSData *soundObj;  // doesn't work yet - see note in FliteTTS.m 
    AVAudioPlayer* audioPlayer; 
} 

// Use these: 
-(void)speakText:(NSString *)text; 
-(void)stopTalking; 
-(void)setPitch:(float)pitch variance:(float)variance speed:(float)speed; 
-(void)setVoice:(NSString *)voicename; 
@end 


#import "FliteTTS.h" 
#import "flite.h" 

cst_voice *register_cmu_us_kal(); 
cst_voice *register_cmu_us_kal16(); 
cst_voice *register_cmu_us_rms(); 
cst_voice *register_cmu_us_awb(); 
cst_voice *register_cmu_us_slt(); 
cst_voice *register_usenglish(); 
cst_wave *sound; 
cst_voice *voice; 

@implementation FliteTTS 

-(id)init 
{ 
    self = [super init]; 
    flite_init(); 
    // Set a default voice 
    //voice = register_cmu_us_kal(); 
    //voice = register_cmu_us_kal16(); 
    //voice = register_cmu_us_rms(); 
    //voice = register_cmu_us_awb(); 
    //voice = register_cmu_us_slt(); 
    [self setVoice:@"cmu_us_kal"]; 
    return self; 
} 

-(void)speakText:(NSString *)text 
{ 
    NSMutableString *cleanString; 
    cleanString = [NSMutableString stringWithString:@""]; 
    if([text length] > 1) 
    { 
     int x = 0; 
     while (x < [text length]) 
     { 
      unichar ch = [text characterAtIndex:x]; 
      [cleanString appendFormat:@"%c", ch]; 
      x++; 
     } 
    } 
    if(cleanString == nil) 
    {  // string is empty 
     cleanString = [NSMutableString stringWithString:@""]; 
    } 
    sound = flite_text_to_wave([cleanString UTF8String], voice); 




    NSArray *filePaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *recordingDirectory = [filePaths objectAtIndex: 0]; 
    // Pick a file name 
    NSString *tempFilePath = [NSString stringWithFormat: @"%@/%s", recordingDirectory, "temp.wav"]; 
    printf("\n TempFilePath:%s",[tempFilePath UTF8String]); 

    // save wave to disk 
    char *path; 
    path = (char*)[tempFilePath UTF8String]; 
    cst_wave_save_riff(sound, path); 


    // Play the sound back. 
    NSError *err; 
    [audioPlayer stop]; 
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:tempFilePath] error:&err]; 
    [audioPlayer setDelegate:self]; 
    [audioPlayer prepareToPlay]; 
    [audioPlayer play]; 
    // Remove file 
    [[NSFileManager defaultManager] removeItemAtPath:tempFilePath error:nil]; 

} 

-(void)setPitch:(float)pitch variance:(float)variance speed:(float)speed 
{ 
    feat_set_float(voice->features,"int_f0_target_mean", pitch); 
    feat_set_float(voice->features,"int_f0_target_stddev",variance); 
    feat_set_float(voice->features,"duration_stretch",speed); 
} 

-(void)setVoice:(NSString *)voicename 
{ 
    if([voicename isEqualToString:@"cmu_us_kal"]) { 
     voice = register_cmu_us_kal(); 
    } 
    else if([voicename isEqualToString:@"cmu_us_kal16"]) { 
     voice = register_cmu_us_kal16(); 
    } 
    else if([voicename isEqualToString:@"cmu_us_rms"]) { 
     voice = register_cmu_us_rms(); 
    } 
    else if([voicename isEqualToString:@"cmu_us_awb"]) { 
     voice = register_cmu_us_awb(); 
    } 
    else if([voicename isEqualToString:@"cmu_us_slt"]) { 
     voice = register_cmu_us_slt(); 
    } 

} 

-(void)stopTalking 
{ 
    [audioPlayer stop]; 
} 

@end 

由于事先 Sekhar

+0

您有四种类型的FLITE图书馆的声音,你可以使用[fliteEngine setVoice:@ “cmu_us_slt”];在设置新语音之后清除所有目标 – kiri 2011-04-22 10:06:18

+0

我也在工作同一类型的项目,我想生成孩子的声音是否有可能使用setVoice属性生成... – Aadil 2011-06-21 05:36:08

回答

1

呼叫setVoice:@"cmu_us_slt"设置女声。对于美国口音的男声,请致电setVoice:@"cmu_us_rms"

+0

嗨,感谢您的回复,是否可以使用不同的语言国家口音?请给我建议 – ChandraSekhar 2011-04-26 05:20:41

+0

@Chandrasekhar检查我的答案,它可能会帮助你 – 2014-03-29 11:58:21

1

如果我发现AVSpeechSynthesizer的好文章(iOS 7) from here它有很好的解释。

Arabic (Saudi Arabia) - ar-SA 
Chinese (China) - zh-CN 
Chinese (Hong Kong SAR China) - zh-HK 
Chinese (Taiwan) - zh-TW 
Czech (Czech Republic) - cs-CZ 
Danish (Denmark) - da-DK 
Dutch (Belgium) - nl-BE 
Dutch (Netherlands) - nl-NL 
English (Australia) - en-AU 
English (Ireland) - en-IE 
English (South Africa) - en-ZA 
English (United Kingdom) - en-GB 
English (United States) - en-US 
Finnish (Finland) - fi-FI 
French (Canada) - fr-CA 
French (France) - fr-FR 
German (Germany) - de-DE 
Greek (Greece) - el-GR 
Hindi (India) - hi-IN 
Hungarian (Hungary) - hu-HU 
Indonesian (Indonesia) - id-ID 
Italian (Italy) - it-IT 
Japanese (Japan) - ja-JP 
Korean (South Korea) - ko-KR 
Norwegian (Norway) - no-NO 
Polish (Poland) - pl-PL 
Portuguese (Brazil) - pt-BR 
Portuguese (Portugal) - pt-PT 
Romanian (Romania) - ro-RO 
Russian (Russia) - ru-RU 
Slovak (Slovakia) - sk-SK 
Spanish (Mexico) - es-MX 
Spanish (Spain) - es-ES 
Swedish (Sweden) - sv-SE 
Thai (Thailand) - th-TH 
Turkish (Turkey) - tr-TR 

希望这将帮助你