|
|
@@ -1151,7 +1151,7 @@ class AIImageGenerationService
|
|
|
];
|
|
|
}
|
|
|
|
|
|
- // 先获取表中是否已有该url(仅限智真AI来源的素材)
|
|
|
+ // 先获取表中是否已有该url(仅限智帧AI来源的素材)
|
|
|
$asset = DB::table('mp_assets')->where('url', $params['url'])->where('source_type', 'zhizhen')->first();
|
|
|
if ($asset) {
|
|
|
return [
|
|
|
@@ -1173,7 +1173,7 @@ class AIImageGenerationService
|
|
|
if (empty($apiKey)) {
|
|
|
return [
|
|
|
'code' => 1002,
|
|
|
- 'msg' => '智真AI API KEY未配置,请检查环境变量ZHIZHEN_AI_SK',
|
|
|
+ 'msg' => '智帧AI API KEY未配置,请检查环境变量ZHIZHEN_AI_SK',
|
|
|
'data' => null
|
|
|
];
|
|
|
}
|
|
|
@@ -1192,9 +1192,9 @@ class AIImageGenerationService
|
|
|
$requestData['group_id'] = $params['group_id'];
|
|
|
}
|
|
|
|
|
|
- dLog('generate')->info('智真AI创建素材请求参数: ', $requestData);
|
|
|
+ dLog('generate')->info('智帧AI创建素材请求参数: ', $requestData);
|
|
|
|
|
|
- // 调用智真AI API
|
|
|
+ // 调用智帧AI API
|
|
|
$response = $this->httpClient->post($apiUrl . '/api/v1/asset/create', [
|
|
|
'headers' => [
|
|
|
'X-Api-Key' => $apiKey,
|
|
|
@@ -1204,8 +1204,8 @@ class AIImageGenerationService
|
|
|
]);
|
|
|
|
|
|
$responseData = json_decode($response->getBody()->getContents(), true);
|
|
|
- dLog('generate')->info('智真AI创建素材响应: ', $responseData);
|
|
|
- logDB('generate', 'info', '智真AI创建素材', ['params' => $requestData, 'response' => $responseData]);
|
|
|
+ dLog('generate')->info('智帧AI创建素材响应: ', $responseData);
|
|
|
+ logDB('generate', 'info', '智帧AI创建素材', ['params' => $requestData, 'response' => $responseData]);
|
|
|
|
|
|
if ($responseData['code'] !== 0) {
|
|
|
return [
|
|
|
@@ -1270,7 +1270,7 @@ class AIImageGenerationService
|
|
|
];
|
|
|
}
|
|
|
|
|
|
- // 先获取表中是否已有该素材(仅限智真AI来源的素材)
|
|
|
+ // 先获取表中是否已有该素材(仅限智帧AI来源的素材)
|
|
|
$assetInfo = DB::table('mp_assets')->where('asset_id', $assetId)->where('source_type', 'zhizhen')->first();
|
|
|
if ($assetInfo) {
|
|
|
$assetInfo = (array)$assetInfo;
|
|
|
@@ -1294,14 +1294,14 @@ class AIImageGenerationService
|
|
|
if (empty($apiKey)) {
|
|
|
return [
|
|
|
'code' => 1002,
|
|
|
- 'msg' => '智真AI API KEY未配置,请检查环境变量ZHIZHEN_AI_SK',
|
|
|
+ 'msg' => '智帧AI API KEY未配置,请检查环境变量ZHIZHEN_AI_SK',
|
|
|
'data' => null
|
|
|
];
|
|
|
}
|
|
|
|
|
|
- dLog('generate')->info('智真AI查询素材: ' . $assetId);
|
|
|
+ dLog('generate')->info('智帧AI查询素材: ' . $assetId);
|
|
|
|
|
|
- // 调用智真AI API
|
|
|
+ // 调用智帧AI API
|
|
|
$response = $this->httpClient->post($apiUrl . '/api/v1/asset/get', [
|
|
|
'headers' => [
|
|
|
'X-Api-Key' => $apiKey,
|
|
|
@@ -1313,8 +1313,8 @@ class AIImageGenerationService
|
|
|
]);
|
|
|
|
|
|
$responseData = json_decode($response->getBody()->getContents(), true);
|
|
|
- dLog('generate')->info('智真AI查询素材响应: ', $responseData);
|
|
|
- logDB('generate', 'info', '智真AI查询素材', ['asset_id' => $assetId, 'response' => $responseData]);
|
|
|
+ dLog('generate')->info('智帧AI查询素材响应: ', $responseData);
|
|
|
+ logDB('generate', 'info', '智帧AI查询素材', ['asset_id' => $assetId, 'response' => $responseData]);
|
|
|
|
|
|
if ($responseData['code'] !== 0) {
|
|
|
return [
|
|
|
@@ -1495,7 +1495,7 @@ class AIImageGenerationService
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 处理智真AI的参考图片转素材
|
|
|
+ * 处理智帧AI的参考图片转素材
|
|
|
*
|
|
|
* @param array $referenceImages 参考图片URL数组
|
|
|
* @param string &$fullPrompt 完整提示词(引用传递,用于删除失败图片的标记)
|
|
|
@@ -1503,35 +1503,75 @@ class AIImageGenerationService
|
|
|
*/
|
|
|
public function processReferenceImagesToAssets(array $referenceImages, string &$fullPrompt): array
|
|
|
{
|
|
|
+ return $this->processReferenceAssetsToZhizhenAssets($referenceImages, MpAsset::TYPE_IMAGE, '图片', '图片', $fullPrompt);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理智帧AI的参考视频转素材
|
|
|
+ *
|
|
|
+ * @param array $referenceVideos 参考视频URL数组
|
|
|
+ * @param string &$fullPrompt 完整提示词(引用传递,用于删除失败视频的标记)
|
|
|
+ * @return array 返回素材ID数组
|
|
|
+ */
|
|
|
+ public function processReferenceVideosToAssets(array $referenceVideos, string &$fullPrompt): array
|
|
|
+ {
|
|
|
+ return $this->processReferenceAssetsToZhizhenAssets($referenceVideos, MpAsset::TYPE_VIDEO, '视频', '视频', $fullPrompt);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理智帧AI的参考音频转素材
|
|
|
+ *
|
|
|
+ * @param array $referenceAudios 参考音频URL数组
|
|
|
+ * @param string &$fullPrompt 完整提示词(引用传递,用于删除失败音频的标记)
|
|
|
+ * @return array 返回素材ID数组
|
|
|
+ */
|
|
|
+ public function processReferenceAudiosToAssets(array $referenceAudios, string &$fullPrompt): array
|
|
|
+ {
|
|
|
+ return $this->processReferenceAssetsToZhizhenAssets($referenceAudios, MpAsset::TYPE_AUDIO, '音频', '音频', $fullPrompt);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理智帧AI的参考素材转素材(图片/视频/音频通用方法)
|
|
|
+ *
|
|
|
+ * @param array $urls 参考素材URL数组
|
|
|
+ * @param string $assetType 素材类型(Image/Video/Audio)
|
|
|
+ * @param string $label 素材中文名(图片/视频/音频),用于日志与素材命名
|
|
|
+ * @param string $tagName 提示词标记名(图片/视频/音频),用于 <{tagName}N> 标记的清理
|
|
|
+ * @param string &$fullPrompt 完整提示词(引用传递,用于删除失败素材的标记)
|
|
|
+ * @return array 返回素材ID数组(asset://格式)
|
|
|
+ */
|
|
|
+ private function processReferenceAssetsToZhizhenAssets(array $urls, string $assetType, string $label, string $tagName, string &$fullPrompt): array
|
|
|
+ {
|
|
|
$assetIds = [];
|
|
|
- $failedIndexes = []; // 记录失败的图片序号
|
|
|
+ $failedIndexes = []; // 记录失败的素材序号
|
|
|
|
|
|
- foreach ($referenceImages as $index => $imageUrl) {
|
|
|
- $imageIndex = $index + 1; // 图片序号从1开始
|
|
|
+ foreach ($urls as $index => $url) {
|
|
|
+ $mediaIndex = $index + 1; // 素材序号从1开始
|
|
|
|
|
|
try {
|
|
|
- dLog('generate')->info("开始处理参考图片 {$imageIndex}: {$imageUrl}");
|
|
|
+ dLog('generate')->info("开始处理参考{$label} {$mediaIndex}: {$url}");
|
|
|
|
|
|
// 1. 创建素材
|
|
|
$createResult = $this->createAsset([
|
|
|
- 'url' => $imageUrl,
|
|
|
- 'asset_type' => MpAsset::TYPE_IMAGE,
|
|
|
- 'name' => "参考图片_{$imageIndex}_" . time(),
|
|
|
+ 'url' => $url,
|
|
|
+ 'asset_type' => $assetType,
|
|
|
+ 'name' => "参考{$label}_{$mediaIndex}_" . time(),
|
|
|
]);
|
|
|
|
|
|
if ($createResult['code'] !== 0) {
|
|
|
- dLog('generate')->warning("图片 {$imageIndex} 创建素材失败: " . $createResult['msg']);
|
|
|
+ dLog('generate')->warning("{$label} {$mediaIndex} 创建素材失败: " . $createResult['msg']);
|
|
|
logDB('generate', 'warning', '创建素材失败', [
|
|
|
- 'image_url' => $imageUrl,
|
|
|
- 'index' => $imageIndex,
|
|
|
+ 'url' => $url,
|
|
|
+ 'asset_type' => $assetType,
|
|
|
+ 'index' => $mediaIndex,
|
|
|
'error' => $createResult['msg']
|
|
|
]);
|
|
|
- $failedIndexes[] = $imageIndex;
|
|
|
+ $failedIndexes[] = $mediaIndex;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
$assetId = $createResult['data']['asset_id'];
|
|
|
- dLog('generate')->info("图片 {$imageIndex} 素材创建成功,asset_id: {$assetId},开始轮询查询状态");
|
|
|
+ dLog('generate')->info("{$label} {$mediaIndex} 素材创建成功,asset_id: {$assetId},开始轮询查询状态");
|
|
|
|
|
|
// 2. 轮询查询素材状态(每3秒查询一次,最多查询100次即5分钟)
|
|
|
$maxAttempts = 100;
|
|
|
@@ -1545,32 +1585,34 @@ class AIImageGenerationService
|
|
|
$getResult = $this->getAsset($assetId);
|
|
|
|
|
|
if ($getResult['code'] !== 0) {
|
|
|
- dLog('generate')->warning("图片 {$imageIndex} 查询素材状态失败: " . $getResult['msg']);
|
|
|
+ dLog('generate')->warning("{$label} {$mediaIndex} 查询素材状态失败: " . $getResult['msg']);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
$assetStatus = $getResult['data']['asset']['status'] ?? null;
|
|
|
- dLog('generate')->info("图片 {$imageIndex} 素材状态查询第 {$attempt} 次,状态: {$assetStatus}");
|
|
|
+ dLog('generate')->info("{$label} {$mediaIndex} 素材状态查询第 {$attempt} 次,状态: {$assetStatus}");
|
|
|
|
|
|
if ($assetStatus === 'Active') {
|
|
|
// 素材可用
|
|
|
$assetIds[] = $assetId;
|
|
|
- dLog('generate')->info("图片 {$imageIndex} 素材处理成功,asset_id: {$assetId}");
|
|
|
+ dLog('generate')->info("{$label} {$mediaIndex} 素材处理成功,asset_id: {$assetId}");
|
|
|
logDB('generate', 'info', '素材转换成功', [
|
|
|
- 'image_url' => $imageUrl,
|
|
|
- 'index' => $imageIndex,
|
|
|
+ 'url' => $url,
|
|
|
+ 'asset_type' => $assetType,
|
|
|
+ 'index' => $mediaIndex,
|
|
|
'asset_id' => $assetId
|
|
|
]);
|
|
|
break;
|
|
|
} elseif ($assetStatus === 'Failed') {
|
|
|
// 素材处理失败
|
|
|
- dLog('generate')->warning("图片 {$imageIndex} 素材处理失败");
|
|
|
+ dLog('generate')->warning("{$label} {$mediaIndex} 素材处理失败");
|
|
|
logDB('generate', 'warning', '素材处理失败', [
|
|
|
- 'image_url' => $imageUrl,
|
|
|
- 'index' => $imageIndex,
|
|
|
+ 'url' => $url,
|
|
|
+ 'asset_type' => $assetType,
|
|
|
+ 'index' => $mediaIndex,
|
|
|
'asset_id' => $assetId
|
|
|
]);
|
|
|
- $failedIndexes[] = $imageIndex;
|
|
|
+ $failedIndexes[] = $mediaIndex;
|
|
|
break;
|
|
|
}
|
|
|
// 其他状态(Processing等)继续等待
|
|
|
@@ -1578,56 +1620,58 @@ class AIImageGenerationService
|
|
|
|
|
|
// 如果超时还未成功
|
|
|
if ($attempt >= $maxAttempts && $assetStatus !== 'Active') {
|
|
|
- dLog('generate')->warning("图片 {$imageIndex} 素材处理超时");
|
|
|
+ dLog('generate')->warning("{$label} {$mediaIndex} 素材处理超时");
|
|
|
logDB('generate', 'warning', '素材处理超时', [
|
|
|
- 'image_url' => $imageUrl,
|
|
|
- 'index' => $imageIndex,
|
|
|
+ 'url' => $url,
|
|
|
+ 'asset_type' => $assetType,
|
|
|
+ 'index' => $mediaIndex,
|
|
|
'asset_id' => $assetId,
|
|
|
'last_status' => $assetStatus
|
|
|
]);
|
|
|
- $failedIndexes[] = $imageIndex;
|
|
|
+ $failedIndexes[] = $mediaIndex;
|
|
|
}
|
|
|
|
|
|
} catch (\Exception $e) {
|
|
|
- dLog('generate')->error("图片 {$imageIndex} 处理异常: " . $e->getMessage());
|
|
|
+ dLog('generate')->error("{$label} {$mediaIndex} 处理异常: " . $e->getMessage());
|
|
|
logDB('generate', 'error', '素材转换异常', [
|
|
|
- 'image_url' => $imageUrl,
|
|
|
- 'index' => $imageIndex,
|
|
|
+ 'url' => $url,
|
|
|
+ 'asset_type' => $assetType,
|
|
|
+ 'index' => $mediaIndex,
|
|
|
'error' => $e->getMessage()
|
|
|
]);
|
|
|
- $failedIndexes[] = $imageIndex;
|
|
|
+ $failedIndexes[] = $mediaIndex;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 处理失败的图片:从 fullPrompt 中删除对应的标记并调整序号
|
|
|
+ // 处理失败的素材:从 fullPrompt 中删除对应的标记并调整序号
|
|
|
if (!empty($failedIndexes)) {
|
|
|
- dLog('generate')->info('开始处理失败图片的提示词调整,失败序号: ' . implode(',', $failedIndexes));
|
|
|
+ dLog('generate')->info("开始处理失败{$label}的提示词调整,失败序号: " . implode(',', $failedIndexes));
|
|
|
|
|
|
// 按序号从大到小排序,避免删除时影响后续序号
|
|
|
rsort($failedIndexes);
|
|
|
|
|
|
foreach ($failedIndexes as $failedIndex) {
|
|
|
- // 删除失败图片的标记,例如 <图片1>、<图片2> 等
|
|
|
- $pattern = "/<图片{$failedIndex}>/u";
|
|
|
+ // 删除失败素材的标记,例如 <图片1>、<视频2>、<音频3> 等
|
|
|
+ $pattern = "/<{$tagName}{$failedIndex}>/u";
|
|
|
$fullPrompt = preg_replace($pattern, '', $fullPrompt);
|
|
|
- dLog('generate')->info("已从提示词中删除 <图片{$failedIndex}>");
|
|
|
+ dLog('generate')->info("已从提示词中删除 <{$tagName}{$failedIndex}>");
|
|
|
}
|
|
|
|
|
|
- // 重新调整剩余图片的序号
|
|
|
- // 例如:如果图片2失败,图片3、图片4需要改为图片2、图片3
|
|
|
+ // 重新调整剩余素材的序号
|
|
|
+ // 例如:如果素材2失败,素材3、素材4需要改为素材2、素材3
|
|
|
$needAdjust = false;
|
|
|
foreach ($failedIndexes as $failedIndex) {
|
|
|
$needAdjust = true;
|
|
|
- // 将所有大于失败序号的图片标记序号减1
|
|
|
- for ($i = $failedIndex + 1; $i <= count($referenceImages); $i++) {
|
|
|
- $oldPattern = "/<图片{$i}>/u";
|
|
|
- $newTag = "<图片" . ($i - 1) . ">";
|
|
|
+ // 将所有大于失败序号的素材标记序号减1
|
|
|
+ for ($i = $failedIndex + 1; $i <= count($urls); $i++) {
|
|
|
+ $oldPattern = "/<{$tagName}{$i}>/u";
|
|
|
+ $newTag = "<{$tagName}" . ($i - 1) . ">";
|
|
|
$fullPrompt = preg_replace($oldPattern, $newTag, $fullPrompt);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if ($needAdjust) {
|
|
|
- dLog('generate')->info('提示词图片序号调整完成');
|
|
|
+ dLog('generate')->info("提示词{$label}序号调整完成");
|
|
|
logDB('generate', 'info', '提示词调整', [
|
|
|
'failed_indexes' => $failedIndexes,
|
|
|
'adjusted_prompt' => $fullPrompt
|
|
|
@@ -1635,12 +1679,13 @@ class AIImageGenerationService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- dLog('generate')->info('参考图片转素材完成,成功数量: ' . count($assetIds) . ',失败数量: ' . count($failedIndexes));
|
|
|
+ dLog('generate')->info("参考{$label}转素材完成,成功数量: " . count($assetIds) . ',失败数量: ' . count($failedIndexes));
|
|
|
|
|
|
// 格式化为可直接在API接口中使用的数组
|
|
|
- foreach($assetIds as &$assetId) {
|
|
|
+ foreach ($assetIds as &$assetId) {
|
|
|
$assetId = "asset://{$assetId}";
|
|
|
}
|
|
|
+ unset($assetId);
|
|
|
|
|
|
return $assetIds;
|
|
|
}
|