Commit d68561b1 authored by 刘小敏's avatar 刘小敏

数据中心js优化;3D试戴AI指令根据不同佩戴方式的耳饰区分AI指令;

parent 0c953e5c
......@@ -64,14 +64,18 @@ class AiImgGen extends BaseJob
return false;
}
$this->debug_log('[AI图片异步队列] AI生成图片接口入参 :用户ID:'. $user_id .' tryondata:'. json_encode($tryOn->toArray()));
// 合成AI图
$aiService = new Ai();
$res = $aiService->generateImage($tryOn->toArray(), $user_id, 'url');
$this->debug_log('[AI图片异步队列] AI生成图片接口出参 :用户ID:'. $user_id .' res:'. json_encode($res));
// 我的试戴
if ($res['code'] === 0) {
AiTryOnModel::where('id', $id)->where('user_id', $user_id)->update(['ai_status' => 2, 'ai_err_msg' => $res['msg']]);
$job->delete();
return false;
......
......@@ -581,4 +581,30 @@ class GoodsService
return $count > 0 ? 1 : 0;
}
/**
* 判断商品分类是否在AI试戴的分类ID数组中
*
* @param string $cateIds 商品分类IDS
* @param string $allowCateIds AI允许试戴分类IDS
* return int
*/
public function isCateAllowedAi($cateIds, $allowCateIds)
{
if (empty($cateIds) || empty($allowCateIds)) {
return 0;
}
$cateIdArray = array_map('trim', explode(',', $cateIds));
$allowIdArray = array_map('trim', explode(',', $allowCateIds));
foreach ($cateIdArray as $cateId) {
if (in_array($cateId, $allowIdArray)) {
return 1;
}
}
return 0;
}
}
......@@ -4,6 +4,8 @@ namespace addons\shopro\service\user;
use addons\shopro\library\HttpClient as Http;
use addons\shopro\notification\ai\AiVideoSuccess;
use addons\shopro\service\commission\Goods;
use addons\shopro\service\goods\GoodsService;
use app\admin\model\shopro\AiTryon as AiTryOnModel;
use app\admin\model\shopro\user\User;
use think\Config;
......@@ -119,6 +121,50 @@ class Ai
return 0;
}
}
/**
* 根据商品分类判断AI耳饰类型
*
* 根据商品分类ID判断应该使用什么类型的AI指令
* - earlobe: 耳垂款式,AI指令戴到耳垂正中间
* - clip: 耳骨夹款式,戴到耳骨上
* - mix: 叠戴耳饰,根据款式叠戴到耳垂和耳廓上
*
* @param int $goodsId 商品ID
* @return string 耳饰类型:earlobe / clip / mix
*/
public function getAiEarringType($goodsId)
{
$goodsService = new GoodsService();
$goods = $goodsService->up()->whereIds($goodsId)->find();
if (!$goods || empty($goods->category_ids)) {
return 'earlobe';
}
$categoryIds = $goods->category_ids;
$allowCateEarlobe = config('shopro.ai_earlobe') ?: '';
$allowCateClip = config('shopro.ai_clip') ?: '';
$allowCateMix = config('shopro.ai_mix') ?: '';
$prompt_clip = '1:1 原样复刻图 1 人物容貌、姿势、场景与光影色调。将图 2 的耳骨夹精准佩戴在耳廓外侧合适位置,紧密贴合耳部轮廓、比例适配,佩戴稳固,无悬空、变形、拉伸、重复问题。人像轻度自然修肤,保留皮肤原生细节,五官比例不变,杜绝网红假脸与 AI 建模违和感。仅外露耳朵佩戴饰品,隐耳不添加配饰。画质高清细腻,统一原图风格,呈现真实珠宝实拍效果。';
$prompt_mix = '1:1 原样复刻图 1 人物容貌、姿势、场景与光影色调。将图 2 的叠戴耳饰组合佩戴于耳部不同位置,错落搭配、贴合耳部肌肤,整体比例协调,佩戴稳固,无悬空、变形、拉伸、错位问题。人像轻度自然修肤,保留皮肤原生细节,五官比例不变,杜绝网红假脸与 AI 建模违和感。仅外露耳朵佩戴饰品,隐耳不添加配饰。画质高清细腻,统一原图风格,呈现真实珠宝实拍效果。';
$prompt_earlobe = '1:1 原样复刻图 1 人物容貌、姿势、场景与光影色调。将图 2 的耳坠(耳钉式)精准佩戴在耳垂正中,贴合肌肤、比例适配,针部完全穿过耳垂,无悬空变形拉伸重复问题。人像轻度自然修肤,保留皮肤原生细节,五官比例不变,杜绝网红假脸与 AI 建模违和感。仅外露耳朵佩戴饰品,隐耳不添加配饰。画质高清细腻,统一原图风格,呈现真实珠宝实拍效果。';
if ($goodsService->isCateAllowedAi($categoryIds, $allowCateClip)) {
return $prompt_clip;
}
if ($goodsService->isCateAllowedAi($categoryIds, $allowCateMix)) {
return $prompt_mix;
}
if ($goodsService->isCateAllowedAi($categoryIds, $allowCateEarlobe)) {
return $prompt_earlobe;
}
return $prompt_earlobe;
}
/**
* AI 生成图片
......@@ -130,16 +176,19 @@ class Ai
public function generateImage($param = [], $userId = 0, $response_format = 'b64_json')
{
try {
$url = $this->ark_host . '/api/v3/images/generations';
// $prompt = '严格复刻图片1 人物所有样貌特征、肢体姿势、场景背景、光影氛围一丝不变,精准匹配图片2 耳饰饰品佩戴到人物对应耳部位置,饰品贴合肌肤轮廓、尺寸比例适配、定点标准不跑偏、不悬空不变形不拉伸不重复生成;人物做原生自然轻度磨皮,柔和流畅瘦脸修容,保留真实皮肤纹理与面部细节,拒绝过度美颜、拒绝网红假脸、拒绝锥脸畸形,五官原生比例不改动,无建模感、无生硬 AI 违和感,整体色调光影统一,高清超清细节拉满,纯真人电商珠宝实拍大片质感,原图风格画质全程不变。';
// $prompt = '严格复刻图 1 人物样貌、姿势、背景与光影,将图 2 耳饰精准贴合佩戴于耳部,比例适配贴合不形变。人物自然轻磨皮柔和修脸,保留原生五官与皮肤细节,不假脸无 AI 违和感,色调光影统一,高清实拍珠宝电商质感。';
// 单耳戴
$prompt = '1:1 原样复刻图 1 人物容貌、姿势、场景与光影色调。将图 2 的耳坠(耳钉式)精准佩戴在耳垂正中,贴合肌肤、比例适配,针部完全穿过耳垂,无悬空变形拉伸重复问题。人像轻度自然修肤,保留皮肤原生细节,五官比例不变,杜绝网红假脸与 AI 建模违和感。仅外露耳朵佩戴饰品,隐耳不添加配饰。画质高清细腻,统一原图风格,呈现真实珠宝实拍效果。';
$prompt = $this->getAiEarringType($param['goods_id']);
// $prompt = '1:1 原样复刻图 1 人物容貌、姿势、场景与光影色调。将图 2 的耳坠(耳钉式)精准佩戴在耳垂正中,贴合肌肤、比例适配,针部完全穿过耳垂,无悬空变形拉伸重复问题。人像轻度自然修肤,保留皮肤原生细节,五官比例不变,杜绝网红假脸与 AI 建模违和感。仅外露耳朵佩戴饰品,隐耳不添加配饰。画质高清细腻,统一原图风格,呈现真实珠宝实拍效果。';
// 单耳照 漏两耳戴
// 第一版 精细指令
// $prompt = '严格复刻图片1 人物所有样貌特征、肢体姿势、场景背景、光影氛围一丝不变,精准匹配图片2 耳饰饰品佩戴到人物对应耳部位置,饰品贴合肌肤轮廓、尺寸比例适配、定点标准不跑偏、不悬空不变形不拉伸不重复生成;人物做原生自然轻度磨皮,柔和流畅瘦脸修容,保留真实皮肤纹理与面部细节,拒绝过度美颜、拒绝网红假脸、拒绝锥脸畸形,五官原生比例不改动,无建模感、无生硬 AI 违和感,整体色调光影统一,高清超清细节拉满,纯真人电商珠宝实拍大片质感,原图风格画质全程不变。';
// 第二版 简化高效指令
// $prompt = '严格复刻图 1 人物样貌、姿势、背景与光影,将图 2 耳饰精准贴合佩戴于耳部,比例适配贴合不形变。人物自然轻磨皮柔和修脸,保留原生五官与皮肤细节,不假脸无 AI 违和感,色调光影统一,高清实拍珠宝电商质感。';
// 第三版 单耳照 漏两耳戴 精细指令
// $prompt = '1:1 复刻图 1 人物五官样貌、肢体姿态、场景背景与光影色调,全程无改动。将图 2 耳饰精准佩戴在人物耳垂正中,饰品贴合耳部肌肤,比例尺寸协调,位置端正不偏移,杜绝悬空、变形、拉伸、重复生成瑕疵。人像仅做自然轻度磨皮、柔和修容,保留原生皮肤纹理与面部细节,五官比例不变,杜绝网红假脸、锥脸畸形与 AI 建模违和感。若原图仅单侧露耳,需调整人物角度,露出另一只耳朵并佩戴同款耳饰,保证双侧佩戴对称自然。画质高清细腻,整体光影色调与原图统一,呈现真实电商珠宝实拍质感。';
$url = $this->ark_host . '/api/v3/images/generations';
$params = [
'headers' => [
'Authorization' => 'Bearer ' . $this->api_key,
......@@ -247,7 +296,8 @@ class Ai
// $prompt = '人物自然微动,轻微转头,微笑,眨眼,动作柔和流畅,画面稳定不闪烁、不抖动、不扭曲,真实人像质感,高清清晰,饰品完美展示,整体自然优雅,无变形、无穿模、无悬浮';
// $prompt = '人物轻动转头,自然微笑眨眼,动作流畅柔和,画面稳定无抖动扭曲,真人高清质感,饰品完整清晰展示,整体优雅自然,无变形穿模悬浮';
// $prompt = '人物微动转头微笑,不要眨眼,动作顺滑画面稳定,高清真人质感,饰品清晰展示,无变形悬浮穿模';
$prompt = '人物全程全脸出镜,真人实拍质感,自然轻微转头浅笑,双目全程不眨眼,饰品完美展示,画面流畅稳定无卡顿,饰品轮廓细节清晰锐利,杜绝变形、悬浮、穿模问题,整体画质高清细腻。';
// $prompt = '人物全程全脸出镜,真人实拍质感,自然轻微转头浅笑,双目全程不眨眼,饰品完美展示,画面流畅稳定无卡顿,饰品轮廓细节清晰锐利,杜绝变形、悬浮、穿模问题,整体画质高清细腻。';
$prompt = '人物自然微动,轻微转头,微笑,动作柔和流畅,画面稳定不闪烁、不抖动、不扭曲,真实人像质感,高清清晰,饰品完美展示,整体自然优雅,无变形、无穿模、无悬浮';
$params = [
'headers' => [
'Authorization' => 'Bearer ' . $this->api_key,
......@@ -304,4 +354,6 @@ class Ai
];
}
}
}
......@@ -321,6 +321,9 @@ return [
'api_host' => Env::get('app.api_host', ''),
// 允许试戴的商品分类IDS
'allow_tryon_cate' => Env::get('app.allow_tryon_cate', ''),
'ai_earlobe' => Env::get('app.ai_earlobe', ''),
'ai_clip' => Env::get('app.ai_clip', ''),
'ai_mix' => Env::get('app.ai_mix', ''),
],
];
......@@ -894,7 +894,6 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'moment'], function (
return {
onChangeDateTime,
statistics,
chartOption,
initChart,
drawX,
......@@ -903,8 +902,6 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'moment'], function (
loadStatistics,
updateGmvChart,
updateOrderChart,
loadFunnel,
loadPriceDistribution,
loadRecentOrders,
refreshAllData,
switchPeriod,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment