Переделано с временных файлов на proc_open + mp3 кодирование на лету.
[php.git] / festival-php / festival_class_inc.php
index 2e48b3187c8e0110f3ed68bf73b512bc0c103d71..bd960a1d4d1cfc1123b9996e7e424fb6faea2197 100644 (file)
@@ -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