From 0ec8149ead12060359d02e6b1cbf3a91fad19af8 Mon Sep 17 00:00:00 2001 From: Roman Bazalevsky Date: Thu, 22 Sep 2016 17:19:56 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0?= =?utf8?q?=D0=BD=D0=BE=20=D1=81=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?utf8?q?=D0=BD=D1=8B=D1=85=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20?= =?utf8?q?=D0=BD=D0=B0=20proc=5Fopen=20+=20mp3=20=D0=BA=D0=BE=D0=B4=D0=B8?= =?utf8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=20?= =?utf8?q?=D0=BB=D0=B5=D1=82=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- festival-php/festival_class_inc.php | 51 ++++++++++++++--------------- festival-php/index.php | 22 ++++--------- 2 files changed, 30 insertions(+), 43 deletions(-) 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'); ?> -- 2.34.1