免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3425 | 回复: 0
打印 上一主题 下一主题

PHP菜鸟求助TTS语音报时程序 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-02 21:06 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2015-06-04 08:28 编辑

大家好!
我有一个问题向大家请教。
我用PHP写了一个语音报时程序。
  1. <?php
  2. header("Content-Type: text/html; charset=UTF-8");
  3. $cweekday = array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
  4. $jweekday = array("日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日");
  5. $tweekday = array("Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartes");
  6. $tmonth = array("Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık");

  7. $now = getdate(time());
  8. $cur_wday=$now['wday'];
  9. $cur_mon=$now['mon'] - 1;

  10. $cntime = date("现在时刻:Y年n月j日$cweekday[$cur_wday],G点i分。");
  11. $jptime = date("現在の時刻はY年n月j日$jweekday[$cur_wday]、G時i分です。");
  12. $trtime = "Şuan Tarıh " . date("j ") . $tmonth[$cur_mon] . date(" Y ") . $tweekday[$cur_wday] . ", " . date("G:i") . ".";

  13. $newfname = './tmp/now.wmv';

  14. echo $cntime;
  15. $creqBaseURL = 'http://translate.google.cn/translate_tts?ie=UTF-8&q=' . $cntime . '&tl=zh-CN';
  16. $cremote_file = fopen($creqBaseURL, "rb");
  17. if ($cremote_file){
  18. $newf = fopen($newfname, "wb");
  19. if ($newf){
  20.   while(!feof($cremote_file)){
  21.    fwrite($newf, fread($cremote_file, 1024 * 8),1024 * 8);
  22.   }
  23. fclose($newf);
  24. }
  25. fclose($cremote_file);
  26. }

  27. echo "<br>";
  28. echo $jptime;
  29. $jreqBaseURL = 'http://translate.google.cn/translate_tts?ie=UTF-8&q=' . $jptime . '&tl=ja-JP';
  30. $jremote_file = fopen($jreqBaseURL, "rb");
  31. if ($jremote_file){
  32. $newf = fopen($newfname, "ab");
  33. if ($newf){
  34.   while(!feof($jremote_file)){
  35.    fwrite($newf, fread($jremote_file, 1024 * 8),1024 * 8);
  36.   }
  37. fclose($newf);
  38. }
  39. fclose($jremote_file);
  40. }

  41. echo "<br>";
  42. echo $trtime;
  43. echo '<br><br>http://translate.google.cn/translate_tts?ie=UTF-8&q=' . $trtime . '&tl=tr-TR';
  44. $treqBaseURL = 'http://translate.google.cn/translate_tts?ie=UTF-8&q=' . "$trtime" . '&tl=tr-TR';
  45. $tremote_file = fopen($treqBaseURL, "rb");
  46. if ($tremote_file){
  47. $newf = fopen($newfname, "ab");
  48. if ($newf){
  49.   while(!feof($tremote_file)){
  50.    fwrite($newf, fread($tremote_file, 1024 * 8),1024 * 8);
  51.   }
  52. fclose($newf);
  53. }
  54. fclose($tremote_file);
  55. }
  56. echo '<embed loop="1" autostart="true" hidden="true" src=./tmp/now.wmv />';
  57. ?>
复制代码
程序在执行的时候,中文和日文的报时都可以正常报出来。
  1. 现在时刻:2015年6月2日星期二,21点09分。
  2. 現在の時刻は2015年6月2日火曜日、21時09分です。
  3. Şuan Tarıh 2 Haziran 2015 Salı, 21:09.
复制代码
但是土耳其语的部分则报错如下:
  1. [Tue Jun 02 21:09:40 2015] [error] [client 180.170.45.231] PHP Warning:  fopen(http://translate.google.cn/translate_tts?ie=UTF-8&amp;q=\xc5\x9euan Tar\xc4\xb1h 2 Haziran 2015 Sal\xc4\xb1, 21:09.&amp;tl=tr-TR): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request\r\n in /home/box/public_html/now.php on line 51
复制代码
看来是php解释器把土耳其语的TTS请求中的文本:
  1. http://translate.google.cn/translate_tts?ie=UTF-8&q=Şuan Tarıh 2 Haziran 2015 Salı, 21:09.&tl=tr-TR
复制代码
不知道是什么原因,由UTF-8编码方式转换成了ASCII编码方式:
  1. http://translate.google.cn/translate_tts?ie=UTF-8&amp;q=\xc5\x9euan Tar\xc4\xb1h 2 Haziran 2015 Sal\xc4\xb1, 21:09.&amp;tl=tr-TR
复制代码
所以出错。
前者贴到浏览器的地址栏是可以得到语音的,而后者就不行。
  1. [box@ruizi:~]$ cat file|hexdump -C
  2. 00000000  c5 9e 75 61 6e 20 54 61  72 c4 b1 68 20 32 20 48  |..uan Tar..h 2 H|
  3. 00000010  61 7a 69 72 61 6e 20 32  30 31 35 20 53 61 6c c4  |aziran 2015 Sal.|
  4. 00000020  b1 2c 20 32 31 3a 31 38  2e 0a                    |., 21:18..|
  5. 0000002a
复制代码
大家可以看到有土耳其语字母Ş和ı,在UTF-8编码中分别用十六进制的\xc5\x9e和\xc4\xb1表示。


我试了把申请TTS的那条语句改写成:
  1. $treqBaseURL = 'http://translate.google.cn/translate_tts?ie=UTF-8&q=' . iconv("ASCII", "UTF-8", "$trtime") . '&tl=tr-TR';
复制代码
但是还是报错:
  1. [Tue Jun 02 23:34:04 2015] [error] [client 180.170.45.231] PHP Notice:  iconv(): Detected an illegal character in input string in /home/box/public_html/now.php on line 50
  2. [Tue Jun 02 23:34:05 2015] [error] [client 180.170.45.231] PHP Warning:  fopen(http://translate.google.cn/translate_tts?ie=UTF-8&amp;q=&amp;tl=tr-TR): failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found\r\n in /home/box/public_html/now.php on line 51
复制代码
请问有什么办法让php解释器正确解读土耳其语的TTS请求呢?
而且让我觉得特别疑惑的是,中文和日文的TTS请求文本同样是UTF-8编码的啊?
为什么中文和日文的文本没有被转换成ASCII编码,执行没有报错呢?
谢谢大家!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP