Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 85 additions & 12 deletions sonos.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down Expand Up @@ -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();
Expand All @@ -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))
{
Expand Down
29 changes: 17 additions & 12 deletions sonos.tts.php
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
<?php
// Code from https://github.com/DjMomo/sonos
// Exemple de l'utilisation de la fonction Text-to-speech
require("sonos.class.php");
$IP_sonos_1 = "192.168.1.11"; // A adapter avec l'adresse IP du Sonos � contr�ler
$directory = "www/sonos"; // Indiquer ici le dossier partag� contenant les scrips PHP sonos (et qui contiendra le sous-dossier audio)
$directory = "192.168.99.105/sonos"; // Indiquer ici le dossier partage contenant les scrips PHP sonos (et qui contiendra le sous-dossier audio)
$ttsengine = 'acapela'; // Indiquer ici le moteur vocal a utiliser (google ou acapela)
$lang = 'fr';

$volume = 0;
$force_unmute = 0;

if (isset($_GET['force_unmute'])) $force_unmute = $_GET['force_unmute']; // Force la d�sactivation de la sourdine. Optionnel
$volume = 30; // De 0 a 100 %
$force_unmute = 1;

$IP_sonos = "192.168.100.74"; // A adapter avec l'adresse IP du Sonos a controler


if (isset($_GET['force_unmute'])) $force_unmute = $_GET['force_unmute']; // Force la desactivation de la sourdine. Optionnel
if (isset($_GET['volume'])) $volume = $_GET['volume']; // Niveau sonore. Optionnel.
$message = $_GET['message']; // Message diffuser
//Instanciation de la classe
$sonos_1 = new SonosPHPController($IP_sonos_1);
$sonos_1->PlayTTS($message,$directory,$volume,$force_unmute); //Lecture du message
?>
$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
?>