【问题标题】:Is it possible to make "HTML to speech" same like "Text to speech"?是否可以使“HTML 到语音”与“文本到语音”一样?
【发布时间】:2017-01-10 04:33:19
【问题描述】:

我有一个奇怪的要求,在我现有的应用程序中,我有 Text2Speech,为此,我使用 AVSpeechSynthesizer 来语音文本,但现在要求改变了,现在我需要将 HTML 文件数据转换为类似的文本HTML2Speech.

我们可以想到的一个解决方案:

使用 HTML 解析并从 HTML 中获取所有文本并使用相同的框架 对于 Text2Speech。

但是客户不想要这种类型的解析,他想要任何API 或直接提供HTML2Speech 功能的框架。

我们将不胜感激任何建议或帮助。

【问题讨论】:

  • 是的!但是你有固定格式的 HTML 吗?
  • 不存在 HTML 文件的修复格式。
  • “他想要任何直接提供 HTML2Speech 功能的 API 或框架”,任何这样做的 API 都会解析底层 HTML 并将其提供给 Text2Speech。没有其他办法。

标签: html ios text-to-speech


【解决方案1】:

由于我在这里使用过 HTML 解析和 text2speech,因此您可以执行 2 个步骤 1.get Attribute string from HTML file with below code works in iOS7+

根据您的客户观点:如果 HTML2Speech 市场上有任何 API 可能是其付费或 如果您使用任何 API,您将依赖该 API。而原生框架 将有助于满足您/客户的需求。

第 1 步:

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

然后你可以在AVSpeechUtterance中传递这个Attributed String

第 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】:

    这里有两个部分的解决方案...

    1. 大概您并不关心 HTML 中的格式——毕竟,当它到达语音合成器时,该文本将被说出,而不是被查看。 AVSpeechSynthesizer 接受纯文本,所以你只需要去掉 HTML 标记。一种简单的方法是创建一个NSAttributedStringfrom the HTML,然后要求该属性字符串为其基础纯文本string 将文本传递给合成器。

    2. 在 iOS 10 中,您甚至不必从属性字符串中提取字符串 — 您可以传递属性字符串 directly to AVSpeechUtterance

    【讨论】:

      【解决方案3】:

      如果您不想读取文件,它总会以某种方式将 HTML 解析为其他内容。如果客户想要直接的HTML2Speech 解决方案,您可以提供一种将 html 文件作为参数并读取它的方法。这个文件在后台发生的事情应该不会打扰客户,只要它是干净的并且不会引起问题。

      当客户要求Markdown2SpeechXML2Speech 时会发生什么。对于我在您的描述中看到的,现在最好将它放在一个具有两个公共方法 Text2SpeechHTML2Speech 的框架中,它们将作为文件或 NSString 的参数链接。

      正如@rickster 建议的那样,它可以是NSAttributedStringNSString。那里有很多解析器,或者如果您想要自己的解决方案,您可以删除 <> 中的所有内容并更改编码。

      【讨论】:

        【解决方案4】:

        最安全的方法是提取文本并使用现有的 text2speech API。

        如果您确定浏览器将是 chrome,那么 Speech Synthesis API 可能会有所帮助。但是这个 API 仍然没有被所有浏览器完全采用;这将是一个冒险的解决方案。

        您可以在

        找到有关此 API 的必要信息

        除了上面提到的语音合成 API 之外,没有直接的 HTML 到语音的 API。虽然你可以试试http://responsivevoice.org/。但我认为这也是基于浏览器的语音合成或服务器上的语音生成。所以要使用这个,你必须提取文本并将文本传递给 API 以获取语音

        【讨论】:

          猜你喜欢
          • 2023-03-03
          • 2015-06-16
          • 2011-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多