5

UITextViewflite-1.4-iphone を使用してテキスト読み上げを行っています。テキストを読んでいる間、テキストを単語ごとに自動的に強調表示したいと思います。

  1. 読みながら音声をテキストの強調表示に同期させるにはどうすればよいですか?
  2. テキストビューでテキストを強調表示するにはどうすればよいですか?

これが私の現在のコードです:

-(IBAction)btnClick:(id)sender
{
    [indicator startAnimating]; 
    textToSpeech = [[TextToSpeech alloc] init]; 
    [textToSpeech setVoice:@"cmu_us_awb"];
    [textToSpeech speakText:txtview.text];
    if ([txtview.text isEqualToString:@""]) 
    {
        [textToSpeech stopTalking];
        [self animate];
    }
}
4

1 に答える 1

2

Flite には、どの単語がいつ話されているかを確認する方法がありません。テキストを使用してオーディオ ファイルを生成し、それを再生するだけです。TextToSpeech に渡される情報を処理するカスタム クラスを作成できます。クラスは文字列を個別の単語に分割し、それらを flite に渡します。

fliteTTS.m を見ると、speakText: メソッドで、wav ファイルを作成し、AVPlayer に wav ファイルを再生させることがわかります。あなたができることは、ファイルを再生する代わりに、wavファイルへのURLをカスタムクラスに返すようにそのメソッドを変更することです(配列に保存できます)。

次に、カスタム クラスにサウンドを順番に再生させ、次のクリップを再生するたびに、テキストの新しいセクションを強調表示します。

したがって、speakText の代わりに:

-(NSString *)urlForSpeech:(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"];
    // save wave to disk
    char *path;     
    path = (char*)[tempFilePath UTF8String];
    cst_wave_save_riff(sound, path);

    return tempFilePath;      
}

AVPlayer がファイルを再生するときにテキストを強調表示するには、次を使用します。

[textView select:self];
textView.selectedRange = aSelectedRange; 

aSelectedRange は、強調表示する文字列の範囲です。

私は AVPlayer に詳しくないので、その設定を手伝うことはできませんが、Apple の開発者サイトには非常に優れたサンプルがいくつかあります。これはあなたが見るべきものです:リンク

作業が終わったら、オーディオ ファイルを削除することを忘れないでください。

于 2012-08-12T16:56:06.830 に答える