百度TTS 语音合成

 //百度文件转换成语音
private function toSpeech($text)
{
define('DEMO_CURL_VERBOSE', false);
$obj=["status"=>0,"msg"=>"","file_name"=>""];
//获取秘钥
$apiKey = Config::get('apiKey');
$secretKey = Config::get('secretKey');
$cuid = Config::get('cuid'); //发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声
$per = 0;
//语速,取值0-15,默认为5中语速
$spd = 5;
//音调,取值0-15,默认为5中语调
$pit = 5;
//音量,取值0-9,默认为5中音量
$vol = 5;
// 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav
$aue = 3;
$formats = array(3 => 'mp3', 4 => 'pcm', 5 => 'pcm', 6 => 'wav');
$format = $formats[$aue]; /** 公共模块获取token开始 */
$auth_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=" . $apiKey . "&client_secret=" . $secretKey;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $auth_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //信任任何证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 检查证书中是否设置域名,0不验证
curl_setopt($ch, CURLOPT_VERBOSE, DEMO_CURL_VERBOSE);
$res = curl_exec($ch);
if (curl_errno($ch)) {
$obj["msg"] = curl_error($ch);
return $obj;
}
curl_close($ch);
$response = json_decode($res, true); if (!isset($response['access_token'])) {
$obj["msg"]="ERROR TO OBTAIN TOKEN";
return $obj;
}
if (!isset($response['scope'])) {
$obj["msg"]="ERROR TO OBTAIN scopes";
return $obj;
}
if (!in_array('audio_tts_post', explode(" ", $response['scope']))) {
// 请至网页上应用内开通语音合成权限
$obj["msg"]="DO NOT have tts permission";
return $obj;
}
$token = $response['access_token'];
/** 公共模块获取token结束 */ /** 拼接参数开始 **/
// tex=$text&lan=zh&ctp=1&cuid=$cuid&tok=$token&per=$per&spd=$spd&pit=$pit&vol=$vol
$params = array(
'tex' => urlencode($text), // 为避免+等特殊字符没有编码,此处需要2次urlencode。
'per' => $per,
'spd' => $spd,
'pit' => $pit,
'vol' => $vol,
'aue' => $aue,
'cuid' => $cuid,
'tok' => $token,
'lan' => 'zh', //固定参数
'ctp' => 1, // 固定参数
);
$paramsStr = http_build_query($params);
$url = 'http://tsn.baidu.com/text2audio';
/** 拼接参数结束 **/ $g_has_error = false;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $paramsStr);
$data = curl_exec($ch);
$res = curl_getinfo($ch);
// 正常返回:audio/* 错误返回类型为:application/json 则转换失败
if ($res['content_type'] == 'application/json') {
$g_has_error = true;
$obj["msg"]=json_decode($data);
return $obj;
}
if (curl_errno($ch)) {
$obj["msg"]=curl_error($ch);
return $obj;
}
curl_close($ch);
//拼接文件名字
if (!$g_has_error) {
$path = "uploads/voices/". strtotime(date("Y-m-dH:i:s")). "_" . rand(100000, 999999) .".".$format;
file_put_contents($path, $data);
$obj["status"]=1;
$obj["msg"]="操作成功!";
$obj["file_name"]=$path;
}else{
$obj["msg"]="操作失败!";
}
return $obj;
}

读取音频文件时长

需要使用第三方库:getID3-master,需要使用引用两个文件夹:getid3,helperapps

private function voiceTime($img){
//包含文件
$path =__DIR__.'/../libs/getid3/getid3.php';
$fileName =realpath($path);
if (!file_exists($fileName) || !include_once($fileName)) {
return 0;
}
include_once($fileName); try{
$mp3_path=__DIR__.'/../../../public/'.$img;
$getID3 = new \getID3(); //实例化类
$ThisFileInfo = $getID3->analyze($mp3_path); //分析文件,$path为音频文件的地址
$fileDuration=$ThisFileInfo['playtime_seconds']; //这个获得的便是音频文件的时长
$time = (int)ceil($fileDuration);
return $time;
}catch (Exception $e){
return 0;
}
}

PHP调用语音合成接口的更多相关文章

  1. Unicode浅析——调用科大讯飞语音合成接口(日语)所遇到的天坑

    如题,最近做的项目需要调用科大讯飞的语音合成接口,将日文合成日语.然后坑爹的是跟我对接的那一方直接扔过来一份接口文档,里面并未提及日语合成所需要的参数.中文.英文合成倒是没问题,就这个日语合成的音频始 ...

  2. Python实战---制作专属有声小说(调用百度语音合成接口)

    这一次的目标是使用百度云的人工智能接口,实现文字转语音的实时转换,将小说文字转换成语音朗读出来. 百度云接口调用 百度的这个接口对于我们普通用户非常友好,他的很多功能都是免费的,而且我们每天可以免费调 ...

  3. WebApi接口 - 如何在应用中调用webapi接口

    很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ...

  4. C#动态调用WCF接口,两种方式任你选。

    写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...

  5. python调用zabbix接口实现Action配置

    要写这篇博客其实我的内心是纠结的,老实说,我对zabbix的了解实在不多.但新公司的需求不容置疑,当我顶着有两个头大的脑袋懵懵转入运维领域时,面前摆着两百多组.上千台机器等着写入zabbix监控的需求 ...

  6. HttpClient Get/Post方式调用Http接口

    本节摘要:本节主要分别介绍如何用get方式.post方式向http接口发送数据. preparation 1. 项目环境如下: myeclipse6.5 .tomcat5.0.system:xp.JD ...

  7. Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php )

    Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php ) 1.1. 这些流氓软件使用操作系统os提供的普通api根本就杀不掉啊1 1.2. 使用 ...

  8. Java调用webservice接口方法

                             java调用webservice接口   webservice的 发布一般都是使用WSDL(web service descriptive langu ...

  9. php中创建和调用webservice接口示例

    php中创建和调用webservice接口示例   这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservi ...

随机推荐

  1. 一款有意思的 Qt 飞行仪表控件

    最近在网上偶然发现一款Qt飞行仪表板控件,真的很酷哦! 是一款开源软件, 直接编译运行:  美工还是不错的! 控件操作非常简单: void MainWindow::timerEvent( QTimer ...

  2. 函数模板“偏特化” (C++)

         模板是C++中很重要的一个特性,利用模板可以编写出类型无关的通用代码,极大的减少了代码量,提升工作效率.C++中包含类模板.函数模板,对于需要特殊处理的类型,可以通过特化的方式来实现特定类型 ...

  3. jquery 源码学习(二)

    在网上找到一篇广为流传的文章<常用正则表达式>,逐一分析,不足地方进行补充和纠正   作者:nuysoft/JS攻城师/高云 QQ:47214707 EMail:nuysoft@gmail ...

  4. hx计算机基础

    参考:http://python.jobbole.com/82294/ https://www.jianshu.com/p/aed6067eeac9 1. 操作系统基础题 1)在32位操作系统下,系统 ...

  5. 狄拉克函数(Dirac delta function)

    1. 定义 δ(x)={∞0if x=0if x≠0 这样定义的目的在于使如下的积分式成立: ∫∞−∞δ(x)dx=1 2. 重要性质 sifting property ∫∞−∞f(x)δ(x−μ)d ...

  6. Boost智能指针-基础知识

    简单介绍 内存管理一直是 C++ 一个比較繁琐的问题,而智能指针却能够非常好的解决问题,在初始化时就已经预定了删除.排解了后顾之忧.1998年修订的第一版C++标准仅仅提供了一种智能指针:std::a ...

  7. Folly: Facebook Open-source Library Readme.md 和 Overview.md(感觉包含的东西并不多,还是Boost更有用)

    folly/ For a high level overview see the README Components Below is a list of (some) Folly component ...

  8. 2-18-搭建mysql集群实现高可用

          1 环境清理以及安装 1.1  mysql旧版本清除 准备5台虚拟机,分配如下 mysql管理结点:xuegod1.cn IP:192.168.10.31  (安装server.clien ...

  9. MVC 添加数据的三种方法

    1 通过Request接收数据,进行添加 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<d ...

  10. 利用WIX制作安装包(3)

    原文 利用WIX制作安装包(3) 利用WIX安装服务非常简单.只需要短短几句话就可以.当我们创建好一个Windows服务之后.我们在项目中创建一个Service.wxs 文件来安装服务,并且编辑代码如 ...