X-Git-Url: https://git.rvb.name/php.git/blobdiff_plain/a79bfa56638c77c3d6bc7bcc2e0e80ad365dc9db..refs/heads/master:/festival-php/festival_class_inc.php diff --git a/festival-php/festival_class_inc.php b/festival-php/festival_class_inc.php index 2e48b31..bd960a1 100644 --- a/festival-php/festival_class_inc.php +++ b/festival-php/festival_class_inc.php @@ -12,46 +12,43 @@ class festival /** * Method to wrap API calls to the festival tts engine * This function will create an utterance and output it to $outputfile. '.wav'; - * @author Paul Scott (base design) + Roman Bazalevskiy (adaptation for multilingual+server environment) + * @author Paul Scott (base design) + Roman Bazalevskiy (adaptation for multilingual+server environment+no temp files!) * @param $string * @return waveform */ function text2Wav($string,$lang = "ru") { - //create a random number filename so that simultaneous users don't overwrite each other - $tempfilename = tempnam('/tmp','fest-'); - $filename = $tempfilename . '.txt'; - $outputfile = $tempfilename . '.wav'; - - if (!$handle = fopen($filename, "w")) - { - //we cannot open the file handle! - return false; - } - // Write $string to our opened file. - if (fwrite($handle, $string) === FALSE) - { - //couldn't write the file...Check permissions - return false; - } - //close the file handle - we are done with it - fclose($handle); $prolog="/etc/festival/$lang.scm"; if (!file_exists($prolog)) { $prolog="/etc/festival/default.scm"; } - //initialise and execute the festival C engine //make sure that your environment is set to find the festival binaries! - $cmd = "festival_client --prolog $prolog --ttw $filename --output $outputfile"; + $cmd = "festival_client --prolog $prolog --ttw | lame -f - -"; //execute the command - exec($cmd); - - //delete the text file (Temp) - unlink($filename); - //finally return the uptput file path and filename - return $outputfile; + $descriptorspec = array( + 0 => array("pipe", "r"), // stdin is a pipe that the child will read from + 1 => array("pipe", "w"), // stdout is a pipe that the child will write to + 2 => array("pipe", "w") // stderr is a file to write to + ); + $cwd = '/tmp'; + $env = array(); + $process = proc_open($cmd, $descriptorspec, $pipes, $cwd, $env); + if (is_resource($process)) { + fwrite($pipes[0],$string); + fclose($pipes[0]); + $data = stream_get_contents($pipes[1]); + fclose($pipes[1]); + fclose($pipes[2]); + $proc_result = proc_close($process); + } + + if (!$proc_result) { + return $data; + } else { + return ''; + } } }//end class