1

iSpeech API を使用しています。私は彼らのフォーラムに投稿しましたが、そこではあまり活動がありません。文字列を渡して、アプリにそれを話させることができます。しかし、今度は 5 などの文字列の配列を渡したいと思います。エンジンにこれらの文字列を次々に読み上げてもらいたいのですが、最初の文字列しか読み上げません。NSOperationQueue を使用することにしたので、viewDidLoad で次のようにしました。

//Create Queue
    queue = [[NSOperationQueue alloc] init];
    [queue setMaxConcurrentOperationCount:1];

そして後で私はこれを行います:

  • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    //Set loop for 5 strings
    [self fetchStringsToSpeak:indexPath];
    

    }

    -(void)fetchStringsToSpeak:(NSIndexPath*)indexPath{

    int stringsToSpeak = 5;
    
    for (int counter = 0; counter < stringsToSpeak; counter++) {
    
        //Get the string
        NSDictionary *currentString = [self.stringsArray objectAtIndex:indexPath.row+counter];
    
        //3. Fill im text and image for cell
        NSString *string = [currentString objectForKey:@"text"];
    
        //Clean the string from URLs
        NSError *error;
        NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error];
        NSArray *matches = [linkDetector matchesInString:string options:0 range:NSMakeRange(0, [string length])];
        NSLog(@"matches %@", matches);
    
        if ([matches count] > 0) {
            for (NSTextCheckingResult *match in matches) {
                if ([match resultType] == NSTextCheckingTypeLink) {
                    NSString *linkToRemove = [[match URL] absoluteString];
                    self.cleanString = [string stringByReplacingOccurrencesOfString:linkToRemove withString:@""];
                    NSLog(@"Clean string: %@", self.cleanString);
    
                }
            }
        } else {
            NSLog(@"NO LINK");
            self.cleanString = string;
        } //END IF/ELSE
    
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(speakAString:) object:self.cleanString];
    [queue addOperation:operation];
    
    //Message back to the main thread
    [self performSelectorOnMainThread:@selector(taDah) withObject:nil waitUntilDone:YES];
    
    } //END FOR LOOP
    

    }

    • (void)speakAString:(NSString*)stringToSpeak { ISSpeechSynthesis *synthesis = [[ISSpeechSynthesis alloc] initWithText:stringToSpeak]; NSError *エラー; if(![synthesis speak:&err]) { NSLog(@"エラー: %@", err); } self.cleanString = nil; }

これらのメソッドによって値が渡されます。

それは最初のものを話しますが、私はこれを取得します:

Domain=com.ispeech.ispeechsdk.ErrorDomain Code=303 "SDK は既に合成または認識を実行しています。それが完了するまで待ってから、別の要求を開始してください。" UserInfo=0xb54f2b0 {NSLocalizedDescription=SDK は既に合成または認識を実行しています。別のリクエストを開始する前に、それが完了するのを待ってください。}

操作キューが待機していないのはなぜですか?

4

0 に答える 0