2011-04-22 145 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 

希望這將幫助你