def main(): if len(sys.argv) < 4: usage() return text = sys.argv[1] language = sys.argv[2] output_file_path = sys.argv[3] synth = ESPEAKWrapper() synth.synthesize(text, language, output_file_path) print "Created file '%s'" % output_file_path
def main(): """ Entry point """ if len(sys.argv) < 4: usage() return text = sys.argv[1] language = sys.argv[2] output_file_path = sys.argv[3] synt = ESPEAKWrapper() synt.synthesize(text, language, output_file_path) print "[INFO] Created file '%s'" % output_file_path
def step4(): on_info("Test 4/6 (espeak)...") try: on_info(" Trying to call espeak...") from aeneas.espeakwrapper import ESPEAKWrapper from aeneas.language import Language text = u"From fairest creatures we desire increase," language = Language.EN handler, output_file_path = tempfile.mkstemp(suffix=".wav") espeak = ESPEAKWrapper() result = espeak.synthesize(text, language, output_file_path) os.close(handler) os.remove(output_file_path) if result: on_info(" Trying to call espeak... succeeded.") return True else: on_error(" Unable to call espeak.") on_error( " Please make sure you have espeak installed correctly and that it is in your $PATH." ) except: on_error(" Unable to call espeak.") on_error( " Please make sure you have espeak installed correctly and that it is in your $PATH." ) return False
def test_replace_language(self): text = u"Временами Сашке хотелось перестать делать то" language = Language.UK handler, output_file_path = tempfile.mkstemp(suffix=".wav") espeak = ESPEAKWrapper() result = espeak.synthesize(text, language, output_file_path) self.assertGreater(result, 0) os.close(handler) os.remove(output_file_path)
def test_empty_text(self): text = "" language = Language.IT handler, output_file_path = tempfile.mkstemp(suffix=".wav") espeak = ESPEAKWrapper() result = espeak.synthesize(text, language, output_file_path) self.assertEqual(result, 0) os.close(handler) os.remove(output_file_path)
def test_synthesize_unicode(self): text = u"Ausführliche" language = Language.DE handler, output_file_path = tempfile.mkstemp(suffix=".wav") espeak = ESPEAKWrapper() result = espeak.synthesize(text, language, output_file_path) self.assertGreater(result, 0) os.close(handler) os.remove(output_file_path)
def test_synthesize(self): text = u"Nel mezzo del cammin di nostra vita" language = Language.IT handler, output_file_path = tempfile.mkstemp(suffix=".wav") espeak = ESPEAKWrapper() result = espeak.synthesize(text, language, output_file_path) self.assertGreater(result, 0) os.close(handler) os.remove(output_file_path)
def synthesize(self, text, language, zero_length=False): handler, output_file_path = tempfile.mkstemp(suffix=".wav") espeak = ESPEAKWrapper() result = espeak.synthesize(text, language, output_file_path) if zero_length: self.assertEqual(result, 0) else: self.assertGreater(result, 0) delete_file(handler, output_file_path)
def step4(): on_info("Test 4/6 (espeak)...") try: on_info(" Trying to call espeak...") from aeneas.espeakwrapper import ESPEAKWrapper from aeneas.language import Language text = u"From fairest creatures we desire increase," language = Language.EN handler, output_file_path = tempfile.mkstemp(suffix=".wav") espeak = ESPEAKWrapper() result = espeak.synthesize(text, language, output_file_path) os.close(handler) os.remove(output_file_path) if result: on_info(" Trying to call espeak... succeeded.") return True else: on_error(" Unable to call espeak.") on_error(" Please make sure you have espeak installed correctly and that it is in your $PATH.") except: on_error(" Unable to call espeak.") on_error(" Please make sure you have espeak installed correctly and that it is in your $PATH.") return False
def synthesize(self, text_file, audio_file_path): """ Synthesize the text contained in the given fragment list into a ``wav`` file. :param text_file: the text file to be synthesized :type text_file: :class:`aeneas.textfile.TextFile` :param audio_file_path: the path to the output audio file :type audio_file_path: string (path) """ # time anchors anchors = [] # initialize time current_time = 0.0 # waves is used to concatenate all the fragments WAV files waves = numpy.array([]) # espeak wrapper espeak = ESPEAKWrapper(logger=self.logger) num = 0 # for each fragment, synthesize it and concatenate it for fragment in text_file.fragments: # synthesize and get the duration of the output file self._log("Synthesizing fragment %d" % num) handler, tmp_destination = tempfile.mkstemp( suffix=".wav", dir=gf.custom_tmp_dir() ) duration = espeak.synthesize( text=fragment.text, language=fragment.language, output_file_path=tmp_destination ) # store for later output anchors.append([current_time, fragment.identifier, fragment.text]) # concatenate to buffer self._log("Fragment %d starts at: %f" % (num, current_time)) if duration > 0: self._log("Fragment %d duration: %f" % (num, duration)) current_time += duration data, sample_frequency, encoding = wavread(tmp_destination) # # TODO this might result in memory swapping # if we have a large number of fragments # is there a better way? # # waves = numpy.concatenate((waves, data)) # # append seems faster than concatenate, as it should waves = numpy.append(waves, data) else: self._log("Fragment %d has zero duration" % num) # remove temporary file self._log("Removing temporary file '%s'" % tmp_destination) os.close(handler) os.remove(tmp_destination) num += 1 # output WAV file, concatenation of synthesized fragments self._log("Writing audio file '%s'" % audio_file_path) wavwrite(waves, audio_file_path, sample_frequency, encoding) # return the time anchors self._log("Returning %d time anchors" % len(anchors)) return anchors
def main(): on_info("Test 1/4...") try: on_info("Trying to import package aeneas...") import aeneas on_info("Trying to import package aeneas... succeeded.") except ImportError: on_error("Unable to import package aeneas.") on_error("Check that you have installed the following Python (2.7.x) packages:") on_error("1. BeautifulSoup") on_error("2. numpy") on_error("3. scikits") return on_info("Test 2/4...") try: on_info("Trying to call ffprobe...") from aeneas.ffprobewrapper import FFPROBEWrapper file_path = get_abs_path("aeneas/tests/res/container/job/assets/p001.mp3") prober = FFPROBEWrapper() properties = prober.read_properties(file_path) on_info("Trying to call ffprobe... succeeded.") except: on_error("Unable to call ffprobe.") on_error("Please make sure you have ffprobe installed correctly and that it is in your $PATH.") return on_info("Test 3/4...") try: on_info("Trying to call ffmpeg...") from aeneas.ffmpegwrapper import FFMPEGWrapper input_file_path = get_abs_path("aeneas/tests/res/container/job/assets/p001.mp3") handler, output_file_path = tempfile.mkstemp(suffix=".wav") converter = FFMPEGWrapper() result = converter.convert(input_file_path, output_file_path) os.close(handler) os.remove(output_file_path) if not result: on_error("Unable to call ffmpeg.") on_error("Please make sure you have ffmpeg installed correctly and that it is in your $PATH.") return on_info("Trying to call ffmpeg... succeeded.") except: on_error("Unable to call ffmpeg.") on_error("Please make sure you have ffmpeg installed correctly and that it is in your $PATH.") return on_info("Test 4/4...") try: on_info("Trying to call espeak...") from aeneas.espeakwrapper import ESPEAKWrapper from aeneas.language import Language text = u"From fairest creatures we desire increase," language = Language.EN handler, output_file_path = tempfile.mkstemp(suffix=".wav") espeak = ESPEAKWrapper() result = espeak.synthesize(text, language, output_file_path) os.close(handler) os.remove(output_file_path) if not result: on_error("Unable to call espeak.") on_error("Please make sure you have espeak installed correctly and that it is in your $PATH.") return on_info("Trying to call espeak... succeeded.") except: on_error("Unable to call espeak.") on_error("Please make sure you have espeak installed correctly and that it is in your $PATH.") return on_info("Congratulations, all dependencies are met.") on_info("Enjoy running aeneas!")
def synthesize(self, text_file, audio_file_path, quit_after=None, backwards=False): """ Synthesize the text contained in the given fragment list into a ``wav`` file. :param text_file: the text file to be synthesized :type text_file: :class:`aeneas.textfile.TextFile` :param audio_file_path: the path to the output audio file :type audio_file_path: string (path) :param quit_after: stop synthesizing as soon as reaching this many seconds :type quit_after: float :param backwards: synthesizing from the end of the text file :type backwards: bool """ # time anchors anchors = [] # initialize time current_time = 0.0 # waves is used to concatenate all the fragments WAV files waves = numpy.array([]) # espeak wrapper espeak = ESPEAKWrapper(logger=self.logger) if quit_after is not None: self._log(["Quit after reaching %.3f", quit_after]) if backwards: self._log("Synthesizing backwards") # for each fragment, synthesize it and concatenate it num = 0 num_chars = 0 fragments = text_file.fragments if backwards: fragments = fragments[::-1] for fragment in fragments: # synthesize and get the duration of the output file self._log(["Synthesizing fragment %d", num]) handler, tmp_destination = tempfile.mkstemp( suffix=".wav", dir=gf.custom_tmp_dir() ) duration = espeak.synthesize( text=fragment.text, language=fragment.language, output_file_path=tmp_destination ) # store for later output anchors.append([current_time, fragment.identifier, fragment.text]) # increase the character counter num_chars += fragment.characters # concatenate to buffer self._log(["Fragment %d starts at: %f", num, current_time]) if duration > 0: self._log(["Fragment %d duration: %f", num, duration]) current_time += duration data, sample_frequency, encoding = wavread(tmp_destination) # # TODO this might result in memory swapping # if we have a large number of fragments # is there a better way? # # NOTE since append cannot be in place, # it seems that the only alternative is pre-allocating # the destination array, # possibly truncating or extending it as needed # if backwards: waves = numpy.append(data, waves) else: waves = numpy.append(waves, data) else: self._log(["Fragment %d has zero duration", num]) # remove temporary file self._log(["Removing temporary file '%s'", tmp_destination]) os.close(handler) os.remove(tmp_destination) num += 1 if (quit_after is not None) and (current_time > quit_after): self._log(["Quitting after reached duration %.3f", current_time]) break # output WAV file, concatenation of synthesized fragments self._log(["Writing audio file '%s'", audio_file_path]) wavwrite(waves, audio_file_path, sample_frequency, encoding) # return the time anchors # TODO anchors do not make sense if backwards == True self._log(["Returning %d time anchors", len(anchors)]) self._log(["Current time %.3f", current_time]) self._log(["Synthesized %d characters", num_chars]) return (anchors, current_time, num_chars)
def synthesize(self, text_file, audio_file_path, quit_after=None, backwards=False): """ Synthesize the text contained in the given fragment list into a ``wav`` file. :param text_file: the text file to be synthesized :type text_file: :class:`aeneas.textfile.TextFile` :param audio_file_path: the path to the output audio file :type audio_file_path: string (path) :param quit_after: stop synthesizing as soon as reaching this many seconds :type quit_after: float :param backwards: synthesizing from the end of the text file :type backwards: bool """ # time anchors anchors = [] # initialize time current_time = 0.0 # waves is used to concatenate all the fragments WAV files waves = numpy.array([]) # espeak wrapper espeak = ESPEAKWrapper(logger=self.logger) if quit_after is not None: self._log(["Quit after reaching %.3f", quit_after]) if backwards: self._log("Synthesizing backwards") # for each fragment, synthesize it and concatenate it num = 0 num_chars = 0 fragments = text_file.fragments if backwards: fragments = fragments[::-1] for fragment in fragments: # synthesize and get the duration of the output file self._log(["Synthesizing fragment %d", num]) handler, tmp_destination = tempfile.mkstemp( suffix=".wav", dir=gf.custom_tmp_dir()) duration = espeak.synthesize(text=fragment.text, language=fragment.language, output_file_path=tmp_destination) # store for later output anchors.append([current_time, fragment.identifier, fragment.text]) # increase the character counter num_chars += fragment.characters # concatenate to buffer self._log(["Fragment %d starts at: %f", num, current_time]) if duration > 0: self._log(["Fragment %d duration: %f", num, duration]) current_time += duration data, sample_frequency, encoding = wavread(tmp_destination) # # TODO this might result in memory swapping # if we have a large number of fragments # is there a better way? # # NOTE since append cannot be in place, # it seems that the only alternative is pre-allocating # the destination array, # possibly truncating or extending it as needed # if backwards: waves = numpy.append(data, waves) else: waves = numpy.append(waves, data) else: self._log(["Fragment %d has zero duration", num]) # remove temporary file self._log(["Removing temporary file '%s'", tmp_destination]) os.close(handler) os.remove(tmp_destination) num += 1 if (quit_after is not None) and (current_time > quit_after): self._log( ["Quitting after reached duration %.3f", current_time]) break # output WAV file, concatenation of synthesized fragments self._log(["Writing audio file '%s'", audio_file_path]) wavwrite(waves, audio_file_path, sample_frequency, encoding) # return the time anchors # TODO anchors do not make sense if backwards == True self._log(["Returning %d time anchors", len(anchors)]) self._log(["Current time %.3f", current_time]) self._log(["Synthesized %d characters", num_chars]) return (anchors, current_time, num_chars)