PS: 市場にはすでに多くの有料ソフトウェアツールが登場しており、極虎漫剪や速推のようなパッケージ化されたツールがありますが、そのコア機能の実現は同じで、試されるのはやはり GPT の効果です。今年登場した Sora はこの分野の進化版であり、今後は映画制作分野(UE4)に影響を与える可能性があります。
機能設計#
1、シーンの分割抽出:小説テキストの文分割、SD による画像生成と TTS テキストから音声への変換
2、小説内容 > 推論プロンプト(SD 描画)
3、画像音声の統合動画
モデル:
TTS (edge)、SD 描画モデル(ここではを使用)、GPT(ここでは Gemini を使用)
プロジェクトアドレス:story-vision
コアコード#
小説分割抽出 GPT#
prompt = """私は小説の内容をシーンに分割し、原文の説明に基づいて推論されたシーンを作成したいと思います。推論と補完が必要な欠落または暗示された情報には、人物の服装、髪型、髪色、顔色、顔の特徴、体型、感情、肢体動作などが含まれます。また、スタイルの説明(年代、空間、時間帯、地理環境、天候の説明など)、物品の説明(動物、植物、食べ物、果物、おもちゃなど)、画面の視点(人物の比率、カメラの深度、観察角度の説明など)も含まれますが、過度にならないようにしてください。カメラの言語を使って、より豊かな人物の感情と感情状態を描写し、理解した後に新しい説明内容を生成してください。出力形式は次のように変更してください:イラスト1:原文の説明:対応する原文のすべての文;画面の説明:対応する画面のストーリー内容;画面のキャラクター:画面に登場するキャラクターの名前;服装:主人公はカジュアルな服装;位置:バーカウンターの前に座っている;表情:顔のラインは穏やかで、表情は心地よい;行動:手に持っている酒杯を軽く揺らしている。環境:バーカウンターの背景は暗いトーンで、キャンドルの光が背景で揺らめき、幻想的な雰囲気を与えています。この要件を理解した場合は、この5つの要件を確認し、結果としてこの5つの内容のみを返してください。小説の内容は以下の通りです:"""
def split_text_into_chunks(text, max_length=ai_max_length):
"""
テキストを最大長でチャンクに分割し、行の区切りでのみ分割が行われるようにします。
"""
lines = text.splitlines()
chunks = []
current_chunk = ''
for line in lines:
if len(current_chunk + ' ' + line) <= max_length:
current_chunk += ' ' + line
else:
chunks.append(current_chunk)
current_chunk = line
chunks.append(current_chunk)
return chunks
def rewrite_text_with_genai(text, prompt="このテキストを書き直してください:"):
chunks = split_text_into_chunks(text)
rewritten_text = ''
# pbar = tqdm(total=len(chunks), ncols=150)
genai.configure(api_key=cfg['genai_api_key'])
model = genai.GenerativeModel('gemini-pro')
for chunk in chunks:
_prompt=f"{prompt}\n{chunk}",
response = model.generate_content(
contents=_prompt,
generation_config=genai.GenerationConfig(
temperature=0.1,
),
stream=True,
safety_settings = [
{
"category": "HARM_CATEGORY_DANGEROUS",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"threshold": "BLOCK_NONE",
},
]
)
for _chunk in response:
if _chunk.text is not None:
rewritten_text += _chunk.text.strip()
# pbar.update(1)
# pbar.close()
return rewritten_text
シーン出力
SD 文生図#
SD のプロンプトは上記の出力されたシーンテキストを基に GPT が作成したものです。
from diffusers import StableDiffusionPipeline
from diffusers.utils import load_image
import torch
model_path = "./models/cetusMix_Whalefall2.safetensors"
pipeline = StableDiffusionPipeline.from_single_file(
model_path,
torch_dtype=torch.float16,
variant="fp16"
).to("mps")
generator = torch.Generator("mps").manual_seed(31)
def sd_cetus(save_name, prompt):
prompt = prompt
image = pipeline(prompt).images[0]
image.save('data/img/'+ save_name +'.jpg')
画像効果
TTS 音声生成#
オンラインには多くの TTS に関する情報があり、ここでは edge が提供するものを使用しています。
import edge_tts
import asyncio
voice = 'zh-CN-YunxiNeural'
output = 'data/voice/'
rate = '-4%'
volume = '+0%'
async def tts_function(text, save_name):
tts = edge_tts.Communicate(
text,
voice=voice,
rate=rate,
volume=volume
)
await tts.save(output + save_name + '.wav')
動画効果#
[video(video-7erojzmT-1713340240300)(type-csdn)(url-https://live.csdn.net/v/embed/379613)(image-https://video-community.csdnimg.cn/vod-84deb4/00b03862fc8b71eebfc44531859c0102/snapshots/0bc4b0ed08a54fc2a412ee3ad1f3fdf2-00005.jpg?auth_key=4866938633-0-0-f335ae8248a7095d7f5d885a25aba80e)(title - 第 1 章 進局子了_out)]