lh пре 2 дана
родитељ
комит
7e97af67a3

+ 25 - 0
app/Console/Test/TestCommand.php

@@ -48,6 +48,31 @@ class TestCommand extends Command
      */
     public function handle()
     {
+        $filename = '%E6%B5%8B%E8%AF%95%E9%9F%B3%E6%95%88.mp4';
+        $filename = 'abc测试音效.mp4';
+        dd(urldecode($filename));
+        // $wavPath = public_path('wav');
+        // if (!file_exists($wavPath)) {
+        //     return [];
+        // }
+        
+        // $files = scandir($wavPath);
+        
+        // $insert_data = [];
+        // foreach ($files as $file) {
+        //     if ($file !== '.' && $file !== '..') {
+        //         $insert_data[] = [
+        //             'audio_effect_name' => pathinfo($file, PATHINFO_FILENAME),
+        //             'audio_effect_url'  => 'https://cdn-zwai.ycsd.cn/mp_audio/audio_effects/'.$file,
+        //             'is_enabled'        => 1,
+        //             'created_at'        => date('Y-m-d H:i:s'),
+        //             'updated_at'        => date('Y-m-d H:i:s'),
+        //         ];
+        //     }
+        // }
+        // DB::table('mp_audio_effects')->insert($insert_data);
+
+        // exit();
         $bid = 321;
         $version_id = 1663;
         $cid = 708197;

+ 30 - 0
app/Http/Controllers/Book/BookController.php

@@ -144,4 +144,34 @@ class BookController extends BaseController
         $result = $this->bookService->getTaskDetail($data);
         return $this->success($result);
     }
+
+    // 可选音效
+    public function audioEffects(Request $request) {
+        $data = $request->all();
+        $result = $this->bookService->audioEffects($data);
+        return $this->success($result);
+    }
+
+    // 上传音效
+    public function uploadAudioEffect(Request $request) {
+        $data = $request->all();
+        $file = $request->file('file');
+        $result = $this->bookService->uploadAudioEffect($data, $file);
+        return $this->success($result);
+    }
+
+    // 可选bgm
+    public function bgms(Request $request) {
+        $data = $request->all();
+        $result = $this->bookService->bgms($data);
+        return $this->success($result);
+    }
+
+    // 上传bgm
+    public function uploadBgm(Request $request) {
+        $data = $request->all();
+        $file = $request->file('file');
+        $result = $this->bookService->uploadBgm($data, $file);
+        return $this->success($result);
+    }
 }

+ 10 - 7
app/Libs/Helpers.php

@@ -262,7 +262,7 @@ function randStr($num = 5)
  *
  * @param $prefix   文件夹前缀
  * @param $file     文件二进制
- * @param $filename 文件名
+ * @param $filename 文件名(不带后缀)
  * @return mixed
  */
 function uploadFile($prefix, $file, $filename='')
@@ -274,6 +274,7 @@ function uploadFile($prefix, $file, $filename='')
     $bucket          = env('OSS_BUCKET');
 
     if (!$filename) $filename = randStr(10) . '.' . $file->getClientOriginalExtension();
+    else $filename = $filename . '.' . $file->getClientOriginalExtension();
     // 设置文件名称。
     $object = env('OSS_DIRECTORY') . '/' . $prefix . '/' . $filename;
     $provider = new \OSS\Credentials\StaticCredentialsProvider($accessKeyId, $accessKeySecret);
@@ -295,8 +296,9 @@ function uploadFile($prefix, $file, $filename='')
 
     // 替换域名
     if (!isset($uploadRes['oss-request-url'])) return '';
-    $imageUrl = str_ireplace('zw-ai.oss-cn-hangzhou.aliyuncs.com', 'cdn-zwai.ycsd.cn', $uploadRes['oss-request-url']);
-    return str_ireplace('http://', 'https://', $imageUrl);
+    $url = str_ireplace('zw-ai.oss-cn-hangzhou.aliyuncs.com', 'cdn-zwai.ycsd.cn', $uploadRes['oss-request-url']);
+    $url = urldecode($url);
+    return str_ireplace('http://', 'https://', $url);
 }
 
 /**
@@ -304,7 +306,7 @@ function uploadFile($prefix, $file, $filename='')
  *
  * @param $prefix   文件夹前缀
  * @param $file     文件二进制
- * @param $filename 文件名
+ * @param $filename 文件名(带后缀)
  * @return mixed
  */
 function uploadStreamToOss($prefix, $stream, $filename) {
@@ -313,7 +315,7 @@ function uploadStreamToOss($prefix, $stream, $filename) {
     $endpoint        = env('OSS_END_POINT');
     $bucket          = env('OSS_BUCKET');
 
-    if (!$filename) $filename = randStr(10) . '.' . $file->getClientOriginalExtension();
+    // if (!$filename) $filename = randStr(10) . '.' . $file->getClientOriginalExtension();
     // 设置文件名称。
     $object = env('OSS_DIRECTORY') . '/' . $prefix . '/' . $filename;
     $provider = new \OSS\Credentials\StaticCredentialsProvider($accessKeyId, $accessKeySecret);
@@ -336,8 +338,9 @@ function uploadStreamToOss($prefix, $stream, $filename) {
 
     // 替换域名
     if (!isset($uploadRes['oss-request-url'])) return '';
-    $imageUrl = str_ireplace('zw-ai.oss-cn-hangzhou.aliyuncs.com', 'cdn-zwai.ycsd.cn', $uploadRes['oss-request-url']);
-    return str_ireplace('http://', 'https://', $imageUrl);
+    $url = str_ireplace('zw-ai.oss-cn-hangzhou.aliyuncs.com', 'cdn-zwai.ycsd.cn', $uploadRes['oss-request-url']);
+    $url = urldecode($url);
+    return str_ireplace('http://', 'https://', $url);
 }
 
 /**

+ 60 - 0
app/Services/Book/BookService.php

@@ -266,4 +266,64 @@ class BookService
 
         return $result;
     }
+
+    public function audioEffects($data) {
+        return DB::table('mp_audio_effects')->where('is_enabled', 1)->select('audio_effect_name', 'audio_effect_url')->get()->map(function ($value) {
+            return (array)$value;
+        })->toArray();
+    }
+
+    public function uploadAudioEffect($data, $file) {
+        $audio_effect_name = getProp($data, 'audio_effect_name');
+
+        if (!$file) Utils::throwError('20003:请上传音频文件');
+        // 验证文件格式(常见音频格式)
+        if (!in_array($file->getClientOriginalExtension(), ['mp3', 'wav', 'flac', 'm4a', 'ogg', 'wma', 'cda', 'aiff', 'au', 'aac', 'amr'])) Utils::throwError('20003:音频格式错误');
+        if (!$audio_effect_name) Utils::throwError('20003:请输入音频效果名称');
+        if (DB::table('mp_audio_effects')->where('audio_effect_name', $audio_effect_name)->exists()) Utils::throwError('20003:音效名称已存在');
+        
+        // 上传文件到oss
+        $audio_effect_url = uploadFile('audio_effects', $file, $audio_effect_name);
+        if (!$audio_effect_url) Utils::throwError('20003:上传音频文件失败');
+
+        $boolen = DB::table('mp_audio_effects')->insert([
+            'audio_effect_name' => $audio_effect_name,
+            'audio_effect_url' => $audio_effect_url,
+            'is_enabled' => 1,
+            'created_at' => date('Y-m-d H:i:s'),
+            'updated_at' => date('Y-m-d H:i:s')
+        ]);
+        if (!$boolen) Utils::throwError('20003:添加音效失败');
+        return ['audio_effect_name' => $audio_effect_name, 'audio_effect_url' => $audio_effect_url];
+    }
+
+    public function bgms($data) {
+        return DB::table('mp_bgms')->where('is_enabled', 1)->select('bgm_name', 'bgm_url')->get()->map(function ($value) {
+            return (array)$value;
+        })->toArray();
+    }
+
+    public function uploadBgm($data, $file) {
+        $bgm_name = getProp($data, 'bgm_name');
+
+        if (!$file) Utils::throwError('20003:请上传音频文件');
+        // 验证文件格式(常见音频格式)
+        if (!in_array($file->getClientOriginalExtension(), ['mp3', 'wav', 'flac', 'm4a', 'ogg', 'wma', 'cda', 'aiff', 'au', 'aac', 'amr'])) Utils::throwError('20003:音频格式错误');
+        if (!$bgm_name) Utils::throwError('20003:请输入音频效果名称');
+        if (DB::table('mp_bgms')->where('bgm_name', $bgm_name)->exists()) Utils::throwError('20003:bgm名称已存在');
+        
+        // 上传文件到oss
+        $bgm_url = uploadFile('bgms', $file, $bgm_name);
+        if (!$bgm_url) Utils::throwError('20003:上传音频文件失败');
+
+        $boolen = DB::table('mp_bgms')->insert([
+            'bgm_name' => $bgm_name,
+            'bgm_url' => $bgm_url,
+            'is_enabled' => 1,
+            'created_at' => date('Y-m-d H:i:s'),
+            'updated_at' => date('Y-m-d H:i:s')
+        ]);
+        if (!$boolen) Utils::throwError('20003:添加bgm失败');
+        return ['bgm_name' => $bgm_name, 'bgm_url' => $bgm_url];
+    }
 }

+ 4 - 3
app/Services/DeepSeek/DeepSeekService.php

@@ -153,9 +153,10 @@ class DeepSeekService
             'emotion_type'  => $emotion_type,
             'voice_type'    => getProp($data, 'voice_type'),
             'voice_name'    => getProp($data, 'voice_name'),
-            'speed_ratio'   => getProp($data, 'speed_ratio'),
-            'loudness_ratio'=> getProp($data, 'loudness_ratio'),
-            'emotion_scale' => getProp($data, 'emotion_scale'),
+            'speed_ratio'   => getProp($data, 'speed_ratio', 0),
+            'loudness_ratio'=> getProp($data, 'loudness_ratio', 0),
+            'emotion_scale' => getProp($data, 'emotion_scale', 4),
+            'pitch'         => getProp($data, 'pitch', 0),
             // 'paragraph_audio_url' => '',
             'generate_status' => '制作中',
             'error_msg'     => '',

+ 8 - 0
routes/api.php

@@ -33,6 +33,14 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
         Route::get('versionList', [BookController::class, 'versionList']);
         Route::get('taskList', [BookController::class, 'taskList']);
         Route::get('taskDetail', [BookController::class, 'taskDetail']);
+
+        // 音效
+        Route::get('audioEffects', [BookController::class, 'audioEffects']);
+        Route::post('uploadAudioEffect', [BookController::class, 'uploadAudioEffect']);
+
+        // bgm
+        Route::get('bgms', [BookController::class, 'bgms']);
+        Route::post('uploadBgm', [BookController::class, 'uploadBgm']);
     });
 
     Route::group(['prefix' => 'timbre'], function () {