错6笔记

 找回密码
 立即注册
查看: 768|回复: 6

百度API语音合成教程【全过程】

[复制链接]

182

主题

238

帖子

1111

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1111
发表于 2019-5-18 19:10:51 | 显示全部楼层 |阅读模式

亲,您还没有注册哦,错6笔记愿与你结交好友,享用更多功能,让你轻松玩转社区,快来注册吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
第一步,没什么好说的,创建吧。
360截图176106149497111.png
第二步,然后看见一个例子,把代码复制到自己的PHP中。
[PHP] 纯文本查看 复制代码
<?php
define('DEMO_CURL_VERBOSE', false);
# 填写网页上申请的appkey 如 $apiKey="g8eBUMSokVB1BHGmgxxxxxx"
$apiKey = "4E1BG9lTnlSeIf1NQFlrSq6h";
# 填写网页上申请的APP SECRET 如 $secretKey="94dc99566550d87f8fa8ece112xxxxx"
$secretKey = "544ca4657ba8002e3dea3ac2f5fdd241";
# text 的内容为"欢迎使用百度语音合成"的urlencode,utf-8 编码
# 可以百度搜索"urlencode" 
$text = "覃天卫强调,各级关工委要深刻领会习近平新时代中国特色社会主义思想和党的十九大精神,打牢新时代关心下一代的思想理论根基,立足新时代坐标思考谋划工作,聚焦新时代任务把准工作方向,根据新时代要求明确建设方向。要坚持以新思想为统领,奋力开创新时代全市关心下一代工作的工作局面,着眼于习近平新时代中国特色社会主义思想这一主线和灵魂,将其贯彻到新时代关心下一代工作全过程;着眼于党对青年一代的殷切期望,进一步激发广大“五老”投身关心下一代事业的积极性和热情;着眼于对我国社会主要矛盾做出的新判断,进一步提高服务青少年的质量和水平;着眼于两个一百奋斗目标的总要求,进一步凝聚起培养合格建设者和可靠接班人的“正能量”。要切实加强关工委建设,不断提高做好关心下一代工作的专业化水平,坚持以深入有效的调查研究推动工作创新发展,不断提升基层组织建设的质量和水平,不断提高工作队伍的素质和能力,为加快实现“两个建成”、谱写新时代玉林发展新篇章再立新功、再创佳绩。";
$text2 = iconv("UTF-8", "GBK", $text);
echo "text length :" . mb_strlen($text2, "GBK") . "\n";
#发音人选择, 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];
$cuid = "123456PHP";
/** 公共模块获取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))
{
    print curl_error($ch);
}
curl_close($ch);
echo "Token URL response is " . $res . "\n";
$response = json_decode($res, true);
if (!isset($response['access_token'])){
        echo "ERROR TO OBTAIN TOKEN\n";
        exit(1);
}
if (!isset($response['scope'])){
        echo "ERROR TO OBTAIN scopes\n";
        exit(2);
}
if (!in_array('audio_tts_post',explode(" ", $response['scope']))){
        echo "DO NOT have tts permission\n";
        // 请至网页上应用内开通语音合成权限
        exit(3);
}
$token = $response['access_token'];
echo "token = $token ; expireInSeconds: ${response['expires_in']}\n\n";
/** 公共模块获取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';
$urltest = $url . '?' . $paramsStr;
echo $urltest . "\n"; // 反馈请带上此url
/** 拼接参数结束 **/
$g_has_error = true;
$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);
function read_header($ch, $header){
        global $g_has_error;
        
        $comps = explode(":", $header);
        // 正常返回的头部 Content-Type: audio/*
        // 有错误的如 Content-Type: application/json
        if (count($comps) >= 2){
                if (strcasecmp(trim($comps[0]), "Content-Type") == 0){
                        if (strpos($comps[1], "audio/") > 0 ){
                                $g_has_error = false;
                        }else{
                                echo $header ." , has error \n";
                        }
                }
        }
        return strlen($header);
}
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');
$data = curl_exec($ch);
if(curl_errno($ch))
{
    echo curl_error($ch);
        exit(2);
}
curl_close($ch);
$file = $g_has_error ? "result.txt" : "result." . $format;
file_put_contents($file, $data);
echo "\n$file saved successed, please open it \n";

第三步,把自己创建的KEY 对应着位置复制进去。然后访问一下。我这里查看源代码。结果是这样的,有点懵逼。
360截图18750809304457.png
第四步,自己看了看文档,也没有什么好办法,那好吧,我试试,于是把http://tsn.baidu.com/text2audio?tex=%25E8%25A6%2583%25E5%25A4%25A9%25E5%258D%25AB%25E5%25BC%25BA%25E8%25B0%2583%25EF%25BC%258C%25E5%2590%2584%25E7%25BA%25A7%25E5%2585%25B3%25E5%25B7%25A5%25E5%25A7%2594%25E8%25A6%2581%25E6%25B7%25B1%25E5%2588%25BB%25E9%25A2%2586%25E4%25BC%259A%25E4%25B9%25A0%25E8%25BF%2591%25E5%25B9%25B3%25E6%2596%25B0%25E6%2597%25B6%.........
这堆东西复制到浏览器里打开试试。结果是这样的。突然感觉自己秒懂!
360截图18430710594473.png
回复

使用道具 举报

182

主题

238

帖子

1111

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1111
 楼主| 发表于 2019-5-20 21:30:43 | 显示全部楼层
第五步,想想,怎么能把这个播放器,放到一张网页中呢?
最好还是带选项的.像下面的官方例子,
360截图16700618108151102.png
查看了一下人家的源码,复制下来.看一下效果. 先不管能不能行,把人家的框架先拿过来,也省得自己做.
360截图16490121104113141.png
回复

使用道具 举报

182

主题

238

帖子

1111

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1111
 楼主| 发表于 2019-5-21 20:13:02 | 显示全部楼层
第五步,想想,怎么能把这个播放器,放到一张网页中呢?
最好还是带选项的.像下面的官方例子,

查看了一下人家的源码,复制下来.看一下效果. 先不管能不能行,把人家的框架先拿过来,也省得自己做.

然后,再去网页中,把头文件复制出来.粘帖到自己的网页中.这样效果就一样了,但是所有地方,都不可以点击.看来还要找一找脚本文件,

试了很多方法,感觉拿来主义,不可以行,
看来还是老老实实的,提交表单吧。下面的代码可以做成一个输入框和一个提交按钮。
[HTML] 纯文本查看 复制代码
<form action="index.php" method="get">
  请输入您想合成的语音文字: <input type="text" name="fname" /><br />
  <input type="submit" value="成生语音" />
</form>

运行后,效果就是这样的。
360截图187705295873112.png

因为form action="index.php"是本页面,所以要做一个判断,就是当内容为空时,不要去运行PHP里的内容。
[PHP] 纯文本查看 复制代码
if($text==""){
    return;
}

回复

使用道具 举报

182

主题

238

帖子

1111

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1111
 楼主| 发表于 2019-5-24 12:33:58 | 显示全部楼层
还有4个人物发音。可以这样的用单选框的方式表现出来。
[HTML] 纯文本查看 复制代码
<label><input name="shengyin" type="radio" value="0" checked />普通女声 </label> 
<label><input name="shengyin" type="radio" value="1" />普通男生 </label> 
<label><input name="shengyin" type="radio" value="2" />情感合成-度逍遥 </label> 
<label><input name="shengyin" type="radio" value="3" />情感合成-度丫丫 </label> 


其中,checked表示当前选中值。

然后再把提交做一个优化,意义是什么呢?用户当输入完信息后,如果不满意要修改,发现上次输入的没有保存!这样的设置,用户会疯掉的,下面用一个提交变量来这个小问题解决掉。下面代码的意思就是把提交的数据再返回给自己做默认值显示。
[PHP] 纯文本查看 复制代码
请输入您想合成的语音文字: <input type="text" name="fname" value='<?php echo $_GET['fname'];?>'/><br />


回复

使用道具 举报

182

主题

238

帖子

1111

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1111
 楼主| 发表于 2019-5-24 13:05:02 | 显示全部楼层
最后再创建一个播放器,就简单的完成了。
[HTML] 纯文本查看 复制代码
<video controls="" autoplay="" name="media"><source src="<?php echo $urltest;?>" type="audio/mp3"></video>


其实有多处细节需要修改。
其中$urltest是合成后MP3的网址

回复

使用道具 举报

182

主题

238

帖子

1111

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1111
 楼主| 发表于 2019-5-24 13:19:04 | 显示全部楼层
第六步,修改细节,人声保留上次的位置。JAVA现在还不行,所以笨笨的方法,代码
[PHP] 纯文本查看 复制代码
<?php 
if($_GET['shengyin']==''){
echo  "发音人选择<br />"; 
echo "<label><input name='shengyin' type='radio' value='0' checked />普通女声 </label>" ;
echo "<label><input name='shengyin' type='radio' value='1' />普通男生 </label>";
echo "<label><input name='shengyin' type='radio' value='3' />情感合成-度丫丫 </label> ";
}
if($_GET['shengyin']=='0'){
echo  "发音人选择<br />"; 
echo "<label><input name='shengyin' type='radio' value='0' checked />普通女声 </label>" ;
echo "<label><input name='shengyin' type='radio' value='1' />普通男生 </label>";
echo "<label><input name='shengyin' type='radio' value='3' />情感合成-度丫丫 </label> ";
}
if($_GET['shengyin']=='1'){
echo  "发音人选择<br />"; 
echo "<label><input name='shengyin' type='radio' value='0'  />普通女声 </label>" ;
echo "<label><input name='shengyin' type='radio' value='1'checked />普通男生 </label>";
echo "<label><input name='shengyin' type='radio' value='3' />情感合成-度丫丫 </label> ";
}
if($_GET['shengyin']=='3'){
echo  "发音人选择<br />"; 
echo "<label><input name='shengyin' type='radio' value='0'  />普通女声 </label>" ;
echo "<label><input name='shengyin' type='radio' value='1' />普通男生 </label>";
echo "<label><input name='shengyin' type='radio' value='3'checked />情感合成-度丫丫 </label> ";
}


?>
走起!!!
演示地址:http://link1.51vip.biz:10085/tts/index.php


回复

使用道具 举报

182

主题

238

帖子

1111

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1111
 楼主| 发表于 2019-5-24 15:03:57 | 显示全部楼层
由于input标签 type=text不支持多行,所以后来做优化时,用textarea标签替换了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|错6笔记 ( 辽ICP备18006810号 )

GMT+8, 2024-4-25 09:43 , Processed in 0.114777 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表