Можно ли сделать "HTML в речь" таким же, как "Текст в речь"?
У меня есть одно странное требование, что в моем существующем приложении у меня есть Text2Speech
и для этого я использовал AVSpeechSynthesizer
для речевого текста, но теперь мое требование клиента AVSpeechSynthesizer
чтобы он хотел произносить HTML
файл, поскольку у него много HTML
файлов в его DB
.
Мое предложение:
используйте разбор HTML
и получите весь текст из HTML и используйте ту же платформу для Text2Speech.
Но клиент не хочет такого анализа, и ему нужен любой API
или фреймворк, который предоставляет функцию HTML2Speech
напрямую.
Любое предложение или помощь будут высоко оценены.
Ответы
Ответ 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 для получения речи