From: Roman Bazalevsky <rvb@rvb.name>
Date: Thu, 22 Sep 2016 14:19:56 +0000 (+0300)
Subject: Переделано с временных файлов на proc_open + mp3 кодирование на лету.
X-Git-Url: https://git.rvb.name/php.git/commitdiff_plain/0ec8149ead12060359d02e6b1cbf3a91fad19af8?ds=inline;hp=9cf7b175a225631376944019ad302d078a3a495b

Переделано с временных файлов на proc_open + mp3 кодирование на лету.
---

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
diff --git a/festival-php/index.php b/festival-php/index.php
index bc26996..769b8ce 100644
--- a/festival-php/index.php
+++ b/festival-php/index.php
@@ -9,24 +9,14 @@ if ( !$text ) {
 
 include("festival_class_inc.php");
 $tts = new festival;
-$fullPath=$tts->text2Wav($text,$lang);
+$data=$tts->text2Wav($text,$lang);
 
-if ($fd = fopen ($fullPath, "r")) {
+if ($data) {
     $fsize = filesize($fullPath);
-    $path_parts = pathinfo($fullPath);
-    $ext = strtolower($path_parts["extension"]);
-    header("Content-type: application/octet-stream");
-    header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
-    header("Content-length: $fsize");
-    header("Cache-control: private"); //use this to open files directly
-    while(!feof($fd)) {
-        $buffer = fread($fd, 2048);
-        echo $buffer;
-    }
+    $path_parts = pathinfo();
+    $ext = 'mp3';
+    header("Content-type: audio/mpeg");
+    echo $data;
 }
-fclose ($fd);
-unlink($fullPath);
-
-// $tts->text2Speech('The authors email address is. p scott @ u w c dot a c dot zed ay');
 
 ?>