使用 React Native 和 Hugging Face API 构建交互式儿童故事生成器

在这篇文章中,我们将逐步构建一个 react native 应用程序,该应用程序使用 hugging face 强大的 ai 模型根据提示和年龄范围生成儿童故事。该应用程序允许用户输入提示,选择年龄范围,然后查看自定义故事以及总结故事的卡通图像。

特征

交互式故事生成:用户输入指导人工智能创建引人入胜的儿童故事。摘要和可视化:故事被摘要并与人工智能生成的图像一起显示。平滑的 ui 动画:动画使 ui 适应键盘输入。导航和样式:使用 expo router 轻松导航并自定义样式,打造有吸引力的 ui。

让我们分解每个部分!

第 1 步:设置 react native 和 hugging face api

首先使用 expo 创建一个新的 react native 项目:

npx create-expo-app@latest kidsstoryappcd kidsstoryapp

在您的应用中设置 expo router 以便于导航,并安装您可能需要的任何其他依赖项,例如图标或动画。

第 2 步:创建故事生成器主屏幕

使用 React Native 和 Hugging Face API 构建交互式儿童故事生成器

在 home.js 文件中,我们设置了一个屏幕,用户可以在其中选择年龄范围、输入故事提示,然后按按钮生成故事。

home.js代码

import react, { useeffect, useref, usestate } from "react";import {  view,  text,  touchableopacity,  stylesheet,  textinput,  animated,  activityindicator,} from "react-native";import usekeyboardoffsetheight from "../hooks/usekeyboardoffsetheight";import { hugging_face_key } from "../env";import { userouter } from "expo-router";const home = () => {  const ageranges = ["0-3", "4-6", "7-9"];  const [selectedagerange, setselectedagerange] = usestate("0-3");  const [textinput, settextinput] = usestate("");  const [isloading, setisloading] = usestate(false);  const keyboardoffsetheight = usekeyboardoffsetheight();  const animatedvalue = useref(new animated.value(0)).current;  const router = userouter();  useeffect(() => {    animated.timing(animatedvalue, {      tovalue: keyboardoffsetheight ? -keyboardoffsetheight * 0.5 : 0,      duration: 500,      usenativedriver: true,    }).start();  }, [keyboardoffsetheight]);  const handleagerangeselect = (range) => setselectedagerange(range);  const handleshowresult = () => {    if (textinput.length > 5) {      fetchstory();    } else {      alert("please enter a bit more detail.");    }  };  async function fetchstory() {    setisloading(true);    try {      let message = `write a simple story for kids about ${textinput} ${        selectedagerange ? "for age group " + selectedagerange : ""      }, in plain words. only provide the story content without any headings, titles, or extra information.`;      const response = await fetch(        "https://api-inference.huggingface.co/models/meta-llama/llama-3.2-3b-instruct/v1/chat/completions",        {          method: "post",          headers: {            authorization: `bearer ${hugging_face_key}`,            "content-type": "application/json",          },          body: json.stringify({            model: "meta-llama/llama-3.2-3b-instruct",            messages: [{ role: "user", content: message }],            max_tokens: 500,          }),        }      );      if (!response.ok) throw new error("failed to fetch story");      const data = await response.json();      const storycontent = data.choices[0].message.content;      // summarize the story      const summaryresponse = await fetch(        "https://api-inference.huggingface.co/models/meta-llama/llama-3.2-3b-instruct/v1/chat/completions",        {          method: "post",          headers: {            authorization: `bearer ${hugging_face_key}`,            "content-type": "application/json",          },          body: json.stringify({            model: "meta-llama/llama-3.2-3b-instruct",            messages: [              { role: "user", content: `summarize this story in a line: "${storycontent}"` },            ],            max_tokens: 30,          }),        }      );      if (!summaryresponse.ok) throw new error("failed to fetch summary");      const summarydata = await summaryresponse.json();      const summarycontent = summarydata.choices[0].message.content;      router.push({        pathname: "/detail",        params: { story: storycontent, summary: summarycontent },      });    } catch (error) {      console.error("error fetching story or summary:", error);      alert("error fetching story. please try again.");    } finally {      setisloading(false);    }  }  return (          select age range              {ageranges.map((range, index) => (           handleagerangeselect(range)}          >            {range}                  ))}                          {isloading ?  : generate}            );};const styles = stylesheet.create({  container: { flex: 1, padding: 20, alignitems: "center", backgroundcolor: "#1c1c1c" },  header: { fontsize: 20, fontweight: "bold", color: "#fff", marginvertical: 10 },  checkboxcontainer: { flexdirection: "row", flexwrap: "wrap", justifycontent: "center", marginbottom: 20 },  checkbox: { width: 60, height: 60, borderradius: 30, backgroundcolor: "#333", alignitems: "center", justifycontent: "center", margin: 10 },  selectedcheckbox: { backgroundcolor: "#1fb28a" },  checkboxlabel: { color: "#fff", fontsize: 14, fontweight: "bold" },  textinput: { width: "100%", height: 150, backgroundcolor: "#333", color: "#fff", borderradius: 8, padding: 10, marginvertical: 20, fontsize: 16 },  showbutton: { backgroundcolor: "#1fb28a", borderradius: 8, paddingvertical: 10, paddinghorizontal: 20, margintop: 10 },  showbuttontext: { color: "#fff", fontsize: 16, fontweight: "bold" },});export default home;

home.js 的关键组件

文本输入和年龄选择器:允许用户选择年龄范围并输入故事提示。fetch story:fetchstory 与 hugging face api 交互,根据输入生成和总结故事。导航:如果成功获取故事和摘要,应用程序将导航到详细信息屏幕以显示结果。

步骤 3:在详细信息屏幕上显示故事和图像

使用 React Native 和 Hugging Face API 构建交互式儿童故事生成器

详细信息屏幕检索生成的故事,对其进行总结,并显示人工智能生成的与故事相关的卡通图像。

detail.js 代码

import React, { useEffect, useState } from "react";import { StyleSheet, View, Text, TouchableOpacity, ActivityIndicator, Image, ScrollView } from "react-native";import { useLocalSearchParams, useRouter } from "expo-router";import { HUGGING_FACE_KEY } from "../env";import Ionicons from "@expo/vector-icons/Ionicons";const Detail = () => {  const params = useLocalSearchParams();  const { story, summary } = params;  const [imageUri, setImageUri] = useState(null);  const [loading, setLoading] = useState(false);  const router = useRouter();  useEffect(() => {    const fetchImage = async () => {      setLoading(true);      try {        const response = await fetch("https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-base-1.0", {          method: "POST",          headers: { Authorization: `Bearer ${HUGGING_FACE_KEY}`, "Content-Type": "application/json" },          body: JSON.stringify({ inputs: `Cartoonish ${summary}`, target_size: { width: 300, height: 300 } }),        });        if (!response.ok) throw new Error(`Request failed: ${response.status}`);        const blob = await response.blob();        const base64Data = await blobToBase64(blob);        setImageUri(`data:image/jpeg;base64,${base64Data}`);      } catch (error) {        console.error("Error fetching image:", error);      } finally {        setLoading(false);      }    };    fetchImage();  }, []);  const blobToBase64 = (blob) => {    return new Promise((resolve, reject) => {      const reader = new FileReader();      reader.onloadend = () => resolve(reader.result.split(",")[1]);      reader.onerror = reject;      reader.readAsDataURL(blob);    });  };  return (           router.back()}>                    {loading ? (              ) : imageUri ? (              ) : (        No image generated yet.      )}      {story}      );};export default Detail;const styles = StyleSheet.create({  container: { flex: 1, padding: 16, backgroundColor: "#1c1c1c" },  header: { fontSize: 24, color: "#ffffff", marginVertical: 16 },  text: { color: "#ffffff" },  image: { width: 300, height: 300, marginTop: 20, borderRadius: 10, alignSelf: "center" },});

总结

这个应用程序是将用户输入与人工智能模型相结合以创建动态讲故事体验的好方法。通过使用 react native、hugging face api 和 expo router,我们创建了一个简单但功能强大的讲故事应用程序,可以通过定制的故事和插图来娱乐孩子们。

以上就是使用 React Native 和 Hugging Face API 构建交互式儿童故事生成器的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1498088.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
HTTPS下A标签下载HTTP资源受限:为什么以及如何解决?
上一篇 2025年12月19日 20:09:04
innerHTML标签识别问题:为什么我的innerHTML无法识别“标签?
下一篇 2025年12月19日 20:09:11

相关推荐

  • ChatGPT如何调整回答风格 个性化设置指南

    ChatGPT如何调整回答风格 个性化设置指南ChatGPT如何调整回答风格 个性化设置指南ChatGPT如何调整回答风格 个性化设置指南ChatGPT如何调整回答风格 个性化设置指南

    要让ChatGPT的回答更符合个人需求,并不需要复杂的设置,关键在于掌握如何通过提问来引导和塑造其输出风格。本文将介绍如何通过给出明确的指令,从角色设定、格式要求和语气风格三个层面,分步骤讲解如何定制化ChatGPT的回答,让您能够轻松获得更贴心、更具个性的互动体验。 ☞☞☞AI 智能聊天, 问答助…

    2026年10月2日 • 用户投稿
    100
  • 如何在Sublime Text中安装并切换不同的主题与配色方案?

    如何在Sublime Text中安装并切换不同的主题与配色方案?如何在Sublime Text中安装并切换不同的主题与配色方案?如何在Sublime Text中安装并切换不同的主题与配色方案?如何在Sublime Text中安装并切换不同的主题与配色方案?

    在sublime text中安装和切换主题与配色方案的步骤如下:1. 安装package control:通过控制台运行代码安装包管理器;2. 使用package control安装主题(如material theme)和配色方案(如monokai pro);3. 在preferences >…

    2026年10月2日 • 用户投稿
    000
  • Selenium Grid 4:指定节点运行测试用例

    Selenium Grid 4:指定节点运行测试用例Selenium Grid 4:指定节点运行测试用例Selenium Grid 4:指定节点运行测试用例Selenium Grid 4:指定节点运行测试用例

    本文旨在指导初学者如何在 Selenium Grid 4 环境中,通过配置节点和代码,实现将测试用例定向到特定节点运行。通过设置自定义 Capabilities,您可以精确控制测试执行的节点,从而满足特定测试需求,例如在特定版本的浏览器或特定操作系统上进行测试。 Selenium Grid 4 指定…

    2026年10月2日 • 用户投稿
    000
  • AI Overviews如何生成报告 数据可视化操作教学

    AI Overviews如何生成报告 数据可视化操作教学AI Overviews如何生成报告 数据可视化操作教学AI Overviews如何生成报告 数据可视化操作教学AI Overviews如何生成报告 数据可视化操作教学

    AI Overviews功能能够极大地提升报告撰写与数据分析的效率。本文将引导您了解如何利用AI功能,从原始数据出发,一步步生成结构化的分析报告,并通过指令完成数据可视化图表的创建。通过对数据准备、指令下达、内容生成及图表制作等关键环节的讲解,您可以掌握一套实用的操作流程。 ☞☞☞AI 智能聊天, …

    2026年10月2日 • 用户投稿
    000
  • CentOS 7下MySQL5.7.23的服务配置参数测试

    centos 7系统中,mysql 5.7.23的服务管理已经从传统的sysvinit(使用命令如service mysql start)转变为systemd(使用命令如systemctl start mysqld.service)。最近,我对mysql 5.7.23的服务管理参数进行了测试,主要涉…

    2026年10月2日
    100
  • 苹果iPhone Air的机身会弯折吗?极端测试揭晓答案

    苹果iPhone Air的机身会弯折吗?极端测试揭晓答案苹果iPhone Air的机身会弯折吗?极端测试揭晓答案苹果iPhone Air的机身会弯折吗?极端测试揭晓答案苹果iPhone Air的机身会弯折吗?极端测试揭晓答案

    9月10日,苹果发布了全新iphone air,其最薄处仅为5.6毫米,一举打破纪录,成为史上厚度最小的iphone机型,超越此前保持记录的6.9毫米厚的iphone 6。 回顾过去,当年iPhone 6因过薄的铝合金机身在压力下出现“弯曲门”事件,引发了广泛讨论。尽管已是多年前的事,但这一阴影仍影…

    2026年10月2日 • 用户投稿
    100
  • 什么是观察者模式?观察者的实现

    什么是观察者模式?观察者的实现什么是观察者模式?观察者的实现什么是观察者模式?观察者的实现什么是观察者模式?观察者的实现

    观察者模式是一种一对多的依赖关系,当主题状态改变时,所有观察者自动收到通知并更新。它通过抽象接口实现主题与观察者的解耦,提升系统可扩展性与维护性,广泛应用于事件驱动系统如GUI、MVC、消息队列等。实现时需注意通知风暴、内存泄漏和调试复杂性等陷阱。 观察者模式,在我看来,它本质上是一种“一对多”的对…

    2026年10月2日 • 用户投稿
    1000
  • Java常用API之String类深度解析_Java操作字符串的技巧与方法

    Java常用API之String类深度解析_Java操作字符串的技巧与方法Java常用API之String类深度解析_Java操作字符串的技巧与方法Java常用API之String类深度解析_Java操作字符串的技巧与方法Java常用API之String类深度解析_Java操作字符串的技巧与方法

    java的string类不可变,这确保了线程安全、哈希值可缓存和字符串常量池的可靠性;1. 不可变性避免多线程下共享字符串被意外修改,保障安全性;2. 哈希值在首次计算后可缓存,提升hashmap等集合的性能;3. 字符串常量池通过不可变性实现内存共享,减少重复对象创建;4. 使用+拼接字符串在循环…

    2026年10月2日 • 用户投稿
    200
  • Java集合进阶之Map与Set应用_Java高效管理数据的集合框架

    Java集合进阶之Map与Set应用_Java高效管理数据的集合框架Java集合进阶之Map与Set应用_Java高效管理数据的集合框架Java集合进阶之Map与Set应用_Java高效管理数据的集合框架Java集合进阶之Map与Set应用_Java高效管理数据的集合框架

    map和set解决了java中高效查找、去重和键值关联的痛点:1. map通过键值对实现快速查找、配置管理、缓存和数据统计,避免list遍历的低效;2. set通过唯一性实现自动去重、高效成员检查和集合运算;3. 应根据顺序、排序和线程安全需求选择hashmap、linkedhashmap、tree…

    2026年10月2日 • 用户投稿
    100
  • 滴答清单日历视图使用方法详解_滴答清单日历视图切换与日程展示步骤

    滴答清单日历视图使用方法详解_滴答清单日历视图切换与日程展示步骤滴答清单日历视图使用方法详解_滴答清单日历视图切换与日程展示步骤滴答清单日历视图使用方法详解_滴答清单日历视图切换与日程展示步骤滴答清单日历视图使用方法详解_滴答清单日历视图切换与日程展示步骤

    滴答清单日历视图可整合任务与日程,支持按天、周、月查看。首先切换至日历标签,绑定系统日历同步外部事件。任务可添加截止日期或提醒时间,按设定显示在对应日期,支持拖动切换视图。通过设置可自定义显示模式、颜色分类及隐藏已完成任务,提升管理效率。(149字符) 如果您希望更直观地查看和管理每日任务与日程安排…

    2026年10月2日 • 用户投稿
    100
  • PHP文件上传系统:如何通过外键将文件精确关联到特定用户

    本教程详细阐述如何在PHP文件上传系统中,通过引入数据库外键(user_id)将上传的QR码图片与特定用户关联。内容涵盖数据库表结构设计、前端表单改造、后端文件处理逻辑及用户专属内容展示,确保文件上传的精确归属和管理。 1. 理解核心问题与解决方案 在多用户或多角色(如员工为用户上传)的应用场景中,…

    2026年10月2日
    100
  • JS如何实现语音转文字

    JS如何实现语音转文字JS如何实现语音转文字JS如何实现语音转文字JS如何实现语音转文字

    答案:JavaScript语音转文字首选浏览器Web Speech API,适用于Chrome环境下的简单场景;若需高准确率、多语言支持及高级功能,则应采用前端录音、后端调用云服务(如Google、Azure)的方案。 在JavaScript中实现语音转文字,最直接的方式是利用浏览器内置的Web S…

    2026年10月2日 • 用户投稿
    800
  • CodeRabbit 发布面向终端的 AI 代码审查 CLI 工具

    CodeRabbit 发布面向终端的 AI 代码审查 CLI 工具CodeRabbit 发布面向终端的 AI 代码审查 CLI 工具CodeRabbit 发布面向终端的 AI 代码审查 CLI 工具CodeRabbit 发布面向终端的 AI 代码审查 CLI 工具

    ai代码审查初创公司coderabbit近日发布了“coderabbit cli”——一款专为终端环境设计的智能代码审查工具,可与claude code、codex cli、cursor cli、gemini等主流ai编程助手实现无缝对接。 据CodeRabbit介绍,随着越来越多开发者依赖CLI端…

    2026年10月2日 • 用户投稿
    100
  • Sublime怎么新建文件?新建文件的4种快捷操作方式

    Sublime怎么新建文件?新建文件的4种快捷操作方式Sublime怎么新建文件?新建文件的4种快捷操作方式Sublime怎么新建文件?新建文件的4种快捷操作方式Sublime怎么新建文件?新建文件的4种快捷操作方式

    在sublime text中新建文件有四种主要方法,适合不同使用场景。① 使用快捷键 ctrl + n(windows/linux)或 cmd + n(mac)可快速在当前窗口打开未命名新文件,适合临时编写内容;② 通过菜单栏点击 “file → new file” 实现相同功能,适合新手熟悉界面;…

    2026年10月2日 • 用户投稿
    100
  • 惠普ProBook风扇转速不稳?调整与优化技巧

    惠普ProBook风扇转速不稳?调整与优化技巧惠普ProBook风扇转速不稳?调整与优化技巧惠普ProBook风扇转速不稳?调整与优化技巧惠普ProBook风扇转速不稳?调整与优化技巧

    惠普ProBook风扇异常可通过五种方法优化:1. 使用HP CoolSense自动调节温控;2. 在BIOS中设置自订风扇控制选项,调整数值至3或4以增强散热;3. 优化电源管理,降低最大处理器状态至80%-90%;4. 通过任务管理器清理高CPU占用的后台进程;5. 物理清洁散热口灰尘,确保通风…

    2026年10月2日 • 用户投稿
    200
  • java怎样用length获取数组长度 java数组长度语句的简单用法

    java怎样用length获取数组长度 java数组长度语句的简单用法java怎样用length获取数组长度 java数组长度语句的简单用法java怎样用length获取数组长度 java数组长度语句的简单用法java怎样用length获取数组长度 java数组长度语句的简单用法

    在java中获取数组长度需访问其length字段,1. length是数组的公共final字段,表示创建时分配的固定大小,使用时直接通过array.length访问,不可加括号;2. 数组长度在创建后不可变,运行时无法修改length值,若需扩容需创建新数组并复制元素;3. length字段用于避免…

    2026年10月2日 • 用户投稿
    100
  • Sublime Text 中 Tab 键与空格缩进的冲突处理

    Sublime Text 中 Tab 键与空格缩进的冲突处理Sublime Text 中 Tab 键与空格缩进的冲突处理Sublime Text 中 Tab 键与空格缩进的冲突处理Sublime Text 中 Tab 键与空格缩进的冲突处理

    sublime text 中 tab 键和空格缩进冲突可通过统一缩进风格并配置编辑器解决。1. 启用 “draw_white_space”: “all” 或使用 trailing spaces 插件检测混用情况;2. 使用 convert indent…

    2026年10月2日 • 用户投稿
    100
  • Spring Boot: 从 XML 文件中获取所有 Bean 实例

    Spring Boot: 从 XML 文件中获取所有 Bean 实例Spring Boot: 从 XML 文件中获取所有 Bean 实例Spring Boot: 从 XML 文件中获取所有 Bean 实例Spring Boot: 从 XML 文件中获取所有 Bean 实例

    本文介绍了如何在 Spring Boot 应用中,通过 ApplicationContext 的 getBeansOfType() 方法,高效地从 XML 配置文件中获取所有指定类型的 Bean 实例。相比于逐个获取 Bean,该方法可以一次性获取所有 Bean,简化代码,提高效率。本文将提供详细的…

    2026年10月2日 • 用户投稿
    100
  • js如何实现拖拽功能

    js如何实现拖拽功能js如何实现拖拽功能js如何实现拖拽功能js如何实现拖拽功能

    实现javascript拖拽功能的核心是监听mousedown、mousemove和mouseup事件,通过计算鼠标偏移量实时更新元素位置,推荐使用transform: translate()提升性能。1. 对于多个可拖拽元素,可采用事件委托,将事件绑定在父容器上,通过判断e.target实现统一管…

    2026年10月2日 • 用户投稿
    100
  • 前荣耀 CEO 赵明谈离职后去向:外面传的都是“捕风捉影”

    前荣耀 CEO 赵明谈离职后去向:外面传的都是“捕风捉影”前荣耀 CEO 赵明谈离职后去向:外面传的都是“捕风捉影”前荣耀 CEO 赵明谈离职后去向:外面传的都是“捕风捉影”前荣耀 CEO 赵明谈离职后去向:外面传的都是“捕风捉影”

    9 月 17 日,前荣耀终端有限公司 ceo 赵明在复旦大学“领变者论坛”上回应了外界关于其离职后去向的种种传闻。 赵明强调,所有流传的“他去哪儿”的消息纯属无稽之谈,他并未与传闻中涉及的公司进行过接洽。“我和一鸣(字节跳动创始人张一鸣)确实认识,但合作一事并不存在。”同时,他也明确表示,与智界之间…

    2026年10月2日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信