where('key', 'plot')->value('value'); if (!$plot) { return Response::fail('系统错误,请联系管理员#'); } if (Auth::$user->diamond < $plot) { return Response::fail('钻石不够了,请先充值'); } $roleId = $request->post('roleId', 0); if ($roleId) { $role = UserRole::query()->find($roleId); if (!$role) { return Response::fail('没有该角色'); } } else { $role = UserRole::query()->create([ 'user_id' => Auth::$userId, 'name' => $request->post('name', ''), 'sex' => $request->post('sex', ''), 'age' => $request->post('age', ''), 'star' => $request->post('star', ''), 'level' => $request->post('level', ''), // 'is_piny' => $request->post('is_piny', 1), ]); if (!$role) { return Response::fail('提交失败,请稍后再试!'); } } User::query()->where('id', Auth::$userId)->decrement('diamond', $plot); $task = TaskList::query()->create([ 'user_id' => Auth::$userId, 'role_id' => $role->id, 'image' => $request->post('image', ''), 'surplus_diamond' => Auth::$user->diamond - $plot, 'nickname' => 'AI绘本生成', 'plot' => $plot, 'is_piny' => $request->post('pinYin', 1), ]); if (!$task) { return Response::fail('任务提交失败'); } return Response::success(['id' => $task->id], '提交成功,请稍等'); } catch (\Exception $exception) { LogHelper::exceptionLog($exception, $this->code); return Response::fail($exception->getMessage()); } } /** * 获取任务详情. * * @return \Illuminate\Http\JsonResponse */ public function getTaskDetail(Request $request) { try { $id = $request->get('id', 0); return Response::success(TaskList::query()->where('user_id', Auth::$userId)->find($id)); } catch (\Exception $exception) { LogHelper::exceptionLog($exception, $this->code); return Response::fail($exception->getMessage()); } } /** * 获取字数. * * @return int|mixed */ private function getBuildCountString($level = 1) { $string = Config::query()->where('key', 'class_count')->first()->toArray(); foreach ($string['value'] ?? [] as $value) { if ($level == $value['lv']) { return $value['count']; } } return 200; } /** * 生成故事. */ public function buildStory(Request $request): \Illuminate\Http\JsonResponse { try { $task = TaskList::query()->with('role')->where('state', 0)->inRandomOrder()->first(); if (!$task) { return Response::fail('暂无任务'); } $key = []; // $keyword = Keyword::query()->pluck('keyword'); // foreach ($keyword as $value) { // $key[] = $value; // } // $keyword = implode(',', $key); $keyword = Config::query()->where('key', 'prompt_gushi')->value('value'); $task->state = 1; $task->save(); Log::warning('这个是当前的次数:' . $this->getBuildCountString($task->level)); $prompt = "一个{$task->role->sex},叫{$task->role->name},{$task->role->age}岁。{$keyword},要求不低于{$this->getBuildCountString($task->role->level)}字。备注:不要加什么特殊符号只需要正常的逗号句号叹号这些。"; $messages[] = ['role' => 'user', 'content' => $prompt]; $data = [ 'messages' => $messages, ]; $postData = json_encode($data); $complete = $this->host($postData); $task->init_content = $complete['result']; $task->save(); return Response::success($complete); } catch (\Exception $exception) { LogHelper::exceptionLog($exception, $this->code); return Response::fail($exception->getMessage()); } } /** * 生成标题. * * @return \Illuminate\Http\JsonResponse */ public function buildTitle(Request $request) { try { $task = TaskList::query()->with('role')->where('state', 1)->inRandomOrder()->first(); if (!$task) { return Response::fail('暂无任务'); } $task->state = 2; $task->save(); $prompt = $task->init_content . '。将这段童话故事生成一个标题,标题不能有特殊符号,只需要纯文字标题即可,不需要其他任何文字,标题文字控制在10个字以内。不能超过10个字'; $messages[] = ['role' => 'user', 'content' => $prompt]; $data = [ 'messages' => $messages, ]; $postData = json_encode($data); $complete = $this->host($postData); // $task->state = 2; $task->title = $complete['result']; $task->save(); return Response::success($complete); } catch (\Exception $exception) { LogHelper::exceptionLog($exception, $this->code); return Response::fail($exception->getMessage()); } } /** * 生成关键词. * * @return \Illuminate\Http\JsonResponse */ public function buildKeyword(Request $request) { try { $task = TaskList::query()->with('role')->where('state', 2)->inRandomOrder()->first(); if (!$task) { return Response::fail('暂无任务'); } $keyword = Config::query()->where('key', 'prompt_keyword')->value('value'); $prompt = $task->init_content . $keyword; $messages[] = ['role' => 'user', 'content' => $prompt]; $data = [ 'messages' => $messages, ]; $task->state = 3; $task->save(); $postData = json_encode($data); $complete = $this->host($postData); // $task->state = 3; $task->keyword = $complete['result']; $task->save(); return Response::success($complete); } catch (\Exception $exception) { LogHelper::exceptionLog($exception, $this->code); return Response::fail($exception->getMessage()); } } /** * 翻译英文. */ private function toEnglish($prompt) { $keyword = Config::query()->where('key', 'prompt_style')->value('value'); $prompt = $prompt . $keyword; $promptTo = '我希望你能担任英语翻译、拼写校对和修辞改进的角色。我会将翻译的结果用于如stable diffusion、midjourney等绘画场景生成图片,语言要求尽量优美。我会用任何语言和你交流,你会识别语言,将其翻译为英语并仅回答翻译的最终结果,不要写解释。我的第一句话是:' . $prompt . '。请立刻翻译,不要回复其它内容。'; $messages[] = ['role' => 'user', 'content' => $promptTo]; $data = [ 'messages' => $messages, ]; $postData = json_encode($data); $complete = $this->host($postData); return $complete['result']; } /** * 提交sd生成插图. * * @return \Illuminate\Http\JsonResponse */ public function buildSd(Request $request) { try { $task = TaskList::query()->with('role')->where('state', 3)->inRandomOrder()->first(); if (!$task) { return Response::fail('暂无任务'); } $task->state = 4; $task->save(); $keyword = $this->toEnglish($task->keyword); $param = ['name' => '甜瓜(动漫风格)', 'init_image' => '', 'prompt' => $keyword, 'width' => '512', 'height' => '512', 'guidance_scale' => '7', 'samples' => '1', 'model_id' => '3', 'scheduler' => 'DDPMScheduler', 'type' => 'text2img', 'num_inference_steps' => '30', 'keywords' => $keyword, ]; $result = (new Helper())->opensd($param); $result = json_decode($result, true); Log::warning('这个是SD回调信息:' . json_encode($result, 256)); if (isset($result['data']['id'])) { $task->sd_id = $result['data']['id']; } else { $task->state = 3; } $task->save(); return Response::success($result['data']); } catch (\Exception $exception) { LogHelper::exceptionLog($exception, $this->code); return Response::fail($exception->getMessage()); } } /** * 查询生成进度. * * @return \Illuminate\Http\JsonResponse */ public function getOpensdDetail(Request $request) { $task = TaskList::query()->where('state', 4)->inRandomOrder()->first(); if (!$task) { return $this->error('暂无任务'); } $res = (new Helper())->opensdDetail($task->sd_id); $res = @json_decode($res, true); if (200 != $res['code']) { return Response::fail($res['msg']); } if ('fail' == $res['data']['state']) { $task->state = 3; $task->desc = $res['data']['fail_reason']; } $task->save(); if ('success' == $res['data']['state']) { $path = $this->saveImage($res['data']['gen_img']); $task->sd_image = $path; $task->state = 5; $task->save(); } return $this->success('操作成功', $res['data']); } /** * 获取品牌排版. * * @return \Illuminate\Http\JsonResponse */ public function buildPinyin(Request $request) { try { $task = TaskList::query()->where('state', 5)->inRandomOrder()->first(); if (!$task) { return $this->error('暂无任务'); } if (empty($file_name)) { $file_name = md5(time()) . '.png'; } $path = public_path() . '/images/' . $file_name; $shell = 'wkhtmltoimage https://hb.swdz.com/api/ai/Pinyin?id=' . $task->id . ' ' . $path; exec($shell, $result, $status); if ($status) { $this->exit_out('生成图片失败', ['生成图片失败' => [$shell, $result, $status]]); } $domain = request()->getScheme() . '://' . request()->getHost(); $pdfPath = $domain . '/images/' . $file_name; $task->image_path = $pdfPath; $result = $this->extracted($task); $task->pinyin_content = $result; $task->state = 6; $task->save(); return Response::success($result); } catch (\Exception $exception) { LogHelper::exceptionLog($exception, $this->code); return Response::fail($exception->getMessage()); } } /** * 下载PDF. * * @return \Illuminate\Http\JsonResponse */ public function downloadPdf(Request $request) { try { $id = $request->input('id', 0); $task = TaskList::query()->find($id); if (!$task) { return Response::fail('没有该任务'); } if (!empty($task->pdf_path)) { return Response::success(['url' => $task->pdf_path]); } if (empty($file_name)) { $file_name = md5(time()) . '.pdf'; } $path = public_path() . '/pdf/' . $file_name; $shell = 'wkhtmltopdf https://hb.swdz.com/api/ai/Pinyin?id=' . $task->id . ' ' . $path; exec($shell, $result, $status); if ($status) { $this->exit_out('生成PDF失败', ['生成PDF失败' => [$shell, $result, $status]]); } $domain = request()->getScheme() . '://' . request()->getHost(); $pdfPath = $domain . '/pdf/' . $file_name; $task->pdf_path = $pdfPath; $task->save(); return Response::success(['url' => $pdfPath]); } catch (\Exception $exception) { LogHelper::exceptionLog($exception, $this->code); return Response::fail($exception->getMessage()); } } private function splitChineseCharacters($inputString, $type = 0) { if (0 == $type) { $inputString = str_replace("\n", '', $inputString); } $inputString = str_replace('“', '', $inputString); $inputString = str_replace('”', '', $inputString); // $inputString = preg_replace('/[^\w\s-]+/u', '', $inputString); $length = mb_strlen($inputString, 'utf-8'); $result = []; for ($i = 0; $i < $length; $i++) { $result[] = mb_substr($inputString, $i, 1, 'utf-8'); } return $result; // return $inputString; } public function Pinyin(Request $request) { try { $id = $request->input('id'); $task = TaskList::query()->find($id); $result = $this->extracted($task); return view('pdf', ['data' => $result, 'img' => $task->image, 'title' => $task->title]); } catch (\Exception $exception) { LogHelper::exceptionLog($exception, $this->code); return Response::fail($exception->getMessage()); } } public function containsPunctuation($str) { // 定义要检测的符号 $punctuation = '/[,。!、]/u'; // 中文逗号、中文句号、中文感叹号 // 使用 preg_match 函数进行匹配 return 1 === preg_match($punctuation, $str); } public function generate_pdf($html_path = '', $file_name = '') { if (empty($file_name)) { $file_name = md5(time()) . '.pdf'; } $path = public_path() . '/pdf/' . $file_name; var_dump($path); exit; $shell = 'wkhtmltopdf --outline --minimum-font-size 9 ' . $html_path . ' ' . $path; exec($shell, $result, $status); if ($status) { $this->exit_out('生成PDF失败', ['生成PDF失败' => [$shell, $result, $status]]); } $domain = request()->getScheme() . '://' . request()->getHost(); return $domain . '/pdf/' . $file_name; } public function exit_out($msg, $exceptionData = false, $code = 1, $data = []) { $out = ['code' => $code, 'msg' => $msg, 'data' => $data]; if (false !== $exceptionData) { $this->trace([$msg => $exceptionData], 'error'); } $json = json_encode($out, JSON_UNESCAPED_UNICODE); throw new ApiException($json); } public function trace($log = '', $level = 'info') { Log::log($level, $log); } /** * 保存图片. * * @return \Illuminate\Http\JsonResponse|string */ private function saveImage($image_url) { $imageContent = file_get_contents($image_url); $imageDir = $_SERVER['DOCUMENT_ROOT'] . '/static/images/' . date('Ymd') . '/'; $imageName = uniqid() . time() . '_image.png'; $imagePath = $imageDir . $imageName; if (!is_dir($imageDir)) { mkdir($imageDir, 0777, true); } if (false !== $imageContent) { $savedImages = file_put_contents($imagePath, $imageContent); if (false !== $savedImages) { return $_SERVER['HTTP_HOST'] . '/static/images/' . date('Ymd') . '/' . $imageName; } return false; } return false; } /** * 执行请求 */ private function host($postData) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => getenv('BAIDU_ERNIE_BOT40_URL') . '?access_token=' . Helper::getAccessToken(), CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData, ]); $res = curl_exec($ch); curl_close($ch); Log::warning('请求头:' .$postData); Log::warning('请求返回值:' .$res); return json_decode(trim($res), true); } public function extracted($result, $type = 0, $sdImage = ''): string { if (0 == $type) { $inputString = $result->init_content; $sdImage = $result->sd_image; } else { $inputString = $result; } $inputString = str_replace('“', '', $inputString); $inputString = str_replace('”', '', $inputString); $inputString = str_replace('——', '', $inputString); $inputString = str_replace('—', '', $inputString); $inputStringFor = $this->splitChineseCharacters($inputString, 1); $arr = []; $i = 0; foreach ($inputStringFor as $key => $value) { if ("\n" == $value) { $arr[] = $key - $i; $i++; } } $splitCharacters = $this->splitChineseCharacters($inputString); $pinyin = Pinyin::Sentence($inputString)->toArray(); $string = ''; $count = 0; foreach ($pinyin as $value) { $count += mb_strlen($value); } $img = ''; $stringCount = 0; foreach ($pinyin as $key => $value) { if ($this->containsPunctuation($value)) { $value = ' '; } $stringCount += mb_strlen($value); if (in_array($count - $stringCount, [158, 159, 160, 161, 162, 163]) && !strstr($string, 'is_piny){ $string = $string . "{$value}{$splitCharacters[$key]}

"; }else{ $string = $string . "{$splitCharacters[$key]}

"; } } else { $style = ''; // if (in_array($key, $arr) || 0 == $key) { // $style = 'style="margin-left: 5rem"'; // } if ($result->is_piny){ $string = $string . '{$value}{$splitCharacters[$key]}"; }else{ $string = $string . '{$splitCharacters[$key]}"; } } } return $string; } }