Ver código fonte

新增音色情绪组相关接口

lh 4 dias atrás
pai
commit
cf9b14baf5

+ 6 - 0
app/Http/Controllers/DeepSeek/DeepSeekController.php

@@ -207,4 +207,10 @@ class DeepSeekController extends BaseController
         if(ob_get_level()>0) ob_flush();
         flush();
     }
+
+    public function emotionGroups(Request $request) {
+        $data = $request->all();
+        $result = $this->deepseekService->emotionGroups($data);
+        return $this->success($result);
+    }
 }

+ 32 - 0
app/Http/Controllers/Timbre/TimbreController.php

@@ -84,21 +84,53 @@ class TimbreController extends BaseController
         return $this->success(['success' => $result ? 1 : 0]);
     }
 
+    // 音色组
     public function timbreGroupList(Request $request) {
         $data = $request->all();
         $result = $this->timbreService->timbreGroupList($data);
         return $this->success($result, [new TimbreTransformer(), 'newBuildTimbreGroupList']);
     }
 
+    // 添加音色组
     public function addTimbreGroup(Request $request) {
         $data = $request->all();
         $result = $this->timbreService->addTimbreGroup($data);
         return $this->success(['success' => $result ? 1 : 0]);
     }
 
+    // 编辑音色组
     public function editTimbreGroup(Request $request) {
         $data = $request->all();
         $result = $this->timbreService->editTimbreGroup($data);
         return $this->success(['success' => $result ? 1 : 0]);
     }
+
+    // 音色情绪配置组
+    public function emotionGroupList(Request $request) {
+        $data = $request->all();
+        $result = $this->timbreService->emotionGroupList($data);
+        return $this->success($result, [new TimbreTransformer(), 'newBuildEmotionGroupList']);
+    }
+
+    // 添加音色情绪配置组
+    public function addEmotionGroup(Request $request) {
+        $data = $request->all();
+        $result = $this->timbreService->addEmotionGroup($data);
+        return $this->success(['success' => $result ? 1 : 0]);
+    }
+
+    // 编辑音色情绪配置组
+    public function editEmotionGroup(Request $request) {
+        $data = $request->all();
+        $result = $this->timbreService->editEmotionGroup($data);
+        return $this->success(['success' => $result ? 1 : 0]);
+    }
+
+    // 删除音色情绪配置组
+    public function delEmotionGroup(Request $request) {
+        $data = $request->all();
+        $result = $this->timbreService->delEmotionGroup($data);
+        return $this->success(['success' => $result ? 1 : 0]);
+    }
+
 }

+ 21 - 0
app/Services/DeepSeek/DeepSeekService.php

@@ -471,6 +471,27 @@ class DeepSeekService
         // dd($response_arr);
     }
 
+    public function emotionGroups($data) {
+        $group_name = getProp($data, 'group_name');
+        $label = getProp($data, 'label');
+
+        $query = DB::table('mp_emotion_groups')->where('is_enabled', 1)->select('id as group_id', 'group_name',
+        'emotion', 'emotion_type', 'voice_name', 'voice_type', 'speed_ratio', 'loudness_ratio', 'emotion_scale',
+        'pitch', 'generate_status', 'audio_url', 'error_msg');
+
+        if ($group_name) {
+            $query->where('group_name', 'like', "%{$group_name}%");
+        }
+
+        if ($label) {
+            $query->where('label', 'like', $label);
+        }
+
+        return $query->orderBy('id')->get()->map(function ($value) {
+            return (array)$value;
+        })->toArray();
+    }
+
     private function sign($key, $msg) {
         return hash_hmac('sha256', $msg, $key, true);
     }

+ 135 - 0
app/Services/Timbre/TimbreService.php

@@ -7,6 +7,7 @@ use App\Facade\Site;
 use App\Libs\Utils;
 use GuzzleHttp\Client;
 use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Redis;
 use OSS\Core\OssException;
 use OSS\OssClient;
@@ -253,4 +254,138 @@ class TimbreService
             'updated_at'                => date('Y-m-d H:i:s'),
         ]);
     }
+
+    public function emotionGroupList($data) {
+        $group_name = getProp($data, 'group_name');
+        $label = getProp($data, 'label');
+
+        $query = DB::table('mp_emotion_groups')->where('is_enabled', 1)->select('*');
+
+        if ($group_name) {
+            $query->where('group_name', 'like', "%{$group_name}%");
+        }
+
+        if ($label) {
+            $query->where('label', 'like', $label);
+        }
+
+        return $query->orderBy('id')->paginate();
+    }
+
+    public function addEmotionGroup($data) {
+        $group_name = getProp($data, 'group_name');
+        if (DB::table('mp_emotion_groups')->where('group_name', $group_name)->value('id')) Utils::throwError('20003:该组名已存在');
+        // 获取所有情感
+        $emotion_list = DB::table('mp_emotion_list')->where('is_enabled', 1)->pluck('emotion_name', 'emotion_code')->toArray();
+        $emotion_list = array_flip($emotion_list);
+
+        // 获取音色支持情感
+        $timbre_emotion = DB::table('mp_timbres')->where('timbre_type', getProp($data, 'voice_type'))->value('emotion');
+        $timbre_emotion = explode(',', $timbre_emotion);
+        $emotion = getProp($data, 'emotion');
+        if (!in_array($emotion, $timbre_emotion)) $emotion = '中性';
+        $emotion_type = isset($emotion_list[$emotion]) ? $emotion_list[$emotion] : 'neutral';
+
+        // 给一个默认文案
+        $text = '试听这段由专业团队打造的声音杰作。从角色塑造到环境音效,每个元素都经过反复推敲,只为给你带来最完美的听觉体验。';
+        $list = [
+            'group_name'    => $group_name,
+            // 'text'          => trim(getProp($data, 'text')),
+            'text'          => $text,
+            'emotion'       => $emotion,
+            'emotion_type'  => $emotion_type,
+            'voice_type'    => getProp($data, 'voice_type'),
+            'voice_name'    => getProp($data, 'voice_name'),
+            '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),
+            'generate_status' => '制作中',
+            'error_msg'     => '',
+            'created_at'    => date('Y-m-d H:i:s'),
+            'updated_at'    => date('Y-m-d H:i:s')
+        ];
+
+        $id = DB::table('mp_emotion_groups')->insertGetId($list);
+        $boolen = $id ? true : false;
+
+        // if ($boolen) {
+        //     $boolen = false;
+        //     $client = new Client(['timeout' => 300, 'verify' => false]);
+        //     // 根据ID通过API通知合成音频
+        //     // $result = $client->get("http://47.240.171.155:5000/api/previewTask?taskId={$id}");
+        //     $result = $client->get("http://122.9.129.83:5000/api/previewTask?taskId={$id}");
+        //     $response = $result->getBody()->getContents();
+        //     $response_arr = json_decode($response, true);
+        //     if (!isset($response_arr['code']) || (int)$response_arr['code'] !== 0) {
+        //         $error_msg = isset($response_arr['msg']) ? $response_arr['msg'] : '未知错误';
+        //         Log::info('通知火山生成段落音频失败: '.$error_msg);
+        //         Utils::throwError('20003:通知火山生成段落音频失败');
+        //     }
+        //     $boolen = true;
+        // }
+
+        return $boolen;
+    }
+
+    public function editEmotionGroup($data) {
+        $group_id = getProp($data, 'group_id');
+        $group_name = getProp($data, 'group_name');
+        $tmp_group_id = DB::table('mp_emotion_groups')->where('group_name', $group_name)->value('id');
+        if ($tmp_group_id && $tmp_group_id != $group_id) Utils::throwError('20003:该音色组已存在');
+        // 获取所有情感
+        $emotion_list = DB::table('mp_emotion_list')->where('is_enabled', 1)->pluck('emotion_name', 'emotion_code')->toArray();
+        $emotion_list = array_flip($emotion_list);
+
+        // 获取音色支持情感
+        $timbre_emotion = DB::table('mp_timbres')->where('timbre_type', getProp($data, 'voice_type'))->value('emotion');
+        $timbre_emotion = explode(',', $timbre_emotion);
+        $emotion = getProp($data, 'emotion');
+        if (!in_array($emotion, $timbre_emotion)) $emotion = '中性';
+        $emotion_type = isset($emotion_list[$emotion]) ? $emotion_list[$emotion] : 'neutral';
+
+        $list = [
+            'group_name'    => $group_name,
+            // 'text'          => trim(getProp($data, 'text')),
+            'emotion'       => $emotion,
+            'emotion_type'  => $emotion_type,
+            'voice_type'    => getProp($data, 'voice_type'),
+            'voice_name'    => getProp($data, 'voice_name'),
+            '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),
+            'generate_status' => '制作中',
+            'error_msg'     => '',
+            'updated_at'    => date('Y-m-d H:i:s')
+        ];
+
+        $boolen = DB::table('mp_emotion_groups')->where('id', $group_id)->update($list);
+
+        // if ($boolen) {
+        //     $boolen = false;
+        //     $client = new Client(['timeout' => 300, 'verify' => false]);
+        //     // 根据ID通过API通知合成音频
+        //     // $result = $client->get("http://47.240.171.155:5000/api/previewTask?taskId={$group_id}");
+        //     $result = $client->get("http://122.9.129.83:5000/api/previewTask?taskId={$group_id}");
+        //     $response = $result->getBody()->getContents();
+        //     $response_arr = json_decode($response, true);
+        //     if (!isset($response_arr['code']) || (int)$response_arr['code'] !== 0) {
+        //         $error_msg = isset($response_arr['msg']) ? $response_arr['msg'] : '未知错误';
+        //         Log::info('通知火山生成段落音频失败: '.$error_msg);
+        //         Utils::throwError('20003:通知火山生成段落音频失败');
+        //     }
+        //     $boolen = true;
+        // }
+
+        return $boolen;
+    }
+
+    public function delEmotionGroup($data) {
+        $group_id = getProp($data, 'group_id');
+        return DB::table('mp_emotion_groups')->where('id', $group_id)->update([
+            'is_enabled' => 0,
+            'updated_at'    => date('Y-m-d H:i:s')
+        ]);
+    }
 }

+ 37 - 1
app/Transformer/Timbre/TimbreTransformer.php

@@ -97,7 +97,7 @@ class TimbreTransformer
         return $result;
     }
 
-    // 分类列表
+    // 音色组列表
     public function newBuildTimbreGroupList($data): array
     {
         return [
@@ -129,4 +129,40 @@ class TimbreTransformer
 
         return $result;
     }
+
+    // 音色情感组列表
+    public function newBuildEmotionGroupList($data): array
+    {
+        return [
+            'meta' => getMeta($data),
+            'list'  => $this->newEachEmotionGroupList($data),
+        ];
+    }
+
+    private function newEachEmotionGroupList($list): array
+    {
+        $result = [];
+        if (empty($list)) return $result;
+
+        foreach ($list as $item) {
+            $result[] = [
+                'group_id'              => getProp($item, 'id'),
+                'group_name'            => getProp($item, 'group_name'),
+                'emotion'               => getProp($item, 'emotion'),
+                'emotion_type'          => getProp($item, 'emotion_type'),
+                'voice_type'            => getProp($item, 'voice_type'),
+                'voice_name'            => getProp($item, 'voice_name'),
+                'speed_ratio'           => getProp($item, 'speed_ratio'),
+                'loudness_ratio'        => getProp($item, 'loudness_ratio'),
+                'emotion_scale'         => getProp($item, 'emotion_scale'),
+                'pitch'                 => getProp($item, 'pitch'),
+                'generate_status'       => getProp($item, 'generate_status'),
+                'audio_url'             => getProp($item, 'audio_url'),
+                'error_msg'             => getProp($item, 'error_msg'),
+                'created_at'            => transDate(getProp($item, 'created_at')),
+            ];
+        }
+
+        return $result;
+    }
 }

+ 7 - 0
routes/api.php

@@ -54,6 +54,12 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
         Route::get('groupList', [TimbreController::class, 'timbreGroupList']);
         Route::post('addGroup', [TimbreController::class, 'addTimbreGroup']);
         Route::post('editGroup', [TimbreController::class, 'editTimbreGroup']);
+
+        // 情绪组
+        Route::get('emotionGroupList', [TimbreController::class, 'emotionGroupList']);
+        Route::post('addEmotionGroup', [TimbreController::class, 'addEmotionGroup']);
+        Route::post('editEmotionGroup', [TimbreController::class, 'editEmotionGroup']);
+        Route::get('delEmotionGroup', [TimbreController::class, 'delEmotionGroup']);
     });
 
 
@@ -64,6 +70,7 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
         Route::get('setStsToken', [DeepSeekController::class, 'setStsToken']);
         Route::get('resetParagraphAudio', [DeepSeekController::class, 'resetParagraphAudio']);
         Route::post('saveParagraphAudio', [DeepSeekController::class, 'saveParagraphAudio']);
+        Route::get('emotionGroups', [DeepSeekController::class, 'emotionGroups']);
     });
     
 });