lh vor 3 Tagen
Ursprung
Commit
aa5b71be49
1 geänderte Dateien mit 37 neuen und 5 gelöschten Zeilen
  1. 37 5
      app/Services/DeepSeek/DeepSeekService.php

+ 37 - 5
app/Services/DeepSeek/DeepSeekService.php

@@ -36,10 +36,20 @@ class DeepSeekService
         $model = getProp($data, 'model', 'r1');
         $model = $model == 'r1' ? 'deepseek-reasoner' : 'deepseek-chat';
 
-        // 获取可选情感
-        $emotion_list = DB::table('mp_emotion_list')->where('is_enabled', 1)->select('emotion_name')->orderBy('id')->get()->pluck('emotion_name')->toArray();
+        // 获取可选情感(根据音色可支持情感选)
+        $timbre_emotion = DB::table('mp_timbres')->where('is_enabled', 1)->pluck('emotion')->toArray();
+        $emotion_list = [];
+        foreach ($timbre_emotion as $emotion) {
+            $tmp = explode(',', $emotion);
+            $emotion_list = array_merge($emotion_list, $tmp);
+        }
+        $emotion_list = array_unique($emotion_list);
         $emotion_str = implode('、', $emotion_list);
 
+        // // 获取可选情感
+        // $emotion_list = DB::table('mp_emotion_list')->where('is_enabled', 1)->select('emotion_name')->orderBy('id')->get()->pluck('emotion_name')->toArray();
+        // $emotion_str = implode('、', $emotion_list);
+
         // 是否启用情感
         $enable_emotion = getProp($data, 'enable_emotion', 0);
         if ($enable_emotion) {
@@ -109,6 +119,16 @@ class DeepSeekService
         $version_id = getProp($data, 'version_id');
         $sequence = getProp($data, 'sequence');
         $id = DB::table('mp_chapter_paragraph_audios')->where('bid', $bid)->where('cid', $cid)->where('version_id', $version_id)->where('sequence', $sequence)->value('id');
+        // 获取所有情感
+        $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 = [
             'bid'           => $bid,
             'cid'           => $cid,
@@ -117,8 +137,8 @@ class DeepSeekService
             'role'          => getProp($data, 'role'),
             'gender'        => getProp($data, 'gender'),
             'text'          => trim(getProp($data, 'text')),
-            'emotion'       => getProp($data, 'emotion'),
-            'emotion_type'  => getProp($data, 'emotion_type'),
+            'emotion'       => $emotion,
+            'emotion_type'  => $emotion_type,
             'voice_type'    => getProp($data, 'voice_type'),
             'voice_name'    => getProp($data, 'voice_name'),
             'speed_ratio'   => getProp($data, 'speed_ratio'),
@@ -202,6 +222,13 @@ class DeepSeekService
         $emotion_list = DB::table('mp_emotion_list')->where('is_enabled', 1)->pluck('emotion_name', 'emotion_code')->toArray();
         $emotion_list = array_flip($emotion_list);
 
+        // 获取音色对应情感组
+        $timbre_emotions = DB::table('mp_timbres')->where('is_enabled', 1)->select('timbre_type', 'emotion')->get();
+        $timbre_emotion_list = [];
+        foreach($timbre_emotions as $item) {
+            $timbre_emotion_list[getProp($item, 'timbre_type')] = explode(',', getProp($item, 'emotion'));
+        }
+
         // 构造生成音频的json
         $words = json_decode($generate_json, true);
 
@@ -213,7 +240,12 @@ class DeepSeekService
             if (!($word['text']) || !($word['voice_type']) || !($word['voice_name'])) Utils::throwError('20003:参数不得为空');
             $role = getProp($word, 'role');
             $word['gender'] = (int)$word['gender'];
-            if (isset($emotion_list[getProp($word, 'emotion')])) {  // 如果有对应情感则赋值,没有则默认为中性(neutral)
+
+            // 判断音色对应情感是否支持,不支持则调整为中性
+            $access_emotion = isset($timbre_emotion_list[$word['voice_type']]) ? $timbre_emotion_list[$word['voice_type']] : [];
+            if (!in_array($word['emotion'], $access_emotion)) $word['emotion'] = '中性';
+            // 如果有对应情感则赋值,没有则默认为中性(neutral)
+            if (isset($emotion_list[getProp($word, 'emotion')])) {
                 $word['emotion_type'] = $emotion_list[getProp($word, 'emotion')];
             }else {
                 $word['emotion'] = '中性';