Lektor na podstawie napisów [klasa SpeechSynthesizer]

1

Witam, właśnie próbuję napisać aplikacje, która tworzyłaby ścieżkę dźwiękową lektora na podstawie napisów do filmu.

Póki co próbuję wykorzystać w tym celu klasę http://msdn.microsoft.com/en-us/library/system.speech.synthesis.speechsynthesizer.aspx oraz syntezator mowy Ivona 2 głos Jacek :)
I niby czytanie wybranego tekstu jest banalne:

      SpeechSynthesizer synth = new SpeechSynthesizer();
      synth.SetOutputToDefaultAudioDevice();
      synth.SelectVoice("Ivona 2 Jacek");
      synth.Speak("Tekst do odczytania."); 

Da się też to łatwo zapisać do pliku .wav:

      synth.SetOutputToWaveFile("E:\test.wav");
      synth.Speak("Tekst do odczytania.");
      synth.SetOutputToDefaultAudioDevice();

Ale jak czytać napisy? Główny problem to czas:

  • jak czytać kolejne linijki w określony czasie?
  • jak stworzyć tą "głuchą przestrzeń" miedzy nim?

Załóżmy, że mamy napisy takiego formatu:

0054:Gdzie podziała się duma posiadania?|Gdzie?
0058:Gdzie obsługa klienta?
0007:Rozumiesz o czym mówię?

Stworzenie 4 (0058-0054) sekundowej

synth.Pause()

między 1. a 2. linijką odpada, bo przeczytanie 1. linijki też zajmuje jakiś czas.

Kombinuję, ale nic nie mogę wymyślić, może coś podpowiecie?

0

Musisz sprawdzać czas jaki ubiegł od rozpoczęcia czytania tekstu po przeczytaniu każdej linijki. I tak po przeczytaniu pierwszej sprawdzasz jaki czas upłynął i jeżeli mniej niż 2 minuty i 58 sekund to czekasz tyle ile trzeba, w przeciwnym wypadku od razu trzeba uruchomić dalej czytanie bo już jesteśmy w tyle

1

Nie wiem do końca w czym problem? Tak samo jak wyświetlanie napisów tylko zamiast wyświetlenia linijki na ekranie wysłanie jej do syntezatora mowy. Nie traktuj pliku jako całości, tylko wywołuj metodą generującą mowę dla każdej sygnatury czasowej, czyli przykładowo:

  • czas 0054: powiedz: Gdzie podziała się duma posiadania? Gdzie?
  • czas 0058: powiedz: Gdzie obsługa klienta?

Odtwarzając film masz dostępny upływający czas, więc w czym problem? Wczytujesz tylko sygnatury czasowe i kwestie do wypowiedzenia z pliku do jakiejś struktury typu słownik albo lista, synchronizujesz to z upływającym czasem filmu i w odpowiednim momencie wywołujesz metodę która wypowie odpowiednią kwestię. Oczywiście dobrze by było zadbać o kolejkowanie wypowiadanych kwestii, jeśli metoda która "mówi" jest blokująca to nie powinno być to trudne. Chodzi o to, że czasem lektor "nie zdąży" skończyć mówić pierwszej kwestii a jest już do powiedzenia kolejna - takie przypadki należałoby jakoś obsłużyć - albo "urwać" poprzednie zdanie albo skolejkować to.

1

Niby tak, ale chodzi mi o to, żeby powstał ciągły plik audio niezależny od filmu. Główny problem to posklejanie wszystkich kwestii (oczywiście zachowując synchronizację zawartą w pliku z napisami) w jeden, niezależny plik, który później można by wykorzystać jako dodatkową ścieżkę dźwiękową.

1 użytkowników online, w tym zalogowanych: 0, gości: 1