From: Roman Bazalevsky 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?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'); ?>