作者:老葛 亞艾元軟體
為客戶開發一個語音提醒的功能,在黨建o2o的指揮中心,如果有群衆訴求送出,此時就會在黨建O2O指揮中心的大屏上面,動态顯示提示消息,并且支援語音的形式,通過聲音提醒黨建O2O指揮中心的負責人。
對于實時提醒,我們采用nodejs伺服器,基于Drupal與nodejs的內建子產品,做定制開發,初步實作了實時提醒。對于語音提醒,我們初步選擇百度雲裡面的語音合成、識别接口。始終覺得,百度在AI方面,做的還是有特色的,特别是提出ALL in AI戰略。語音接口也是百度AI的一部分。
百度的語音接口,包含兩部分,語音合成、語音識别。語音合成就是将文本轉成語音檔案;語音識别就是将語音檔案轉成文本,他們使用一個SDK。我們的語言采用的PHP,兩個接口合二為一。
百度語音文檔位址:https://cloud.baidu.com/doc/SPEECH/index.html
百度語音SDK下載下傳位址:https://ai.baidu.com/sdk
在百度背景,添加語音應用。我的賬号已經認證,可以友善的添加,這個接口,初級階段是免費的。是以也不用交錢。在管理界面的左邊部分,有幫助文檔,SDK下載下傳的連結,很友善。我以前給百度工單裡面提意見,說的就是幫助文檔,下載下傳位址,放到對應的接口的管理界面裡面,開發的時候,好找。
将下載下傳的PHP SDK放到自己的子產品目錄下面,這是我封裝好的一段代碼。
function mycustom_get_audio_file($text, $filename) {
require_once 'AipSpeech.php';
// 你的APPID AK SK
$app_id = '10xxxxxx';
$app_key = 'so81xxxxxxxxxxx';
$secret_key = 'WoDXxxxxxxxxxxxxxxx';
$client = new AipSpeech($app_id, $app_key, $secret_key);
$result = $client->synthesis($text, 'zh', 1, array(
'vol' => 5,
));
drupal_set_message('abc');
if(!is_array($result)){
drupal_set_message('123');
//file_put_contents('audio.mp3', $result);
$dir_uri = file_stream_wrapper_get_instance_by_uri('public://');
$realpath = $dir_uri->realpath();
$sudio_dir = 'public://baiduaudio';
$return = file_prepare_directory($sudio_dir);
if (empty($return)) {
drupal_mkdir('public://baiduaudio', 0777, TRUE);
}
$file_path = $realpath . "/baiduaudio/". $filename;
drupal_set_message('filepath:' . $file_path);
file_put_contents($file_path, $result);
$file_url = file_create_url('public://baiduaudio/' .$filename);
return $file_url;
}
return '';
}
這個封裝的函數,能夠實作給一段文本,調用百度AI的語音接口,生成MP3檔案,儲存到本地,将檔案路徑傳回給調用者。
我測試了一下,就這樣,就能用了,非常簡單。百度雲最大的進步就是直接提供了PHP版本的SDK,以前他們家的産品,都是隻提供java和C和nodejs的,對于PHP開發者來說,有時候需要自己基于他們的rest API從頭寫,痛苦。
在訴求狀态發生變化的時候,使用nodejs,實時通知,這是伺服器端的代碼:
$message->data['description'] = '嘀嘀嘀,嘀嘀嘀,' . $sub_wechat .'剛剛受理一條' . $service_type .',請及時辦結';
$text = $message->data['description'];
$filename = 'shouli_' .$node->nid .'.pm3';
$return = mycustom_get_audio_file($text,$filename);
$message->data['audio_url'] = $return;
$message->callback = 'nodejsMycustom';
nodejs_send_content_channel_message($message);
前端代碼js:
Drupal.Nodejs.callbacks.nodejsMycustom = {
callback: function (message) {
console.log(message);
var audio_url = message.data.audio_url || '';
if(audio_url != '') {
var audio = document.createElement("audio");
audio.src = audio_url;
audio.play();
console.log(audio.src);
}
這段js代碼,在前段,接收nodejs的實時通知消息,如果消息裡面,包含了audio_url,此時建立一個audio元素,調用它的播放功能。
這樣就實作了客戶要求的語音提醒功能了。