Google Translate API文本到语音 - 设置非罗马字符的编码

时间:2015-06-20 02:40:09

标签: php encoding utf-8 google-translate

我正在使用Google Translate的非官方文字转语音API(我已在其上发布了更多信息here)。

API端点如下所示:https://translate.google.com/translate_tts?ie=utf-8&tl=en&q=Hello%20World

对单词进行传统的API请求,我得到No-access-control-origin和404块。为了解决这个问题,我跟着the php script in this blog在提出请求之前删除了引荐来源(有关我的尝试的更多信息here)。

我能够让英语上班,但我需要这个才能为中国人服务。不幸的是,当我传递像你这样的东西时,声音似乎在叙述胡言乱语。但是,如果您将其直接添加到浏览器中,则会完美地叙述。

https://translate.google.com/translate_tts?ie=utf-8&tl=zh-CN&q=你好

HTML

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="content-type" content="text/html; charset=utf-8" />

<audio controls="controls" autoplay="autoplay" style="display:none;">
    <source src="testPHP.php?translate_tts?ie=utf-8&tl=zh-CN&q=你好" type="audio/mpeg" />
</audio>

testPHP.php

<?php
//https://translate.google.com/translate_tts?ie=UTF-8&q=' + text + '&tl=en
header('Content-type: text/plain; charset=utf-8');
$params = http_build_query(array("ie" => $_GET['ie'],"tl" => $_GET["tl"], "q" => $_GET["q"]));
$ctx = stream_context_create(array("http"=>array("method"=>"GET","header"=>"Referer: \r\n"))); //create and return stream context
$soundfile = file_get_contents("https://translate.google.com/translate_tts?".$params, false, $ctx); //reads file into string (string with params[utf-8, tl, q], use include path bool, custom context resource headers)

header("Content-type: audio/mpeg");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');

echo($soundfile);

tail -f apache access_logs 显示:

  

GET /testPHP.php?translate_tts?ie=utf-8&tl=zh-CN&q=%E4%BD%A0%E5%A5%BD HTTP / 1.1“200 13536

这似乎没问题。如您所见,已转换q查询参数值,即你好。这很好,因为如果你把它放在浏览器中它仍然有效:

https://translate.google.com/translate_tts?ie=utf-8&tl=zh-CN&q=%E4%BD%A0%E5%A5%BD

tail -f apache error_logs 显示:

  

PHP注意:未定义的索引:即in   /Users/danturcotte/Sites/personal_practice/melonJS-dev/testPHP.php on   第4行,引用者:http://melon.localhost/

我不确定这是怎么回事,或者是否有助于搞砸发音。我认为这些单词可能正在读取ie索引的部分内容?

来自浏览器端的查询参数似乎正在注册,

enter image description here

从apache access_logs可以看出,ie=utf-8 param设置正常。

所以我的问题是:

  • 我已将header('Content-type: text/plain; charset=utf-8');添加到我的testPHP.php文件中,以确保编码正常。这会导致这个问题吗?

  • 我正在构建URI查询字符串:$params = http_build_query(array("ie" => $_GET['ie'],"tl" => $_GET["tl"], "q" => $_GET["q"]));,那么如何存在未定义的索引ie

1 个答案:

答案 0 :(得分:1)

问题在于您的网址:

GET /testPHP.php?translate_tts?ie=utf-8&tl=zh-CN&q=%E4%BD%A0%E5%A5%BD

你有两个问号,这意味着PHP将获得:

Array 
( 
[translate_tts?ie] => utf-8 
[tl] => zh-CN 
[q] => 你好 
)

相反,你需要做类似的事情:

GET /testPHP.php?translate_tts=value&ie=utf-8&tl=zh-CN&q=%E4%BD%A0%E5%A5%BD