diff --git a/sonos.class.php b/sonos.class.php index 1959bc2..9b98374 100644 --- a/sonos.class.php +++ b/sonos.class.php @@ -377,11 +377,86 @@ protected function CutString($string,$intmax) return $strings; } + + + + /** + * Download TTS file from Google + * + */ + protected function GetTtsFileFromGoogle($file,$words,$lang) + { + // Google Translate API cannot handle strings > 100 characters + $words = $this->CutString($words,100); + + ini_set('user_agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0'); + $mp3 = ""; + for ($i = 0; $i < count($words); $i++) + $mp3[$i] = file_get_contents('http://translate.google.com/translate_tts?q='.$words[$i].'&tl='.$lang.'&client=Sonos'); + + file_put_contents($file, $mp3); + + return $file; + } + + + /** + * Download TTS file from Acapala + * Initial code from https://github.com/skmp/acapela-tts-zeroconf-proxy + */ + protected function GetTtsFileFromAcapela($file,$words,$lang) + { + // Acapela demo TTS API cannot handle strings > 300 characters + $words = substr($words, 0, 300); + + // Get PHP Session from cookies + $ch = curl_init('http://www.acapela-group.com/?lang=fr'); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_HEADER, 1); + $result = curl_exec($ch); + preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); + $cookies = array(); + foreach($matches[1] as $item) { + parse_str($item, $cookie); + $cookies = array_merge($cookies, $cookie); + } + //var_dump($cookies); + //echo $cookies['PHPSESSID']; + + // Get sound + $url = 'http://www.acapela-group.com/demo-tts/DemoHTML5Form_V2.php'; + $data = + array( + 'MySelectedVoice' => 'Manon', + 'MyTextForTTS' => urldecode($words), + 'agreeterms' => 'on', + 'SendToVaaS' =>''); + // use key 'http' even if you send the request to https://... + $options = array( + 'http' => array( + 'header' => "Cookie: PHPSESSID=".$cookies['PHPSESSID']."\r\n", + 'method' => 'POST', + 'content' => http_build_query($data), + ), + ); + $context = stream_context_create($options); + $result = file_get_contents($url, false, $context); + $hookp = "var myPhpVar = '"; + $temp = substr(strstr($result,$hookp),strlen($hookp)); + $rv = substr($temp,0,strpos($temp,"'")); + + file_put_contents($file, file_get_contents($rv)); + + return $file; + } + + + /** * Convert Words (text) to Speech (MP3) * */ - protected function TTSToMp3($words,$lang) + protected function TTSToMp3($words,$lang,$ttsengine) { // Directory $folder = "audio/".$lang; @@ -402,16 +477,14 @@ protected function TTSToMp3($words,$lang) // If the MP3 file exists, do not create a new request if (!file_exists($file)) - { - // Google Translate API cannot handle strings > 100 characters - $words = $this->CutString($words,100); - - ini_set('user_agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0'); - $mp3 = ""; - for ($i = 0; $i < count($words); $i++) - $mp3[$i] = file_get_contents('http://translate.google.com/translate_tts?q='.$words[$i].'&tl='.$lang); + { + if($ttsengine == 'google'){ + $file = $this->GetTtsFileFromGoogle($file,$words,$lang); + } + elseif($ttsengine == 'acapela'){ + $file = $this->GetTtsFileFromAcapela($file,$words,$lang); + } - file_put_contents($file, $mp3); } return $file; } @@ -447,7 +520,7 @@ public function SongNameTTS($directory,$volume=0,$unmute=0,$lang='fr') * @param int volume * @param string language */ - public function PlayTTS($message,$directory,$volume=0,$unmute=0,$lang='fr') + public function PlayTTS($message,$directory,$volume=0,$unmute=0,$lang='fr',$ttsengine='google') { $actual['track'] = $this->GetPositionInfo(); $actual['volume'] = $this->GetVolume(); @@ -460,7 +533,7 @@ public function PlayTTS($message,$directory,$volume=0,$unmute=0,$lang='fr') if ($volume != 0) $this->SetVolume($volume); - $file = 'x-file-cifs://'.$directory.'/'.$this->TTSToMp3($message,$lang); + $file = 'x-file-cifs://'.$directory.'/'.$this->TTSToMp3($message,$lang,$ttsengine); if (((stripos($actual['track']["TrackURI"],"x-file-cifs://")) !== false) or ((stripos($actual['track']["TrackURI"],".mp3")) !== false)) { diff --git a/sonos.tts.php b/sonos.tts.php index b680699..4e030ba 100644 --- a/sonos.tts.php +++ b/sonos.tts.php @@ -1,17 +1,22 @@ PlayTTS($message,$directory,$volume,$force_unmute); //Lecture du message -?> \ No newline at end of file +$message = $_GET['message']; // Message a diffuser + +// Instanciation de la classe +$sonos = new SonosPHPController($IP_sonos); +$sonos->PlayTTS($message,$directory,$volume,$force_unmute,$lang,$ttsengine); // Lecture du message +?>