【Android代码】绘本翻页时通过AI识别,自动通过手机/pad朗读绘本

核心功能:

  • 打开摄像头(可支持外接摄像头)
  • 检测翻页(后续考虑添加图像差异算法)
  • 拍照后用 识图
  • 自动用 TextToSpeech 朗读文字内容

📌 说明:

  • 使用了 CameraX(Android Jetpack)处理摄像头输入

  • 使用 ML Kit 做文字识别

  • 使用 TextToSpeech 实现朗读

// Project: StoryBookReaderApp
// MainActivity.java — Android Studio 项目主类package com.example.storybookreaderapp;import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.view.SurfaceView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageAnalysis;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageCaptureException;
import androidx.camera.core.ImageProxy;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import com.google.common.util.concurrent.ListenableFuture;
import com.google.mlkit.vision.common.InputImage;
import com.google.mlkit.vision.text.TextRecognition;
import com.google.mlkit.vision.text.TextRecognizer;import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class MainActivity extends AppCompatActivity {private static final int REQUEST_CODE_PERMISSIONS = 10;private static final String[] REQUIRED_PERMISSIONS = new String[]{Manifest.permission.CAMERA};private ExecutorService cameraExecutor;private ImageCapture imageCapture;private TextToSpeech tts;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SurfaceView view = new SurfaceView(this);setContentView(view);if (allPermissionsGranted()) {startCamera();} else {ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS);}cameraExecutor = Executors.newSingleThreadExecutor();tts = new TextToSpeech(this, status -> {if (status != TextToSpeech.ERROR) {tts.setLanguage(Locale.US);}});}private boolean allPermissionsGranted() {for (String permission : REQUIRED_PERMISSIONS) {if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {return false;}}return true;}private void startCamera() {ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);cameraProviderFuture.addListener(() -> {try {ProcessCameraProvider cameraProvider = cameraProviderFuture.get();imageCapture = new ImageCapture.Builder().build();ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build();imageAnalysis.setAnalyzer(cameraExecutor, image -> {detectPageTurn(image);image.close();});CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;cameraProvider.unbindAll();cameraProvider.bindToLifecycle(this, cameraSelector, imageCapture, imageAnalysis);} catch (Exception e) {Log.e("CameraX", "Binding failed", e);}}, ContextCompat.getMainExecutor(this));}private void detectPageTurn(ImageProxy image) {takePhotoAndRead();}private void takePhotoAndRead() {imageCapture.takePicture(ContextCompat.getMainExecutor(this), new ImageCapture.OnImageCapturedCallback() {@Overridepublic void onCaptureSuccess(@NonNull ImageProxy image) {InputImage inputImage = InputImage.fromMediaImage(image.getImage(), image.getImageInfo().getRotationDegrees());TextRecognizer recognizer = TextRecognition.getClient();recognizer.process(inputImage).addOnSuccessListener(result -> {String text = result.getText();tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);}).addOnFailureListener(e -> Toast.makeText(MainActivity.this, "Text recognition failed", Toast.LENGTH_SHORT).show());image.close();}@Overridepublic void onError(@NonNull ImageCaptureException exception) {Log.e("CameraX", "Capture failed", exception);}});}@Overrideprotected void onDestroy() {if (tts != null) {tts.stop();tts.shutdown();}cameraExecutor.shutdown();super.onDestroy();}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == REQUEST_CODE_PERMISSIONS) {if (allPermissionsGranted()) {startCamera();} else {Toast.makeText(this, "Permissions not granted", Toast.LENGTH_SHORT).show();finish();}}}
} // End of class

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91656.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

园区IPv6规划与部署

​今天我将围绕“园区IPv6规划与部署”这一主题&#xff0c;结合行业趋势、技术难点和实际案例&#xff0c;与大家分享一套可落地的规划方法论。​在开始前&#xff0c;我想先问大家一个问题&#xff1a;​如果现在让你给一个新建园区设计网络&#xff0c;你会优先考虑IPv4还是…

mingw11.2+opencv4.12 cmake contrib编译

第一次Configure之后&#xff0c;会出现不少错误&#xff0c;主要是因为文件没办法正常下载引起的,因为之前编译过vs2022 ,缓存里面有应该下载的文件了&#xff0c;所以这次没有错误&#xff0c;如果你第一次Configure有下载错误&#xff0c;可以下载以下的文件飞书 Docs Link:…

免费MCP服务:Excel CSV 转 JSON MCP by WTSolutions 文档

简介 Excel 转 JSON MCP&#xff08;模型上下文协议&#xff09;提供了一个标准化接口&#xff0c;用于通过模型上下文协议将 Excel 和 CSV 数据转换为 JSON 格式。此 MCP 实现提供了两个专门用于数据转换的工具&#xff1a; excel_to_json_mcp_from_data&#xff1a;转换制表…

应用集成体系深度解析:从数据互通到流程协同

一、应用集成核心概念框架 #mermaid-svg-0V3XAJsofKi2qCa7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0V3XAJsofKi2qCa7 .error-icon{fill:#552222;}#mermaid-svg-0V3XAJsofKi2qCa7 .error-text{fill:#552222;s…

深入解析 AWS RDS Proxy

在当今微服务架构与无服务器计算快速发展的背景下&#xff0c;数据库连接成为许多应用系统的性能瓶颈。传统RDS实例在处理大量短连接请求时&#xff0c;往往面临连接资源耗尽、连接建立耗时过高等问题。为了解决这一挑战&#xff0c;AWS 推出了 RDS Proxy 服务&#xff0c;通过…

深度剖析 TDMQ RabbitMQ 版经典队列底层存储机制

导语 RabbitMQ 作为开源消息队列的标杆产品&#xff0c;凭借灵活的路由机制与高可用设计&#xff0c;支撑着海量业务场景的消息流转。而经典队列&#xff08;Classic Queue&#xff09; 作为 RabbitMQ 最基础、应用最广泛的队列类型&#xff0c;其底层存储机制直接决定了消息处…

Spring AI开发智能客服(Tool calling)

文章目录前言1 思路分析2 工程结构搭建1_数据库表2_引入依赖3_基础代码3 定义 Tool1_分析查询条件2_定义Function4 系统提示词5 配置ChatClient6 编写Controller7 测试8 Tool calling 底层组件1_ToolCallback2_ToolDefinition3_ToolCallingManager4_ResultConverter5_ToolConte…

设计模式笔记_结构型_适配器模式

1.适配器模式介绍适配器模式是一种结构型设计模式&#xff0c;它允许不兼容的接口协同工作。适配器模式的核心思想是将一个类的接口转换成客户期望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的类可以一起工作。你可以将其想象成一个“转换插头”——假设你…

事务隔离:从锁实现到MVCC实现

文章目录事务隔离&#xff1a;从锁实现到MVCC实现事务四大特性事务隔离级别锁实现概念实现事务隔离MVCC实现当前读与快照读实现事务隔离Read View总结事务隔离&#xff1a;从锁实现到MVCC实现 面试的时候被面试官问到&#xff1a;你这个项目为什么使用了可重复读而不选择读已提…

小架构step系列18:工具

1 概述 在写代码的时候&#xff0c;有很多通用的、与业务无关逻辑&#xff0c;这些一般写成工具类方法。这些工具类方法慢慢地被积累起来&#xff0c;变成了开源包&#xff0c;可以直接使用开源包&#xff0c;而不是自己再花时间来重复造这些轮子。 这些工具类的开源包比较多…

网络、CentOS 系统、数据库面试知识点总结

文章目录Linux CentOS 面试知识点整理速查复习✅ 一、Linux 高频面试题✅ 二、MySQL 高频面试题✅ 三、计算机网络&#xff08;OSI四层模型&#xff09;高频面试题&#x1f517; 链路层&#xff08;Link Layer&#xff09;&#x1f310; 网络层&#xff08;Internet Layer&…

Vue (Official) v3.0.2 新特性 为非类npm环境引入 globalTypesPath 选项

目录 前言 报错信息 原因 解决方案 总结 前言 在早上更新了vscode后&#xff0c;发现自己 uni-app 项目的 .vue文件 的 template 标签都出现了报错。定位到了问题是因为 Vue (Official) 插件更新导致的&#xff0c;重装了插件的上一个小版本&#xff0c;报错消失&#xff…

程序可能的输出

#include "csapp.h"int main() {int x 3;if (Fork() ! 0)printf("x%d\n", x);printf("x%d\n", --x);exit(0); }分析&#xff1a;父进程先执行printf("x%d\n", x); 输出x4。后执行 printf("x%d\n", --x);输出x3。子进程只执…

2025年UDP应用抗洪指南:从T级清洗到AI免疫,实战防御UDP洪水攻击

一次未防护的UDP暴露&#xff0c;可能让日活百万的应用瞬间瘫痪&#xff0c;损失超千万2025年&#xff0c;随着物联网僵尸网络规模指数级增长及AI驱动的自适应攻击工具泛滥&#xff0c;UDP洪水攻击峰值已突破8Tbps&#xff0c;单次攻击成本却降至50元以下。更致命的是&#xff…

centos7安装MySQL8.4手册

目录前言一、首先更新插件&#xff0c;并查看当前系统版本二、安装步骤1、创建mysql目录2、安装rpm包3、安装 mysql-community-server4、启动MySQL服务5、查看MySQL状态6、设置开机自启动三、查看默认密码四、登录mysql五、修改密码六、开启远程访问1. 修改 MySQL 配置文件2. 重…

人脸检测算法——SCRFD

SCRFD算法核心解析 1. 算法定义与背景 SCRFD&#xff08;Sample and Computation Redistribution for Efficient Face Detection&#xff09;由Jia Guo等人于2021年在arXiv提出&#xff0c;是一种高效、高精度的人脸检测算法&#xff0c;其核心创新在于&#xff1a; 双重重分…

vue3+ts+elementui-表格根据相同值合并

代码<div style"height: auto; overflow: auto"><el-table ref"dataTableRef" v-loading"loading" :data"pageData" highlight-current-row borderselection-change"handleSelectionChange" :span-method"obj…

UI前端与数字孪生融合案例:智慧城市的智慧停车引导系统

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;停车难的 “城市痛点” 与数字孪生的破局之道当司机在商圈绕圈 30 分钟仍…

java+vue+SpringBoot集团门户网站(程序+数据库+报告+部署教程+答辩指导)

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿ppt部署教程代码讲解代码时间修改工具 技术实现 开发语言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot数据库&#xff1a;mysql 开发工具 JDK版本&#xff1a;JDK1.8 数…

【Docker基础】Docker-compose从入门到精通:安装指南与核心命令全解析

目录 前言 1 Docker-compose核心概念解析 1.1 什么是Docker-compose&#xff1f; 1.2 典型应用场景 2 Docker-compose离线安装详解 2.1 离线安装背景与优势 2.2 详细安装步骤 步骤1&#xff1a;获取离线安装包 步骤2&#xff1a;文件部署与权限设置 步骤3&#xff1a…