Audio.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. namespace Content\Lib;
  3. use Dever;
  4. class Audio
  5. {
  6. public function get($data, $uid = false)
  7. {
  8. if (!is_array($data)) {
  9. $data = Dever::db('content/audio')->getOne($data);
  10. }
  11. if (!$data) {
  12. Dever::alert('错误的课程信息');
  13. }
  14. $data = $this->getContent($data, $uid);
  15. return $data;
  16. }
  17. # 获取相关推荐
  18. public function getRelation($info)
  19. {
  20. $where['noid'] = $info['id'];
  21. return Dever::db('content/audio')->getRelation($where);
  22. }
  23. # 增加浏览量
  24. public function addView($id)
  25. {
  26. Dever::db('content/audio')->addView($id);
  27. }
  28. # 获取课程列表
  29. public function getList($id)
  30. {
  31. $where['audio_id'] = $id;
  32. $data = Dever::db('content/audio_content')->getData($where);
  33. return $data;
  34. }
  35. # 根据文字获取语音
  36. public function convert($id)
  37. {
  38. Dever::daemon('content/lib/audio.convert_daemon?id=' . $id);
  39. }
  40. public function test_api($id)
  41. {
  42. $this->convert_daemon($id);
  43. return 'ok';
  44. }
  45. public function convert_daemon($id)
  46. {
  47. $id = Dever::input('id');
  48. $data = Dever::db('content/audio_content')->one($id);
  49. if ($data && !$data['ali_request_id'] && $data['audio_content']) {
  50. $request = $this->audio($data['id'], $data['audio_id'], $data['audio_content']);
  51. if ($request) {
  52. $update['where_id'] = $id;
  53. $update['ali_request_id'] = $request[0];
  54. $update['ali_task_id'] = $request[1];
  55. $update['audio_status'] = 2;
  56. Dever::db('content/audio_content')->update($update);
  57. }
  58. }
  59. }
  60. private function token()
  61. {
  62. $token = Dever::load('token/lib/aliyun')->token();
  63. $url = 'https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts';
  64. # 长文本
  65. $url = 'https://nls-gateway.cn-shanghai.aliyuncs.com/rest/v1/tts/async';
  66. return array
  67. (
  68. 'url' => $url,
  69. 'token' => $token,
  70. 'appkey' => 'k6ZkLekn5NfRuhR4'
  71. );
  72. }
  73. private function audio($id, $audio_id, $text)
  74. {
  75. $text = str_replace('</p>', "\r\n", $text);
  76. $text = str_replace('<br>', "\r\n", $text);
  77. $text = str_replace('<br />', "\r\n", $text);
  78. $text = str_replace(' ', '', $text);
  79. $text = str_replace('&nbsp;', " ", $text);
  80. $text = strip_tags($text);
  81. $config = $this->token();
  82. $param['header']['appkey'] = $config['appkey'];
  83. $param['header']['token'] = $config['token'];
  84. $param['payload']['tts_request']['text'] = $text;
  85. $param['payload']['tts_request']['voice'] = 'Aixia';
  86. $param['payload']['tts_request']['format'] = 'wav';
  87. $param['payload']['tts_request']['volume'] = 100;
  88. $param['payload']['tts_request']['speech_rate'] = -150;
  89. $param['payload']['tts_request']['pitch_rate'] = 0;
  90. $param['payload']['enable_notify'] = false;
  91. $param['payload']['notify_url'] = Dever::url('lib/audio.audio_address?id=' . $id, 'content');
  92. $param['context']['device_id'] = 'my_php_audio';
  93. $data = Dever::curl($config['url'], $param, 'post', true);
  94. $data = Dever::json_decode($data);
  95. if (isset($data['request_id']) && $data['request_id'] && isset($data['data']['task_id']) && $data['data']['task_id']) {
  96. return array($data['request_id'], $data['data']['task_id']);
  97. }
  98. return false;
  99. }
  100. public function audio_address_api()
  101. {
  102. $id = Dever::input('id');
  103. $info = Dever::db('content/audio_content')->one($id);
  104. if ($info && $info['ali_request_id'] && !$info['audio']) {
  105. $config = $this->token();
  106. $param['token'] = $config['token'];
  107. $param['appkey'] = $config['appkey'];
  108. $param['request_id'] = $info['ali_request_id'];
  109. $param['task_id'] = $info['ali_task_id'];
  110. $data = Dever::curl($config['url'], $param);
  111. $data = Dever::json_decode($data);
  112. if (isset($data['data']['audio_address']) && $data['data']['audio_address']) {
  113. #成功
  114. $update['where_id'] = $id;
  115. $update['audio'] = $this->download($info['id'], $info['audio_id'], $data['data']['audio_address']);
  116. $update['audio_status'] = 3;
  117. Dever::db('content/audio_content')->update($update);
  118. }
  119. }
  120. return 'ok';
  121. }
  122. private function download($id, $audio_id, $source)
  123. {
  124. $data = Dever::load('upload/save')->copy($source, 6);
  125. $file = $data['url'];
  126. return $file;
  127. $path = Dever::path(Dever::data(), 'audio/' . $audio_id . '/');
  128. $file = $path . $id . '.wav';
  129. if (!file_exists($file)) {
  130. $content = file_get_contents($source);
  131. file_put_contents($file, $content);
  132. }
  133. return $file;
  134. }
  135. }