1

私は客観的な c と OpenEars に非常に慣れていないため、コードが乱雑で、非常に単純な問題で迷っている場合はご容赦ください。

とにかく、このアプリケーションには 2 つのコントローラーがあります。1 つ目はデフォルトの ViewController で、2 つ目は私が作成した ReplyManagerController という名前の新しいものです。

ViewController のコードは、基本的にチュートリアルのコードを使用して、いくつかの (場合によってはさらにいくつかの) 変更を加えています。

編集:

このアプリは、ユーザーが何かを言うとアプリが応答する基本的なアプリであると想定されています。

しかし、元の問題は、ViewController が別のクラス/コントローラーから文字列を取得したときに、文字列を表示したり、TTS を機能させたりできないことでした。

以下の私の答えは、おそらく他のクラスが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];
}
4

2 に答える 2

1
ViewController* getReply = [[ViewController alloc] init];

ここでは、おそらく定義されViewControllerていない新しいものを初期化します。self.fliteControllerたとえば、次のように、以前のコントローラーを再利用する必要があります。

   [replyObject speechResult:(NSString*)strResult viewController:self];

したがって、後で初期化済みのものを使用できますviewController。全体として、コールバック メソッド内ではなく、オブジェクトを初期化するviewControllerか、replyController事前に初期化することをお勧めします。

于 2016-05-31T16:05:43.877 に答える