2015-04-14 3 views
1

Я пишу приложение, которое позволяет пользователям нажимать кнопку, когда они слышат ссылку на веб-сайт, за которой они хотят следовать.Подождите, пока AVSpeechSynthesiser закончит произносить

Проблема заключается в том, что цикл for, который я использую, добавляет весь текст в список высказываний и не дожидается завершения произнесения до продолжения, что означает, что я не могу сказать, какую ссылку они хотят придерживаться.

У меня есть класс с именем

речи

, который является делегатом AVSpeechSynthesiser и попытались создать свой собственный способ определения того, когда произнесение заключил:

-(id)init { 
self = [super init]; 
if (self) { 
    _synthesiser = [[AVSpeechSynthesizer alloc]init]; 
    [self setSpeaking:NO]; 
} 
return self; 
} 

-(void)outputAsSpeech:(NSString *)text 
{ 
[self setSpeaking:YES]; 
[[self synthesiser]speakUtterance:[[AVSpeechUtterance alloc]initWithString:text]]; 
} 

-(BOOL)isSpeaking 
{ 
return [self speaking]; 
} 

-(void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance 
{ 
[self setSpeaking:NO]; 
} 

И в классе

ViewController

-(void)readBookmarks 
{ 
[[self speech]continueSpeech]; 
[[self speech]outputAsSpeech:@"Bookmarks,"]; 
for ([self bookmarksPointer]; [self bookmarksPointer] < [[self bookmarks]count]; _bookmarksPointer++) { 
    NSDictionary* dictionary = [[self bookmarks]objectAtIndex:[self bookmarksPointer]]; 
    [[self speech]outputAsSpeech:[dictionary objectForKey:@"title"]]; 
    while ([[self speech]isSpeaking]) {} 
    } 
} 

Идея заключалась в том, что приложение должно ждать, пока произнесение не произошло, а затем продолжить. Но на данный момент он считывает «Закладки» и останавливается, он даже не считывает первую закладку, я также попытался поместить цикл while в начало цикла for.

Может ли кто-нибудь помочь мне, пожалуйста, я был бы очень признателен.

Благодаря

+0

Что происходит, когда вы проходите цикл for? Что такое значение NSDictionary? Как насчет значения objectForKey? –

+0

Они оба получают правильные результаты, я знаю, что он получает правильный текст из каждого NSDictionary. – user3801877

ответ

0

Так после того, как разрывают мои волосы, ища ответ, я понял, что я еще не ставил делегат синтезатора на «я». (Я ненавижу себя!)

Однако это не решило мою проблему, по какой-то причине это все еще не сработало. Я обнаружил, что speechSynthesiser: didFinishSpeakingUtterance: никогда не вызывался.

Поэтому вместо этого я отправил свой объект речи массив строк, который я хотел, чтобы он сказал и отслеживал их в этом объекте. Затем я добавил метод, чтобы вернуть позицию в массиве текста, который в настоящее время говорит синтезатором:

речи

-(id)init 
{ 
self = [super init]; 

if (self) { 
    _synthesiser = [[AVSpeechSynthesizer alloc]init]; 
    [[self synthesiser]setDelegate:self]; 
    [self setSpeaking:NO]; 
    } 
return self; 
} 

-(void)outputAsSpeech:(NSArray*)textArray 
{ 
[self setTextToBeSpoken:textArray]; 
[self setArrayPointer:0]; 
[[self synthesiser]speakUtterance:[[AVSpeechUtterance alloc]initWithString:[[self textToBeSpoken]objectAtIndex:[self arrayPointer]]]]; 
} 

-(void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance 
{ 
_arrayPointer++; 
if ([self arrayPointer] < [[self textToBeSpoken]count]) { 
    [[self synthesiser]speakUtterance:[[AVSpeechUtterance alloc]initWithString:[[self textToBeSpoken]objectAtIndex:[self arrayPointer]]]]; 
    } 
} 

-(int)stringBeingSpoken 
{ 
return [self arrayPointer]; 
} 

ViewController

-(void)readBookmarks 
{ 
[[self speech]continueSpeech]; 
NSMutableArray* textToSpeak = [[NSMutableArray alloc]init]; 
for (int i = 0; i < [[self bookmarks]count]; i++) { 
    NSDictionary* dictionary = [[self bookmarks]objectAtIndex:i]; 
    NSString* textToRead = [dictionary objectForKey:@"title"]; 
    [textToSpeak addObject:textToRead]; 
    } 
[[self speech]outputAsSpeech:textToSpeak]; 
} 

-(void)currentlyBeingSpoken 
{ 
    NSDictionary* dictionary = [[self bookmarks]objectAtIndex:[[self speech]stringBeingSpoken]]; 
    NSLog([dictionary objectForKey:@"title"]); 
}