Я использую Cordova 3.2 для текста в речь и речь к тексту. В iOS 7 AVSpeechSynthesizer доступен и работает очень хорошо. Вот критический бит плагина:AVAudioRecorder блокирует AVSpeechSynthesizer
self.synthesizer = [[AVSpeechSynthesizer alloc] init];
self.synthesizer.delegate = self;
NSString * toBeSpoken=[command.arguments objectAtIndex:0];
NSNumber * rate=[command.arguments objectAtIndex:1];
NSString * voice=[command.arguments objectAtIndex:2];
NSNumber * volume=[command.arguments objectAtIndex:3];
NSNumber * pitchMult=[command.arguments objectAtIndex:4];
AVSpeechUtterance *utt =[[AVSpeechUtterance alloc] initWithString:toBeSpoken];
utt.rate= [rate floatValue]/4;// this is to slow down the speech rate
utt.volume=[volume floatValue];
utt.pitchMultiplier=[pitchMult floatValue];
utt.voice=[AVSpeechSynthesisVoice voiceWithLanguage:voice];
[self.synthesizer speakUtterance:utt];
Проблема возникает после того, как текст будет произнесен. Используя вызов Cordova Media для записи (AVAudioRecorder), ответ для преобразования голоса в текст делает что-то, что может нарушить выход синтезатора.
Некоторые вещи, которые я заметил во время моих попыток понять это:
Запуск в тренажере, нет никаких проблем. На самом деле, я должен быть осторожным, чтобы до конца записи до конца закончилась речь, иначе запись выберет выход через микрофон.
На iPad 3 w/iOS 7+ начало записи приостанавливает выход синтезатора до тех пор, пока не будет воспроизведен записанный файл. После успешной записи медиа-ссылка на файл будет выпущена.
После записи синтезатор делегат получает ответы:
TTSPlugin же начать говорить TTSPlugin будет говорить в диапазоне речи строки. TTSPlugin будет говорить в диапазоне речи. TTSPlugin будет говорить в диапазоне речи. TTSPlugin действительно отменил разговор
Отмена синтеза речи очищает очередь высказывания.
Моя цель - иметь возможность общаться с приложением. Я не могу найти, где это вмешательство. Помогите?
EDIT
Я решил проблему. Преступником был AVAudioSession, которым управлял плагин Media в Кордове. Раньше я не делал много источников звука, так что это был колокольчик.
Я добавил их в свой плагин TTS, чтобы управлять AVAudioSession и активировать его по мере необходимости. Теперь все в порядке.
// returns whether or not audioSession is available - creates it if necessary
- (BOOL)hasAudioSession
{
BOOL bSession = YES;
if (!self.avSession) {
NSError* error = nil;
self.avSession = [AVAudioSession sharedInstance];
if (error) {
// is not fatal if can't get AVAudioSession , just log the error
NSLog(@"error creating audio session: %@", [[error userInfo] description]);
self.avSession = nil;
bSession = NO;
}
}
return bSession;
}
- (void)setAudioSession
{
if ([self hasAudioSession]) {
NSError* __autoreleasing err = nil;
NSNumber* playAudioWhenScreenIsLocked = 0;
BOOL bPlayAudioWhenScreenIsLocked = YES;
if (playAudioWhenScreenIsLocked != nil) {
bPlayAudioWhenScreenIsLocked = [playAudioWhenScreenIsLocked boolValue];
}
NSString* sessionCategory = bPlayAudioWhenScreenIsLocked ? AVAudioSessionCategoryPlayback : AVAudioSessionCategorySoloAmbient;
[self.avSession setCategory:sessionCategory error:&err];
if (![self.avSession setActive:YES error:&err]) {
// other audio with higher priority that does not allow mixing could cause this to fail
NSLog(@"Unable to play audio: %@", [err localizedFailureReason]);
}
}
}
Пожалуйста, добавьте ваш код, как вы создаете аудиофайл из AVSpeechUtterance. У меня проблема с моей стороны, но я не могу создать аудиофайл из AVSpeechUtterance. Спасибо –
На самом деле я не записываю вывод AVSpeechUtterance. Запись предназначена для отправки звука на внешний сервер для декодирования, и AVSpeechUtterance предназначен для ответа на ответ на основе ответа сервера. Я знаю, что Android может делать то, что вы хотите, но я ничего не помню в документах AVSpeechSynthesizer. Возможно, вы сможете использовать AVAudioSession для вывода вывода на рекордер. – user1541723