Подтвердить что ты не робот

Можно ли сделать "HTML в речь" таким же, как "Текст в речь"?

У меня есть одно странное требование, что в моем существующем приложении у меня есть Text2Speech и для этого я использовал AVSpeechSynthesizer для речевого текста, но теперь мое требование клиента AVSpeechSynthesizer чтобы он хотел произносить HTML файл, поскольку у него много HTML файлов в его DB.

Мое предложение:

используйте разбор HTML и получите весь текст из HTML и используйте ту же платформу для Text2Speech.

Но клиент не хочет такого анализа, и ему нужен любой API или фреймворк, который предоставляет функцию HTML2Speech напрямую.

Любое предложение или помощь будут высоко оценены.

4b9b3361

Ответ 1

Поскольку я работал с разбором HTML и текстовым текстом здесь, вы можете пойти с двумя шагами 1.get Строка атрибута из HTML файла с приведенным ниже кодом работает в iOS7+

В соответствии с перспективой вашего клиента: если на рынке существует какой-либо API на рынке, для HTML2Speech может быть его Платный или вы зависите от этого API, если используете какой-либо. Хотя коренные рамки поможет тем же, что вы/клиент хочет.

Шаг 1:

[[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] 
                                 options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                           NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} 
                      documentAttributes:nil error:nil];

Затем вы можете передать эту Attributed String в AVSpeechUtterance

Шаг 2: используйте метод ниже для получения HTML2String:

/**
 *  "ConvertHTMLtoStrAndPlay" : This method will convert the HTML to String 
 synthesizer.
 *
 *  @param aURLHtmlFilePath : "object of html file path"
 */
-(void)ConvertHTMLtoStrAndPlay:(UIButton*)aBtnPlayPause
                isSpeechPaused:(BOOL)speechPaused
      stringWithHTMLAttributes:(NSAttributedString*)aStrWithHTMLAttributes
{

    if (synthesizer.speaking == NO && speechPaused == NO) {

        AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:aStrWithHTMLAttributes.string];
        //utterance.rate = AVSpeechUtteranceMinimumSpeechRate;

        if (IS_ARABIC) {
            utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"ar-au"];
        }else{
            utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-au"];
        }

        [synthesizer speakUtterance:utterance];
    }
    else{
        [synthesizer pauseSpeakingAtBoundary:AVSpeechBoundaryImmediate];
    }

    if (speechPaused == NO) {
        [synthesizer continueSpeaking];
    } else {
        [synthesizer pauseSpeakingAtBoundary:AVSpeechBoundaryImmediate];
    }

}

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

/**
 *  "StopPlayWithAVSpeechSynthesizer" : this method will stop the playing of audio on the application.
 */
-(void)StopPlayWithAVSpeechSynthesizer{

    // Do any additional setup after loading the view, typically from a nib.
    [synthesizer stopSpeakingAtBoundary:AVSpeechBoundaryImmediate];
}

Надежда Это поможет вам получить функцию HTML2Speech.

Ответ 2

Здесь есть две части решения...

  • Предположительно, вы не заботитесь о форматировании в HTML - в конце концов, к тому времени, когда он попадает в синтезатор речи, этот текст должен быть произнесен, а не просмотрен. AVSpeechSynthesizer принимает простой текст, поэтому вам просто нужно избавиться от разметки HTML. Один простой способ сделать это - создать NSAttributedString из HTML, затем спросить, что атрибутная строка для его основного текстового текста string, чтобы передать текст синтезатору.

  • В iOS 10 вам даже не нужно извлекать строку из атрибутной строки - вы можете передать атрибутную строку непосредственно на AVSpeechUtterance.

Ответ 3

Так или иначе, он всегда будет анализировать HTML на что-то еще, если вы не хотите читать файлы. Если клиенту требуется прямое решение HTML2Speech, вы можете предоставить метод, который принимает html файл в качестве аргумента и читает его. То, что происходит с этим файлом под капотом, не должно беспокоить клиента так много, пока оно чистёт и не вызывает проблем.

Что произойдет, если клиент запросит Markdown2Speech или XML2Speech. Для того, что я вижу в вашем описании, лучше иметь его сейчас в одной структуре с двумя общедоступными методами Text2Speech и HTML2Speech, которые будут использоваться в качестве аргумента для файла или NSString.

Так как @rickster предполагает, что это может быть NSAttributedString или NSString. Существует много парсеров, или если вы хотите собственное решение, вы можете удалить все, что внутри < и >, и изменить кодировку.

Ответ 4

Самый безопасный способ - извлечь текст и использовать существующий API text2speech.

Хотя, если вы уверены, что браузер будет хром, то API синтеза речи может быть полезен. Но этот API до сих пор не полностью принят всеми браузерами; это будет рискованное решение.

Вы можете найти необходимую информацию об этом API в

Нет прямого API для HTML to Speech, кроме упомянутого выше API синтеза речи. Хотя вы можете попробовать http://responsivevoice.org/. Но я думаю, что это тоже основано на браузере Speech Synthesis или Speech generation на сервере. Таким образом, чтобы использовать этот, вам нужно будет извлечь текст и передать текст в API для получения речи