X-Git-Url: https://git.rvb.name/php.git/blobdiff_plain/a79bfa56638c77c3d6bc7bcc2e0e80ad365dc9db..refs/heads/master:/festival-php/festival_class_inc.php?ds=sidebyside

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