banner
sanford

sanford

Have you seen the characters flashing in the neural circuit?
github
twitter

一遍關於自動AI小說推文的實現

PS: 市面上已經出現不少收費的軟體工具,類似極虎漫剪、速推之類封裝好的工具,但其核心功能實現都是一樣,要考驗的還是 GPT 效果;今年出現的 Sora 相當於這個賽道方向的進化版本,在以後更有可能衝擊影視製作領域 (UE4)

功能設計#

1、提取分鏡場景:小說文本分句、SD 生成圖片和 TTS 文本轉語音頻

2、小說內容 > 推導提示詞 (SD 繪畫)

3、圖片音頻合併視頻

模型:
TTS (edge)、SD 繪畫模型 (這裡使用)、GPT (這裡使用 Gemini)

項目地址:story-vision

核心代碼#

小說分鏡提取 GPT#

prompt = """我想讓你對小說內容進行分鏡,根據原文描述推斷出的場景;推斷和補充缺失或隱含的信息,包括但不限於:人物衣服,人物髮型,人物髮色,人物臉色,人物五官特點,人物體態,人物情緒,人物肢體動作等)、風格描述(包括但不限於:年代描述、空間描述、時間段描述、地理環境描述、天氣描述)、物品描述(包括但不限於:動物、植物、食物、水果、玩具)、畫面視角(包括但不限於:人物比例、鏡頭深度描述、觀察角度描述),但不要過度。通過鏡頭語言描述,描繪更豐富的人物情緒和情感狀態,你理解後通過句子生成一段新的描述內容。輸出格式改為:插畫一:原文描述:對應的原文全部句子;畫面描述:對應的畫面劇情內容;畫面角色:畫面中出現的角色名稱;穿著:主角穿著便裝;位置:坐在吧台前;表情:面部線條溫和,表情愜意; 行為:手上輕輕晃動著手中的酒杯。環境:吧台的背景是暗調的,燭光在背景中搖曳,給人一種迷離的感覺。如果你理解了這一點要求,請確認這五點要求,返回結果只要這五點的內容,小說內容如下:"""

def split_text_into_chunks(text, max_length=ai_max_length):
    """
    Split text into chunks with a maximum length, ensuring that splits only occur at line breaks.
    """
    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="Please rewrite this text:"):
    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)]

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。