2016-09-02 8 views
19

私はText2Speechを持っていて、私はAVSpeechSynthesizerをスピーチテキストに使用していましたが、今は私のクライアントの要求で彼はスピーチHTMLファイルに彼のDBのファイルがたくさんあるので、「音声対話」を「音声対話」と同じようにすることは可能ですか?

私の提案:

HTML解析を使用して、HTMLからすべてのテキストを取得し、Text2Speechための同じフレームワーク を使用しています。

しかし、クライアントは、構文解析の種類を望んでいないと彼が直接HTML2Speech機能を提供している任意のAPIまたはフレームワークを望んでいます。

ご意見やご協力をいただければ幸いです。

+0

はい!あなたは修正形式のHTMLを持っていますか? – amorbytes

+0

いいえHTMLファイルの定型書式はありません。 – CodeChanger

+0

「彼はHTML2Speech機能を直接提供しているAPIまたはフレームワークを望んでいます」、これを行うAPIはすべて、基になるHTMLを解析してText2Speechに送ります。他の方法はありません。 – Kevin

答えて

5

は、私はここにあなたが2で行くことができるHTMLの解析とtext2speechで働いていた下記のコードでHTMLファイルから し1.Get属性文字列ステップたようiOS7+あなたのクライアントの観点 1として

で動作します。if HTML2Speechが有料であるか、 であれば、そのAPIに依存しているAPIがあります。ネイティブフレームワーク は、you/clientが望むものと同じものに役立ちます。

ステップ1: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]; 
    } 

} 

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

次に、あなたはAVSpeechUtterance

ステップ2でこの属性付き文字列を渡すことができます

いつものように、音声を止めるにはコードの下での使用を止める必要があります。

/** 
* "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機能を取得するのに役立ちます。

1

最も安全な方法は、テキストを抽出して既存のtext2speech APIを使用することです。

ブラウザがクロムに​​なると確信が持てば、Speech Synthesis APIが役に立つかもしれません。しかし、このAPIはまだすべてのブラウザで完全に採用されていません。それは危険な解決策になるでしょう。

あなたは、上記の音声合成APIを除くスピーチにHTMLには直接のAPIはありません

で、このAPIに関する必要な情報を見つけることができます。あなたはhttp://responsivevoice.org/を試すことができますが。しかし、私はこれもブラウザの音声合成やサーバーでの音声生成に基づいていると思います。したがって、このいずれかを使用して、テキストを抽出してスピーチ

4

ここに解決策には2つの部分がありますを取得するAPIにテキストを渡す必要があります...

  1. おそらくあなたは気にしません結局のところ、HTMLのフォーマットは、音声シンセサイザーに到達するまでに、このテキストは表示されず、表示されます。 AVSpeechSynthesizerはプレーンテキストなので、HTMLマークアップを取り除くだけで済みます。これを行う簡単な方法の1つは、NSAttributedStringfrom the HTMLを作成し、その属性文字列の基礎となるプレーンテキストstringがシンセサイザーにテキストを渡すように要求することです。

  2. iOS 10では、アトリビュートされた文字列から文字列を抽出する必要はありません。アトリビュートされた文字列directly to AVSpeechUtteranceを渡すことができます。

3

ファイルを読みたくない場合は、何か別の方法でHTMLを解析することがあります。クライアントが直接HTML2Speechソリューションを必要とする場合は、引数としてhtmlファイルを取得して読み取るメソッドを提供できます。フードの下でこのファイルで起こっていることは、クリーンで問題を引き起こさない限り、クライアントを気にしてはいけません。

クライアントがMarkdown2SpeechまたはXML2Speechを要求するとどうなりますか?あなたのdesciptionで見るものは、ファイルまたはNSStringへの引数リンクとして取る2つのパブリックメソッドText2SpeechHTML2Speechを持つ1つのフレームワークで今のところ持っている方が良いです。

@ricksterのように、NSAttributedStringまたはNSStringとすることができます。そこには多くのパーサーがあります。または、独自のソリューションをご希望の場合は、<>の中にあるものをすべて削除し、エンコードを変更することができます。

関連する問題