我有一个奇怪的要求,在我现有的应用中,我有Text2Speech
,为此,我使用AVSpeechSynthesizer
语音文字,但现在我的客户要求他想发言HTML
文件,因为他在HTML
中有很多DB
个文件。
我的建议:
使用
HTML
解析并从HTML获取所有文本并使用相同的框架 对于Text2Speech。
但是客户端不希望这种类型的解析,他希望任何API
或框架直接提供HTML2Speech
功能。
任何建议或帮助都将受到高度赞赏。
答案 0 :(得分:5)
由于我在这里使用过HTML解析和text2speech,你可以使用两个步骤
1.get来自HTML文件的属性字符串,以下代码适用于console.log(Function.prototype.toString.call(foo));
根据您的客户观点:如果HTML2Speech市场上有任何API可能是其付费或 如果您使用任何API,则依赖于该API。而Native框架 将帮助你/客户想要的东西。
第1步:
iOS7+
然后您可以在[[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding]
options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)}
documentAttributes:nil error:nil];
第2步: 使用下面的方法获取HTML2String:
AVSpeechUtterance
和往常一样,你需要在代码下方停止使用以停止言语。
/**
* "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];
}
}
希望这将有助于您获得HTML2Speech功能。
答案 1 :(得分:4)
这里有一个解决方案的两个部分......
据推测,你并不关心HTML中的格式 - 毕竟,当它到达语音合成器时,这个文本就会被说出来,而不是被查看。 AVSpeechSynthesizer
采用纯文本,因此您只需要删除HTML标记。一种简单的方法是创建NSAttributedString
from the HTML,然后要求其基础纯文本string
的属性字符串将文本传递给合成器。
在iOS 10中,您甚至不必从属性字符串中提取字符串 - 您可以传递属性字符串directly to AVSpeechUtterance
。
答案 2 :(得分:3)
如果您不想阅读文件,它将始终将HTML解析为其他内容。如果客户端需要直接HTML2Speech
解决方案,您可以提供一种方法,将html文件作为参数并读取它。只要它干净并且没有引起问题,这个文件在幕后发生的事情不应该打扰客户端。
当客户要求Markdown2Speech
或XML2Speech
时会发生什么。对于我在你的解释中看到的,最好现在在一个框架中使用两个公共方法Text2Speech
和HTML2Speech
将它作为文件或NSString的参数链接。
因此@rickster建议它可以是NSAttributedString
或NSString
。那里有很多解析器,或者如果你想要自己的解决方案,你可以删除<
和>
内的所有内容并更改编码。
答案 3 :(得分:1)
最安全的方法是提取文本并使用现有的text2speech API。
虽然如果您确定浏览器是chrome,那么Speech Synthesis API可能会有所帮助。但是这个API仍未被所有浏览器完全采用;这将是一个冒险的解决方案。
您可以在
找到有关此API的必要信息除了上面提到的语音合成API之外,没有HTML到语音的直接API。虽然你可以尝试http://responsivevoice.org/。但我认为这个也是基于浏览器的语音合成或服务器上的语音生成。因此,要使用此文件,您必须提取文本并将文本传递给API以获取语音