def _synthesize_single_c_extension(self, text, voice_code, output_file_path): """ Synthesize a single text fragment, using the cew extension. Return the duration of the synthesized text, in seconds. :rtype: (bool, (:class:`~aeneas.timevalue.TimeValue`, )) """ self.log(u"Synthesizing using C extension...") end = None if self.rconf[RuntimeConfiguration.CEW_SUBPROCESS_ENABLED]: self.log(u"Using cewsubprocess to call aeneas.cew") try: self.log(u"Importing aeneas.cewsubprocess...") from aeneas.cewsubprocess import CEWSubprocess self.log(u"Importing aeneas.cewsubprocess... done") self.log(u"Calling aeneas.cewsubprocess...") cewsub = CEWSubprocess(rconf=self.rconf, logger=self.logger) end = cewsub.synthesize_single(output_file_path, voice_code, text) self.log(u"Calling aeneas.cewsubprocess... done") except Exception as exc: self.log_exc(u"An unexpected error occurred while running cewsubprocess", exc, False, None) # NOTE not critical, try calling aeneas.cew directly #return (False, None) if end is None: self.log(u"Preparing c_text...") if gf.PY2: # Python 2 => pass byte strings c_text = gf.safe_bytes(text) else: # Python 3 => pass Unicode strings c_text = gf.safe_unicode(text) self.log(u"Preparing c_text... done") self.log(u"Calling aeneas.cew directly") try: self.log(u"Importing aeneas.cew...") import aeneas.cew.cew self.log(u"Importing aeneas.cew... done") self.log(u"Calling aeneas.cew...") sr, begin, end = aeneas.cew.cew.synthesize_single( output_file_path, voice_code, c_text ) end = TimeValue(end) self.log(u"Calling aeneas.cew... done") except Exception as exc: self.log_exc(u"An unexpected error occurred while running cew", exc, False, None) return (False, None) self.log(u"Synthesizing using C extension... done") return (True, (end, ))
def _synthesize_multiple_c_extension(self, text_file, output_file_path, quit_after=None, backwards=False): """ Synthesize multiple text fragments, using the cew extension. Return a tuple (anchors, total_time, num_chars). :rtype: (bool, (list, :class:`~aeneas.timevalue.TimeValue`, int)) """ self.log(u"Synthesizing using C extension...") # convert parameters from Python values to C values try: c_quit_after = float(quit_after) except TypeError: c_quit_after = 0.0 c_backwards = 0 if backwards: c_backwards = 1 self.log([u"output_file_path: %s", output_file_path]) self.log([u"c_quit_after: %.3f", c_quit_after]) self.log([u"c_backwards: %d", c_backwards]) self.log(u"Preparing u_text...") u_text = [] fragments = text_file.fragments for fragment in fragments: f_lang = fragment.language f_text = fragment.filtered_text if f_lang is None: f_lang = self.DEFAULT_LANGUAGE f_voice_code = self._language_to_voice_code(f_lang) if f_text is None: f_text = u"" u_text.append((f_voice_code, f_text)) self.log(u"Preparing u_text... done") # call C extension sr = None sf = None intervals = None if self.rconf[RuntimeConfiguration.CEW_SUBPROCESS_ENABLED]: self.log(u"Using cewsubprocess to call aeneas.cew") try: self.log(u"Importing aeneas.cewsubprocess...") from aeneas.cewsubprocess import CEWSubprocess self.log(u"Importing aeneas.cewsubprocess... done") self.log(u"Calling aeneas.cewsubprocess...") cewsub = CEWSubprocess(rconf=self.rconf, logger=self.logger) sr, sf, intervals = cewsub.synthesize_multiple(output_file_path, c_quit_after, c_backwards, u_text) self.log(u"Calling aeneas.cewsubprocess... done") except Exception as exc: self.log_exc(u"An unexpected error occurred while running cewsubprocess", exc, False, None) # NOTE not critical, try calling aeneas.cew directly #return (False, None) if sr is None: self.log(u"Preparing c_text...") if gf.PY2: # Python 2 => pass byte strings c_text = [(gf.safe_bytes(t[0]), gf.safe_bytes(t[1])) for t in u_text] else: # Python 3 => pass Unicode strings c_text = [(gf.safe_unicode(t[0]), gf.safe_unicode(t[1])) for t in u_text] self.log(u"Preparing c_text... done") self.log(u"Calling aeneas.cew directly") try: self.log(u"Importing aeneas.cew...") import aeneas.cew.cew self.log(u"Importing aeneas.cew... done") self.log(u"Calling aeneas.cew...") sr, sf, intervals = aeneas.cew.cew.synthesize_multiple( output_file_path, c_quit_after, c_backwards, c_text ) self.log(u"Calling aeneas.cew... done") except Exception as exc: self.log_exc(u"An unexpected error occurred while running cew", exc, False, None) return (False, None) self.log([u"sr: %d", sr]) self.log([u"sf: %d", sf]) # create output anchors = [] current_time = TimeValue("0.000") num_chars = 0 if backwards: fragments = fragments[::-1] for i in range(sf): # get the correct fragment fragment = fragments[i] # store for later output anchors.append([ TimeValue(intervals[i][0]), fragment.identifier, fragment.filtered_text ]) # increase the character counter num_chars += fragment.characters # update current_time current_time = TimeValue(intervals[i][1]) # return output # NOTE anchors do not make sense if backwards == True self.log([u"Returning %d time anchors", len(anchors)]) self.log([u"Current time %.3f", current_time]) self.log([u"Synthesized %d characters", num_chars]) self.log(u"Synthesizing using C extension... done") return (True, (anchors, current_time, num_chars))