【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
英文地址,請注明出處:http://en.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…