PHP调用语音合成接口
百度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调用语音合成接口的更多相关文章
- Unicode浅析——调用科大讯飞语音合成接口(日语)所遇到的天坑
如题,最近做的项目需要调用科大讯飞的语音合成接口,将日文合成日语.然后坑爹的是跟我对接的那一方直接扔过来一份接口文档,里面并未提及日语合成所需要的参数.中文.英文合成倒是没问题,就这个日语合成的音频始 ...
- Python实战---制作专属有声小说(调用百度语音合成接口)
这一次的目标是使用百度云的人工智能接口,实现文字转语音的实时转换,将小说文字转换成语音朗读出来. 百度云接口调用 百度的这个接口对于我们普通用户非常友好,他的很多功能都是免费的,而且我们每天可以免费调 ...
- WebApi接口 - 如何在应用中调用webapi接口
很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ...
- C#动态调用WCF接口,两种方式任你选。
写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...
- python调用zabbix接口实现Action配置
要写这篇博客其实我的内心是纠结的,老实说,我对zabbix的了解实在不多.但新公司的需求不容置疑,当我顶着有两个头大的脑袋懵懵转入运维领域时,面前摆着两百多组.上千台机器等着写入zabbix监控的需求 ...
- HttpClient Get/Post方式调用Http接口
本节摘要:本节主要分别介绍如何用get方式.post方式向http接口发送数据. preparation 1. 项目环境如下: myeclipse6.5 .tomcat5.0.system:xp.JD ...
- Atitit 通过调用gui接口杀掉360杀毒 360卫士 qq保镖等难以结束的进程(javac# php )
Atitit 通过调用gui接口杀掉360杀毒 360卫士 qq保镖等难以结束的进程(javac# php ) 1.1. 这些流氓软件使用操作系统os提供的普通api根本就杀不掉啊1 1.2. 使用 ...
- Java调用webservice接口方法
java调用webservice接口 webservice的 发布一般都是使用WSDL(web service descriptive langu ...
- php中创建和调用webservice接口示例
php中创建和调用webservice接口示例 这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservi ...
随机推荐
- 深入理解ArrayList与LinkedList的区别
一.先来看看ArrayList与LinkedList 在JDK中所在的位置 从图中可以看出,ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只 ...
- [!!**!F6782A84A3BECEAADDB11DAC0C4E6346AC07E5344100738DAF4C6DA639D9081F!!**!]
testt 版权声明:本文博主原创文章,博客,未经同意不得转载.
- (让你提前知道软件开发33):数据操纵语言(DML)
文章2部分 数据库SQL语言 数据操纵语言(DML) 数据操纵语言(Data Manipulation Language,DML)包含insert.delete和update语句,用于增.删.改数据. ...
- 1 DDD理论学习1 通用语言
通用语言就是将事情描述清楚的语言 达到DDD的目标代码即设计,设计即代码.通俗的讲,也就是开发人员写的代码领域专家也能看懂. ddd模式跟传统模式的一个区别在于 传统先创建数据库表 再根据表创建类.而 ...
- Efficient store queue architecture
One embodiment of the present invention provides a store queue that applies the stores to a memory s ...
- C# WPF 调用FFMPEG实现“SORRY 为所欲为/王境泽”表情包GIF生成软件
C# WPF 调用FFMPEG实现“SORRY 为所欲为/王境泽”表情包GIF生成 1,调用ffmpeg将外挂字幕“嵌入”视频中,保存副本: 2,调用ffmpeg将副本视频导出为gif图片. 参考资料 ...
- WPF 3D模型的一个扩展方法
原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...
- 常见的选择<数据源协议,委托协议>(IOS发展)
-常见的选择必须满足这两个协议,约定实施.一个为数据源协议 -托付协议负责控制控件UI.事件响应, 实现可选 -数据源协议负责控件与应用数据模型的桥梁,一般必须实现 @interface ViewCo ...
- bigdata_mac下安装spark_scala
Java 下载安装Mac对应版本的JDK. Apache-spark $ brew update $ brew info apache-spark $ brew install apache-spar ...
- 【码云周刊第 22 期】GO :互联网时代的 C 语言!
技术干货 标签:独家译文 1.Go 很好,为什么我们不使用它? 在这篇文章中,我将分享一下为什么我认为它很棒,使用它的一些缺点,以及为什么它还不是我们 Zapier 堆栈中的一部分. 2.从 Scal ...