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 の開発者サイトには非常に優れたサンプルがいくつかあります。これはあなたが見るべきものです:リンク
作業が終わったら、オーディオ ファイルを削除することを忘れないでください。