2

Я использую 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), ответ для преобразования голоса в текст делает что-то, что может нарушить выход синтезатора.

Некоторые вещи, которые я заметил во время моих попыток понять это:

  1. Запуск в тренажере, нет никаких проблем. На самом деле, я должен быть осторожным, чтобы до конца записи до конца закончилась речь, иначе запись выберет выход через микрофон.

  2. На iPad 3 w/iOS 7+ начало записи приостанавливает выход синтезатора до тех пор, пока не будет воспроизведен записанный файл. После успешной записи медиа-ссылка на файл будет выпущена.

  3. После записи синтезатор делегат получает ответы:

    TTSPlugin же начать говорить TTSPlugin будет говорить в диапазоне речи строки. TTSPlugin будет говорить в диапазоне речи. TTSPlugin будет говорить в диапазоне речи. TTSPlugin действительно отменил разговор

  4. Отмена синтеза речи очищает очередь высказывания.

Моя цель - иметь возможность общаться с приложением. Я не могу найти, где это вмешательство. Помогите?

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]); 
     } 
    } 
} 
+0

Пожалуйста, добавьте ваш код, как вы создаете аудиофайл из AVSpeechUtterance. У меня проблема с моей стороны, но я не могу создать аудиофайл из AVSpeechUtterance. Спасибо –

+0

На самом деле я не записываю вывод AVSpeechUtterance. Запись предназначена для отправки звука на внешний сервер для декодирования, и AVSpeechUtterance предназначен для ответа на ответ на основе ответа сервера. Я знаю, что Android может делать то, что вы хотите, но я ничего не помню в документах AVSpeechSynthesizer. Возможно, вы сможете использовать AVAudioSession для вывода вывода на рекордер. – user1541723

ответ

0

метод startRecordingAudio в медиа (CDVSound.m) установлено как "AVAudioSession AVAudioSessionCategoryRecord".

В моем случае, я просто добавил следующую строку 1, это работает для меня.

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
[self.synthesizer speakUtterance:utt]; 
+0

Можете ли вы объяснить, что вы имеете в виду: «В моем случае я просто добавил следующую строку, это работает для меня».?Я смотрю на файл, и я не могу увидеть, где добавить этот код. – Anthony

+0

Извините, но я забыл об этом. Я пробовал, но ... Кажется, на него отвечает сам, я должен удалить свой ответ ... – satohiro