从另一个 class/controller (IOS, Objective c) 获取字符串时,Open ears 文本转语音(语音)不起作用
Open ears text to speech (voice) not working when getting string from another class/controller (IOS, Objective c)
我是 objective c 和 OpenEars 的新手,所以如果我有一些混乱的代码或者我在非常简单的问题中迷失了方向,请原谅我。
无论如何,我在这个应用程序中有两个控制器。第一个是默认的 ViewController,第二个是我创建的新的 ReplyManagerController。
ViewController 中的代码基本上使用教程中的代码,但有一些(也许更多)更改。
编辑:
该应用程序应该是一个基本的应用程序,用户说些什么,应用程序就会回复。
但最初的问题是,当我的 ViewController 从另一个 class/controller.
获取字符串时,我无法显示字符串或 TTS 工作
我下面的答案提到这可能是因为我的另一个 class 在没有初始化 self.fliteController 的情况下调用我的 ViewController。
如何用 self.fliteController 初始化 ViewController?
ViewController.m
- (void) pocketsphinxDidReceiveHypothesis:(NSString *)hypothesis recognitionScore:(NSString *)recognitionScore utteranceID:(NSString *)utteranceID {
NSString *strResult = hypothesis; //speech to text to string
ReplyManager* replyObject = [[ReplyManager alloc] init];
[replyObject speechResult:(NSString*)strResult viewController:self];
}
- (void) getReply:(NSString*)replyStr{
[self.fliteController say:replyStr withVoice:self.slt];
[self updateText:replyStr];
}
- (IBAction)updateText:(NSString*)replyStr{
labelOne.text = replyStr;
labelOne.adjustsFontSizeToFitWidth = YES;
labelOne.minimumFontSize = 0;
}
任何帮助都会很棒!谢谢!
ReplyManager.m
- (void) speechResult:(NSString*)strResult {
NSString *replystr;
NSString *greetings = @"Hi!";
NSString *sorry = @"Sorry I didn't catch that?";
ViewController* getReply = [[ViewController alloc] init];
if ([strResult isEqualToString:@"HELLO"])
{
replystr = greetings;
[getReply getReply:(NSString*)replystr];
}
else
{
replystr = sorry;
[getReply getReply:(NSString*)replystr];
}
}
编辑 2:
viewDidLoad 方法
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.fliteController = [[OEFliteController alloc] init];
self.slt = [[Slt alloc] init];
self.openEarsEventsObserver = [[OEEventsObserver alloc] init];
[self.openEarsEventsObserver setDelegate:self];
}
ViewController* getReply = [[ViewController alloc] init];
在这里你初始化了一个新的 ViewController
,它很可能没有定义 self.fliteController
。你需要重用之前的控制器,例如像这样:
[replyObject speechResult:(NSString*)strResult viewController:self];
所以您可以稍后使用已经初始化的viewController
。总的来说,最好事先初始化 viewController
或 replyController
之类的对象,而不是在回调方法中。
这听起来像是一个时间问题,您在初始化之前尝试使用 fliteController
。
在您的 ViewController
class 中,您在哪里为 fliteController
属性 赋值?在初始化程序中? -(void)viewDidLoad
?
在ReplyManagerController
中添加:
ViewController* getReply = [[ViewController alloc] init];
// Add these lines
NSLog(getReply.fliteController); // Is this nil?
[getReply.view layoutIfNeeded];
NSLog(getReply.fliteController); // Is it still nil?
以上是否解决了问题?如果是这样,您可能正在 -(void)viewDidLoad
中初始化 fliteController
。两个 NSLog
语句的结果是什么?
我是 objective c 和 OpenEars 的新手,所以如果我有一些混乱的代码或者我在非常简单的问题中迷失了方向,请原谅我。
无论如何,我在这个应用程序中有两个控制器。第一个是默认的 ViewController,第二个是我创建的新的 ReplyManagerController。
ViewController 中的代码基本上使用教程中的代码,但有一些(也许更多)更改。
编辑:
该应用程序应该是一个基本的应用程序,用户说些什么,应用程序就会回复。
但最初的问题是,当我的 ViewController 从另一个 class/controller.
获取字符串时,我无法显示字符串或 TTS 工作我下面的答案提到这可能是因为我的另一个 class 在没有初始化 self.fliteController 的情况下调用我的 ViewController。
如何用 self.fliteController 初始化 ViewController?
ViewController.m
- (void) pocketsphinxDidReceiveHypothesis:(NSString *)hypothesis recognitionScore:(NSString *)recognitionScore utteranceID:(NSString *)utteranceID {
NSString *strResult = hypothesis; //speech to text to string
ReplyManager* replyObject = [[ReplyManager alloc] init];
[replyObject speechResult:(NSString*)strResult viewController:self];
}
- (void) getReply:(NSString*)replyStr{
[self.fliteController say:replyStr withVoice:self.slt];
[self updateText:replyStr];
}
- (IBAction)updateText:(NSString*)replyStr{
labelOne.text = replyStr;
labelOne.adjustsFontSizeToFitWidth = YES;
labelOne.minimumFontSize = 0;
}
任何帮助都会很棒!谢谢!
ReplyManager.m
- (void) speechResult:(NSString*)strResult {
NSString *replystr;
NSString *greetings = @"Hi!";
NSString *sorry = @"Sorry I didn't catch that?";
ViewController* getReply = [[ViewController alloc] init];
if ([strResult isEqualToString:@"HELLO"])
{
replystr = greetings;
[getReply getReply:(NSString*)replystr];
}
else
{
replystr = sorry;
[getReply getReply:(NSString*)replystr];
}
}
编辑 2:
viewDidLoad 方法
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.fliteController = [[OEFliteController alloc] init];
self.slt = [[Slt alloc] init];
self.openEarsEventsObserver = [[OEEventsObserver alloc] init];
[self.openEarsEventsObserver setDelegate:self];
}
ViewController* getReply = [[ViewController alloc] init];
在这里你初始化了一个新的 ViewController
,它很可能没有定义 self.fliteController
。你需要重用之前的控制器,例如像这样:
[replyObject speechResult:(NSString*)strResult viewController:self];
所以您可以稍后使用已经初始化的viewController
。总的来说,最好事先初始化 viewController
或 replyController
之类的对象,而不是在回调方法中。
这听起来像是一个时间问题,您在初始化之前尝试使用 fliteController
。
在您的 ViewController
class 中,您在哪里为 fliteController
属性 赋值?在初始化程序中? -(void)viewDidLoad
?
在ReplyManagerController
中添加:
ViewController* getReply = [[ViewController alloc] init];
// Add these lines
NSLog(getReply.fliteController); // Is this nil?
[getReply.view layoutIfNeeded];
NSLog(getReply.fliteController); // Is it still nil?
以上是否解决了问题?如果是这样,您可能正在 -(void)viewDidLoad
中初始化 fliteController
。两个 NSLog
语句的结果是什么?