使用 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
提前致谢, 塞卡尔
I am very new to generating an speech using some input text. I tried it with the following example and I succeeded. The speech is a man's voice But I need to make it as woman's. Is it possible to handle this?. And guys can you please suggest me that what are the settings that we can change in this.
#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
Thanks in Advance,
Sekhar
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
调用
setVoice:@"cmu_us_slt"
设置女声。对于带有美国口音的男声,请调用setVoice:@"cmu_us_rms"
。Call
setVoice:@"cmu_us_slt"
to set the female voice. For a male voice with a US accent, callsetVoice:@"cmu_us_rms"
.如果我从 这里 它有很好的解释。
希望这对你有帮助
If yI've found Good Article for AVSpeechSynthesizer (iOS 7) from here It has nice explanation.
hope this will help you