2016-09-02 15 views
19

Mam jedno przewodowe wymaganie, że w mojej aplikacji kończącej mam Text2Speech i do tego użyłem AVSpeechSynthesizer do tekstu mowy, ale teraz mój wymóg klienta on chce przemówienia HTML plik, ponieważ ma on wiele HTML plik w jego DB.Czy można "HTML na mowę", podobnie jak "Tekst na mowę"?

Moja sugestia:

użycie HTML parsowanie i dostać cały tekst z HTML i używać tej samej ramy dla Text2Speech.

Ale klient nie chce tego typu analizy składniowej i chce żadnej API lub ramy, która jest wykonywana bezpośrednio HTML2Speech funkcję.

Wszelkie sugestie lub pomoc będą bardzo cenne.

+0

Tak! ale czy masz format HTML? – amorbytes

+0

Nie, nie ma poprawionego formatu pliku HTML. – CodeChanger

+0

"chce dowolnego interfejsu API lub frameworka dostarczającego bezpośrednio funkcję HTML2Speech", każde API, które to zrobi, przetworzy podstawowy kod HTML i doda go do Text2Speech. Nie ma innego wyjścia. – Kevin

Odpowiedz

5

Jak już pracował z parsowania HTML i text2speech tutaj można przejść z 2 kroki 1.Get Atrybut ciąg z pliku HTML z poniższym kodzie pracuje w iOS7+

jak na swoje perspektywy klienta: jeśli na rynku istnieje dowolne API dla HTML2Speech może być płatne lub zależne od tego API, jeśli go używasz. Podczas gdy natywny framework pomoże ci to, czego Ty/klient chcesz.

Krok 1:

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

Następnie można przejść ten nadana smyczkowy AVSpeechUtterance

Krok 2: użycie poniżej sposób, aby uzyskać 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]; 
    } 

} 

i jak zwykle, gdy chcesz przestać używać kodu poniżej, aby zatrzymać Mowę.

/** 
* "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]; 
} 

Nadzieja Pomoże ci to uzyskać funkcję HTML2Speech.

1

Najbezpieczniejszą metodą będzie wyodrębnienie tekstu i użycie istniejącego API text2speech.

Chociaż, jeśli masz pewność, że przeglądarka będzie chromowana, może pomóc funkcja API do syntezy mowy. Ale ten interfejs API nadal nie jest w pełni przyjęty przez wszystkie przeglądarki; będzie to ryzykowne rozwiązanie.

można znaleźć niezbędne informacje dotyczące tego API w

Nie ma bezpośredniego API HTML na mowę wyjątkiem Speech Synthesis API wymienionych powyżej. Chociaż możesz spróbować http://responsivevoice.org/. Ale myślę, że ta jest również oparta na syntezie mowy w przeglądarce lub generowaniu mowy na serwerze. Więc korzystać z tego jeden, trzeba by wydobyć tekst i przekazać tekst do API, aby uzyskać przemówienia

4

Nie ma dwie części, do roztworu tutaj ...

  1. Przypuszczalnie nie obchodzi formatowanie w kodzie HTML - w końcu, zanim dojdzie do syntezatora mowy, ten tekst będzie wypowiadany, a nie oglądany. AVSpeechSynthesizer przyjmuje zwykły tekst, więc wystarczy pozbyć się znaczników HTML. Jednym z łatwych sposobów na to jest stworzenie NSAttributedStringfrom the HTML, a następnie spytaj, że przypisany ciąg dla jego zwykłego tekstu string przekazuje tekst do syntezatora.

  2. W iOS 10 nie trzeba nawet wyodrębniać napisów z przypisanego ciągu znaków - można przekazać przypisany ciąg directly to AVSpeechUtterance.

3

Tak czy inaczej zawsze będzie parsowanie HTML do czegoś innego, jeśli nie chcesz czytać plików. Jeśli klient chce bezpośrednio użyć rozwiązania HTML2Speech, możesz podać metodę, która pobiera plik html jako argument i odczytuje go. To, co dzieje się z tym plikiem pod maską, nie powinno przeszkadzać klientowi tak długo, jak długo jest czyste i nie powoduje problemów.

Co się stanie, gdy klient poprosi o Markdown2Speech lub XML2Speech. Dla tego, co widzę w twoim opisie, lepiej jest mieć go na razie w jednej strukturze z dwiema publicznymi metodami, które przyjmą jako argument link do pliku lub NSString.

Tak więc @Rickster sugeruje, że może to być NSAttributedString lub NSString. Istnieje wiele parserów, lub jeśli chcesz własne rozwiązanie, możesz usunąć wszystko, co jest w środku < i > i zmienić kodowanie.

Powiązane problemy