You are here

Drupal 与百度云语音合成(PHP SDK)的集成

作者:老葛 亚艾元软件

为客户开发一个语音提醒的功能,在党建o2o的指挥中心,如果有群众诉求提交,此时就会在党建O2O指挥中心的大屏上面,动态显示提示消息,并且支持语音的形式,通过声音提醒党建O2O指挥中心的负责人。

 

   对于实时提醒,我们采用nodejs服务器,基于Drupalnodejs的集成模块,做定制开发,初步实现了实时提醒。对于语音提醒,我们初步选择百度云里面的语音合成、识别接口。始终觉得,百度在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元素,调用它的播放功能。

这样就实现了客户要求的语音提醒功能了。

 


Drupal版本: