lh 4 gün önce
ebeveyn
işleme
3a4d7f7673

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

@@ -37,33 +37,75 @@ class BookController extends BaseController
         return $this->success($result, [new BookTransformer(), 'newBuildBookList']);
     }
 
+    /**
+     * 可选书籍
+     *
+     * @param Request $request
+     * @return mixed
+     */
     public function allBooks(Request $request) {
         $data = $request->all();
         $result = $this->bookService->getAllBooks($data);
         return $this->success($result);
     }
 
+    /**
+     * 可选版本
+     *
+     * @param Request $request
+     * @return mixed
+     */
     public function bookVersion(Request $request) {
         $data = $request->all();
         $result = $this->bookService->getBookVersion($data);
         return $this->success($result);
     }
 
+    /**
+     * 新增书籍版本
+     *
+     * @param Request $request
+     * @return mixed
+     */
     public function addBookVersion(Request $request) {
         $data = $request->all();
         $result = $this->bookService->addBookVersion($data);
         return $this->success(['success'=>$result ? 1 : 0]);
     }
 
+    /**
+     * 章节列表
+     *
+     * @param Request $request
+     * @return mixed
+     */
     public function chapterList(Request $request) {
         $data = $request->all();
         $result = $this->bookService->getChapterList($data);
         return $this->success($result, [new BookTransformer(), 'newBuildChapterList']);
     }
 
+    /**
+     * 章节内容
+     *
+     * @param Request $request
+     * @return mixed
+     */
     public function chapterContent(Request $request) {
         $data = $request->all();
         $result = $this->bookService->getChapterContent($data);
         return $this->success($result);
     }
+
+    /**
+     * 版本列表
+     *
+     * @param Request $request
+     * @return mixed
+     */
+    public function versionList(Request $request) {
+        $data = $request->all();
+        $result = $this->bookService->getVersionList($data);
+        return $this->success($result, [new BookTransformer(), 'newBuildVersionList']);
+    }
 }

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

@@ -47,4 +47,16 @@ class DeepSeekController extends BaseController
         $result = $this->deepseekService->timbreList($data);
         return $this->success($result);
     }
+
+    /**
+     * 新增合成任务
+     *
+     * @param Request $request
+     * @return mixed
+     */
+    public function addGenerateTask(Request $request) {
+        $data = $request->all();
+        $result = $this->deepseekService->addGenerateTask($data);
+        return $this->success(['success'=>$result ? 1 : 0]);
+    }
 }

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

@@ -140,6 +140,18 @@ class BookService
         $header = (array)$book;
         $header['cover'] = addPrefix($header['cover']);
         $header['intro'] = filterIntro($header['intro']);
+        $role_info = DB::table('mp_book_version')->where('id', $version_id)->where('bid', $bid)->value('role_info');
+        if ($role_info) {
+            foreach(json_decode($role_info, true) as $role => $timbre) {
+                $header['role_info'][] = [
+                    'role'          => $role,
+                    'voice_type'    => getProp($timbre, 'timbre_type'),
+                    'voice_name'    => getProp($timbre, 'timbre_name'),
+                ];
+            }
+        }else {
+            $header['role_info'] = [];
+        }
         
         $list = DB::table('mp_chapter_audios')->where('bid', $bid)->where('version_id', $version_id)->orderBy('sequence', 'asc')
         ->select('cid', 'chapter_name', 'sequence', 'size', 'generate_status', 'audio_url', 'remark')
@@ -159,4 +171,18 @@ class BookService
 
         return $content;
     }
+
+    public function getVersionList($data) {
+        $version_id = getProp($data, 'version_id');
+        $version_name = getProp($data, 'version_name');
+        $book_name = getProp($data, 'book_name');
+
+        $query = DB::table('mp_book_version as v')->leftJoin('book_configs as bc', 'v.bid', '=', 'bc.bid');
+        if ($version_id) $query->where('v.id', $version_id);
+        if ($version_name) $query->where('v.version_name', 'like', '%'.$version_name.'%');
+        if ($book_name) $query->where('bc.book_name', 'like', '%'.$book_name.'%');
+        $list = $query->select('v.*', 'bc.book_name')->paginate();
+
+        return $list;
+    }
 }

+ 69 - 2
app/Services/DeepSeek/DeepSeekService.php

@@ -88,11 +88,78 @@ class DeepSeekService
         return $result;
     }
 
+    // 新增合成任务
+    public function addGenerateTask($data) {
+        $bid = getProp($data, 'bid');
+        $cid = getProp($data, 'cid');
+        $version_id = getProp($data, 'version_id');
+        $generate_json = getProp($data, 'generate_json');
+
+        // 更新角色-音色信息
+        $existed_role_info = DB::table('mp_book_version')->where('bid', $bid)->where('id', $version_id)->value('role_info');
+        $existed_role_info = json_decode($existed_role_info, true);
+        if ($existed_role_info) $existed_roles = array_keys($existed_role_info);
+        else $existed_roles = [];
+
+        // 获取情感信息
+        $emotion_list = DB::table('mp_emotion_list')->where('is_enabled', 1)->pluck('emotion_name', 'emotion_code')->toArray();
+        $emotion_list = array_flip($emotion_list);
+
+        // 构造生成音频的json
+        $words = json_decode($generate_json, true);
+        foreach($words as &$word) {
+            if (!isset($word['text']) || !isset($word['emotion']) || !isset($word['voice_type']) || !isset($word['voice_name']) || !isset($word['speed_ratio']) || !isset($word['loudness_ratio']) || !isset($word['emotion_scale'])) Utils::throwError('20003:参数格式有误');
+            if (!($word['text']) || !($word['voice_type']) || !($word['voice_name']) || !($word['speed_ratio']) || !($word['loudness_ratio']) || !($word['emotion_scale'])) Utils::throwError('20003:参数不得为空');
+            $role = getProp($word, 'role');
+            $word['gender'] = (int)$word['gender'];
+            if (isset($emotion_list[getProp($word, 'emotion')])) {  // 如果有对应情感则赋值,没有则默认为中性(neutral)
+                $word['emotion_type'] = $emotion_list[getProp($word, 'emotion')];
+            }else {
+                $word['emotion'] = '中性';
+                $word['emotion_type'] = 'neutral';
+            }
+            if (!in_array($role, $existed_roles)) {
+                $existed_role_info[$role] = [
+                    'timbre_type' => $word['voice_type'],
+                    'timbre_name' => $word['voice_name'],
+                ];
+            }
+
+            // $word['voice_name'] = $role_timbre[$role]['timbre_name'];
+            // $word['voice_type'] = $role_timbre[$role]['timbre_type'];
+            // $word['speed_ratio'] = mt_rand(9,11)/10;
+            // $word['loudness_ratio'] = mt_rand(5,12)/10;
+            // $word['emotion_scale'] = mt_rand(1,5);
+        }
+        $generate_json = json_encode($words, 256);
+
+        try {
+            DB::beginTransaction();
+            $role_info = json_encode($existed_role_info, 256);
+            $boolen = DB::table('mp_book_version')->where('bid', $bid)->where('id', $version_id)->update(['role_info' => $role_info, 'updated_at' => date('Y-m-d H:i:s')]);
+            if (!$boolen) {
+                DB::rollBack();
+                Utils::throwError('20003:更新角色信息失败');
+            }
+
+            $boolen1 = DB::table('mp_chapter_audios')->where('bid', $bid)->where('version_id', $version_id)->where('cid', $cid)->update(['generate_status'=>'执行中', 'generate_json' => $generate_json, 'updated_at' => date('Y-m-d H:i:s')]);
+            if (!$boolen1) {
+                DB::rollBack();
+                Utils::throwError('20003:更新生成数据失败');
+            }
+        } catch (\Exception $e) {
+            DB::rollBack();
+            Utils::throwError('20003:'.$e->getMessage());
+        }
+        DB::commit();
+        return true;
+    }
+
     public function timbreList($data) {
         $gender = getProp($data, 'gender');
         $timbre_name = getProp($data, 'timbre_name');
         
-        $query = DB::table('mp_timbres')->where('is_enabled', 1)->select('timbre_name', 'timbre_type', 'gender');
+        $query = DB::table('mp_timbres')->where('is_enabled', 1)->select('timbre_name as voice_name', 'timbre_type as voice_type', 'gender');
         if ($gender) {
             $query->where('gender', $gender);
         }
@@ -101,7 +168,7 @@ class DeepSeekService
         }
         $list = $query->get()->map(function ($value) {
             $value = (array)$value;
-            $value['timbre_name'] = str_replace('(多情感)', '', $value['timbre_name']);
+            $value['voice_name'] = str_replace('(多情感)', '', $value['voice_name']);
             return $value;
         })->toArray();
 

+ 31 - 3
app/Transformer/Book/BookTransformer.php

@@ -10,7 +10,7 @@ use Vinkla\Hashids\Facades\Hashids;
 
 class BookTransformer
 {
-    // 用户列表
+    // 书籍列表
     public function newBuildBookList($data): array
     {
         return [
@@ -31,14 +31,14 @@ class BookTransformer
                 'origin_book_name'          => getProp($item, 'origin_book_name') ? getProp($item, 'origin_book_name') : getProp($item, 'book_name'),
                 'status'                    => getProp($item, 'status'),
                 'status_info'               => getProp($item, 'status') == 1 ? '已完结' : '连载中',
-                'version_count'             => getProp($item, 'version_count'),   
+                'version_count'             => getProp($item, 'version_count'),
             ];
         }
 
         return $result;
     }
 
-    // 用户列表
+    // 章节列表
     public function newBuildChapterList($data): array
     {
         return [
@@ -61,6 +61,34 @@ class BookTransformer
                 'size'              => getProp($item, 'size'),
                 'generate_status'   => getProp($item, 'generate_status'),
                 'audio_url'         => getProp($item, 'audio_url'),
+                'remark'            => getProp($item, 'remark'),
+            ];
+        }
+
+        return $result;
+    }
+
+    // 版本列表
+    public function newBuildVersionList($data): array
+    {
+        return [
+            'meta' => getMeta($data),
+            'list'  => $this->newEachVersionList($data),
+        ];
+    }
+
+    private function newEachVersionList($list): array
+    {
+        $result = [];
+        if (empty($list)) return $result;
+
+        foreach ($list as $item) {
+            $result[] = [
+                'version_id'        => getProp($item, 'id'),
+                'version_name'      => getProp($item, 'version_name'),
+                'bid'               => getProp($item, 'bid'),
+                'book_name'         => getProp($item, 'book_name'),
+                'created_at'        => getProp($item, 'created_at'),
             ];
         }
 

+ 9 - 3
routes/api.php

@@ -19,17 +19,23 @@ use Illuminate\Support\Facades\Route;
 Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], function () {
 
     Route::group(['prefix' => 'book'], function () {
+        // 书籍管理
         Route::get('list', [BookController::class, 'bookList']);
-        Route::get('version', [BookController::class, 'bookVersion']);
         Route::get('all', [BookController::class, 'allBooks']);
-        Route::get('addVersion', [BookController::class, 'addBookVersion']);
         Route::get('chapterList', [BookController::class, 'chapterList']);
         Route::get('chapterContent', [BookController::class, 'chapterContent']);
+
+        // 版本管理
+        Route::get('addVersion', [BookController::class, 'addBookVersion']);
+        Route::get('bookVersion', [BookController::class, 'bookVersion']);
+        Route::get('versionList', [BookController::class, 'versionList']);
+        // Route::get('taskList', [BookController::class, 'taskList']);
     });
 
     Route::group(['prefix' => 'deepseek'], function () {
-        Route::get('timbreList', [DeepSeekController::class, 'timbreList']);
         Route::post('chatWithReasoner', [DeepSeekController::class, 'chatWithReasoner']);
+        Route::get('timbreList', [DeepSeekController::class, 'timbreList']);
+        Route::post('addGenerateTask', [DeepSeekController::class, 'addGenerateTask']);
     });
     
 });