本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。
原文链接:实战!利用多模态大模型生成绘本【文末送书】
🚀 引言
在数字时代,技术与创意的结合不断刷新我们的世界观。今天,我们要探索的是一个充满魔法的领域——AI绘本生成!想象一下,孩子们只需轻声说出想法,AI就能为他们绘制出一本本独一无二的绘本,这不再是梦!🌈
🧠 AI的想象力:从想法到绘本
AI如何理解孩子的奇思妙想?从简单的想法到丰富多彩的绘本,这背后可以凭借AI强大的想象力和创造力来实现。🤩这篇文章就带大家从头开始创建一个AIGC应用:“漫画家”,一句话就可以生成一篇绘本。
📚 故事生成:大语言模型的力量
故事是绘本的主题,一个好的故事更能引人入胜,勾起孩子们的兴趣📚。因此,我们需要一个可以自动生成故事的功能🛠️。大语言模型具有强大的文本生成能力,以ChatGPT为例,它写出的故事在一致性、流畅性等方面已经非常强悍了👍,对于人物名字、人物关系和环境的理解也很合理👥🌳。但是,生成的故事可能会过于平凡,缺乏细节和亮点😕。因此,我们需要在故事生成功能的开发中,考虑如何增加故事的吸引力✨,例如,增加一些惊喜和翻转的情节🎉,或者让故事更具有趣味性和教育性🎨📖。
我们选择调用百度文心一言的API来实现故事生成功能,并且使用了一种基于迭代反馈的策略来提升故事的趣味性和吸引力。如果有条件,也可以选择自行收集数据集,专门微调一个故事生成的模型。
我们的策略主要分为三个阶段,第一阶段,我们通过提供故事的背景信息,引导模型生成故事的初稿。在这个阶段,我们的指令是这样的:
你是一位优秀的儿童故事作家,现在你要写一篇童话故事,并通过这个故事传递深刻的哲理和思考。
接下来我给你几个关键信息:{key message}
然后,请你试着以这样的步骤逐步思考:
1.提炼核心思想,从关键信息中找出最主要的思想或主题,这将是故事的核心。
2.将核心思想与儿童故事相连接,创作一个富有想象力的世界,以及生动可爱的角色。
3.起一个有吸引力,充满童话色彩的标题,应当简短、生动,同时也要能够反映故事主题。
4.采用小朋友可以听懂的知识,不要使用太过复杂或专业的词汇。
5.儿童故事是一个充满了想象力和幻想色彩的世界,可以通过夸张、象征等手段来塑造故事中的角色和情节。
6.可以使用拟人的修辞手法,赋予鸟兽虫鱼、花草树木、家具、玩具等生命,使他们拥有人的思想感情。
7.童话故事应当表现出我们对美好的向往和追求,让孩子们在听故事的时候能够学到知识,同时也能够感受到快乐。
8.最后,你应当创作出独一无二的、具有强烈个性的儿童故事,让每一个故事都能够给孩子们留下深刻的印象。
输出格式:基于上述的要求,把关键信息融入儿童故事进行创作,不要输出无关内容和提示信息,直接生成故事,字数在500字左右。
第二阶段,我们让模型基于初稿给出调整优化的修改建议。在这个阶段,我们的指令是这样的:
你认为你所创作的这个故事,有哪些可以改进的地方么?是否存在一些创新的策略,能够使得您的故事更具有吸引力,增加悬念,同时也更具有启发性呢?
在你的创作过程中,考虑一下是否可以引入更多独特和精彩的情节来提升故事的吸引力。这些情节可以是出乎意料的转折,也可以是描绘角色的深度矛盾,或是通过富有哲理的对白为故事增色。
同时,为了提升故事的悬念,您可以尝试通过布置一些未解的谜团,或者在故事的早期阶段就设置一些伏笔,让读者对故事的结局充满期待。
至于如何增加启发性,您可以在故事中加入一些深层次的主题和思考,让读者在享受故事的同时,也能从中领悟到一些人生的真理,或是对于人性、社会等话题的深入思考。
请只给出建议,不要再输出故事内容。
第三阶段,我们让模型基于反馈的建议进行迭代,对初稿再进行修改。在实践中,我们发现文心一言经常会生成一些提示性的信息,因此我们也需要通过指令限制模型不要生成这些信息。在这个阶段,我们的指令是这样的:
请你按照上述修改建议,对初稿故事进行再次修改。请直接输出故事内容,不要给出任何提示信息,例如,不要生成类似“好的,以下是按照您修改建议对初稿故事进行再次修改后的版本”等内容。
这种策略的基本逻辑是,首先我们通过提供一些基本的信息和指令,引导模型生成一个大致的故事初稿。然后,我们再让模型自我批评,给出改进的建议。最后,我们让模型根据这些建议,对故事进行修改和优化。通过这个过程,我们可以逐步引导模型生成出我们想要的故事。
🎨 插画生成:AI的画笔
在儿童故事中,插图的作用是无可替代的🎨📚。可以说,如果故事没有插图,那就像是失去了灵魂🕊️,就如同歌曲失去了旋律一般🎶。对于孩子们来说,插图不仅能激发他们的想象力💡✨,还能帮助他们更好地理解和吸收故事的内容📖。有时候,孩子们甚至能从插图中学到更多的知识📚,这是单纯的文字所无法比拟的📝。
然而,要想让这些AI绘图工具发挥出最大的效果,我们还需要一位了解孩子心理和喜好的专业插画家来提供创作提示。他们能够根据故事的主题和孩子们的喜好,设计出引人入胜的插画内容,并将其提炼成具体的关键词或短句,引导AI工具进行插图创作。
恰好,大语言模型也能够扮演此类角色,通过设置给定的身份,它就能够在此身份下一定程度上完成所给的任务。以下是我们用来让大语言模型根据给定的描述生成Stable Diffusion提示词的提示词:
你是一位专业的儿童插画家和Stable Diffusion提示词专家,不仅具有丰富的绘画技巧和想象力,还对孩子们的心理有深入的理解,知道他们喜欢什么样的插画。你能设计出极具创新性并且能吸引儿童的插画和AI绘画提示词。
提示词是用来引导AI绘画模型创作图像的关键词或短句。它们可以描述图像的各种具体细节,例如人物的外观、背景的环境、颜色的搭配和光线的效果,以及图像的主题和风格。提示词的格式通常包含在括号内的加权数字,这些数字用于指示某些细节的重要性或强调程度。例如,"(masterpiece:1.5)"表示作品的艺术品质是非常重要的。如果使用中括号,如"{blue hair:white hair:0.3}",这表示将蓝色的头发和白色的头发进行混合,其中蓝色头发的占比为0.3。
接下来,你要根据我给你的input,执行以下两步操作:
第一步:发挥你的创造力和想象力,结合孩子们喜欢的元素,根据给的input补充这幅画面的诸多要素,如主体、环境、光线、颜色、情绪和构图等内容,生成一幅完整的画面。
第二步:将第一步生成的画面内容,提炼成核心的关键词。但是这些关键词必须满足以下几个条件:
1.它们必须用英文表示,并用英文半角逗号隔开。
2.它们必须涵盖主体、环境、光线、颜色、情绪、构图等要素。
3.它们的数量必须超过10个,但不多于50个。
4.它们必须是描述画面核心内容的关键词或短句,而不是长句子。
5.对于涉及人物的主题,必须描述人物的眼睛、鼻子、嘴唇,例如 'beautiful detailed eyes, beautiful detailed lips, extremely detailed eyes and face, long eyelashes',这是为了避免Stable Diffusion随机生成变形的面部五官。
6.此外,还可以描述人物的外表、情绪、衣服、姿势、视角、动作、背景等。人物属性中,1girl表示一个女孩,2girls表示两个女孩。
7.附加细节:还可以描述画面的场景细节或人物细节,使图像看起来更丰满、合理。但这部分是可选的,需要注意的是,这些细节不能与主题冲突,需要保持画面的整体和谐。
接下来我将给你提供几个例子:
样例1
input: 一家人在厨房做饭
output: closeup, a family portrait, momn, dad, kitchen in the background
样例2
input: 蜘蛛侠穿着钢铁侠的战衣
output: batman, wearing a iron man suit, outdoors, background forest, kid, toon, ((pixar style)), 3d, cartoon, detailed face, blue neon eyes, asymmetric, cinematic lighting, batman logo
样例3
input: 一个小女孩正在摘番茄
output: (tomato girl),(very_softly draw:1.5 , very_carefully drawing:1.5) , (masterpiece , best_quality ) , ( Tomato farm background , Tomato field work clothes ),(great_clear_eyes:1.2),(cartoonish:1.6),(high resolution 4K), (high-detailed), (illustration:1.3), dramatic angle,cinematic shot, (picture_level hyper),happy_smile
样例4
input: 两个小孩划船在海里冒险
output: (best quality, masterpiece),
2boys, boat, ocean, caustics, wave pointing, happy pirate hat, eyepatch, shark, flintlock, (best quality, masterpiece),
仿照以上例子,并不局限于我给你的单词,接下来我再给你一个例子,请你给出一套详细的提示词。直接开始给出提示词即可,不需要有任何其它自然语言描述,也不要有任何中文前缀。
input: {input}
output:
例如,当我们输入童话故事小红帽中的一段话“从前有个可爱的小姑娘,谁见了都喜欢,但最喜欢她的是她的奶奶,简直是她要什么就给她什么。一次,奶奶送给小姑娘一顶用丝绒做的小红帽,戴在她的头上正好合适。从此,姑娘再也不愿意戴任何别的帽子,于是大家便叫她"小红帽"。”,文心一言给我们生成的提示词是“cute girl, everyone loves her, favorite is her grandma, gives her anything she wants. Once, grandma gives her a red velvet hat, fits perfectly. From then on, girl refuses to wear any other hat, so everyone calls her "Red Hat Girl".”,然后我们其输入到Stable Diffusion中,结合KIDS ILLUSTRATION的LoRA模型,就可以生成下图效果。
🔊 语音交互:孩子的语言,AI的心
作为一款面向儿童制作绘本的应用,需要精心设计用户交互🎨📚。由于客户群体的孩子们大部分处于学前阶段,甚至幼儿园阶段🎂,普遍还没有掌握拼音打字的能力🔠,而付出更多时间和精力去学习拼音打字显然不是我们这款应用该做的事🖥️,因此语音交互对于儿童来说是一个更好的选择🎙️。毕竟,相比于拼音和识字,说话是儿童最先掌握的交互技能🗣️,也是他们与外界交流的主要方式🌍,因此语音交互能够覆盖更低年龄段的儿童👶。语音交互既可以让儿童免去打字的困扰⌨️,也可以让他们能够更加轻松地与应用进行交互,使得阅读和学习的过程变得更加愉快和有趣😊📖。
在语音识别方面,我们采用的是Whisper模型。Whisper是由OpenAI训练并开源的通用语音识别模型,基于Transformer的编码器-解码器结构,在68万小时标注的音频数据上进行了训练,表现出强大的泛化能力,并且是一个多任务模型,可以进行多语言语音识别、语音翻译和语言识别。
import librosa # librosa库用于音频处理
import torch as th
from zhconv import convert # zhconv库用于进行简繁转换
from transformers import pipeline
from transformers import WhisperTokenizer # 用于音频数据的分词
from transformers import WhisperFeatureExtractor # 用于提取音频特征
from transformers import WhisperForConditionalGeneration # Whisper模型的生成器
# 从预训练模型加载Whisper模型,特征提取器和分词器
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-small")
tokenizer = WhisperTokenizer.from_pretrained("openai/whisper-small", language="Chinese", task="transcribe")
device = "cuda:0" if th.cuda.is_available() else "cpu" # 检查CUDA设备是否可用
pipe = pipeline(
"automatic-speech-recognition", # 设置为自动语音识别任务
model=model,
feature_extractor=feature_extractor,
tokenizer=tokenizer,
chunk_length_s=30, # 设置音频分块的长度为30秒
device=device, # 设置设备
)
# 加载音频文件,并将其输入到处理管道
speech, _ = librosa.load("asr_test_audio.mp3") # 使用librosa加载音频文件
prediction = pipe(speech)["text"] # 使用处理管道进行预测,并取出预测结果中的文本部分
print(convert(prediction, "zh-cn")) # 使用zhconv进行简繁转换,并打印结果
在语音合成方面,我们采用的是Sambert-Hifigan模型。Sambert是由阿里达摩院语音实验室设计、训练并开源的TTS模型,基于Parallel结构进行了改良,以预训练BERT语言模型为编码器,解码器使用了PNCA自回归结构,降低了带宽的要求,支持CPU实时合成。
from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
text = "早上好,今天天气真不错!"
model_id = "damo/speech_sambert-hifigan_tts_zhitian_emo_zh-cn_16k"
sambert_hifigan_tts = pipeline(task=Tasks.text_to_speech, model=model_id)
output = sambert_hifigan_tts(input=text)
wav = output[OutputKeys.OUTPUT_WAV]
with open("test_sambert-hifigan_tts.wav", "wb") as f:
f.write(wav)
以上,我们探索了AI绘本生成的全过程,还深入理解了背后的技术实现,将它们组合在一起,就可以实现一个端到端的绘本生成流程。🤖🧒
🔮 展望未来:AIGC应用将孩子们的创意无限扩展
接下来,我们其实可以将“漫画家”部署成一个WEB服务,再开发一个前端的网页、APP或小程序,这样就可以24h提供服务了。可以参考下面这张系统架构图。
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。