Azure AI - 沉浸式阅读器,阅读障碍用户福音

目录

  • 一、什么是沉浸式阅读器
    • 将内容划分开来提高可读性
    • 显示常用字词的图片
    • 突出显示语音的各个部分
    • 朗读内容
    • 实时翻译内容
    • 将单词拆分为音节
  • 二、沉浸式阅读器如何工作?
    • 环境准备
    • 创建 Web 应用项目
    • 设置身份验证
      • 配置身份验证值
      • 安装标识客户端 NuGet 包
      • 更新控制器以获取令牌
    • 添加示例内容
    • 添加 JavaScript 以处理启动沉浸式阅读器
    • 生成并运行应用
    • 启动沉浸式阅读器

[沉浸式阅读器]是 [Azure AI 服务]的一部分,它是一款采用包容性设计的工具,通过应用可靠的技术,帮助提高新读者、语言学习者和有学习差异(如阅读障碍)的用户的阅读理解能力。 通过沉浸式阅读器客户端库,你可利用 Microsoft Word 和 Microsoft OneNote 中所用的相同技术来改进 Web 应用程序。

关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人

一、什么是沉浸式阅读器

沉浸式阅读器旨在让每个人都能更轻松、更方便地阅读。 让我们看一下沉浸式阅读器的一些核心功能。

将内容划分开来提高可读性

沉浸式阅读器可将内容划分开来提高可读性。

file

显示常用字词的图片

对于常用字词,沉浸式阅读器将显示图片。
file

突出显示语音的各个部分

沉浸式阅读器可突出显示动词、名词、代词等内容,用于帮助学习者了解语音和语法的各个部分。
file

朗读内容

语音合成(或文本转语音)已嵌入到沉浸式阅读器服务中,可让读者选择要朗读的文本。
file

实时翻译内容

沉浸式阅读器可将文本实时翻译成多种语言。 这有助于提高读者学习新语言时的理解力。
file

将单词拆分为音节

通过沉浸式阅读器,可将单词拆分为音节,以提高可读性或读出新单词。

file

二、沉浸式阅读器如何工作?

沉浸式阅读器是一款独立的 Web 应用程序。 使用沉浸式阅读器调用客户端库时,将显示在 iframe 中的现有 Web 应用程序的顶部。 当 Web 应用程序调用沉浸式阅读器服务时,你可以指定要向阅读器显示的内容。 沉浸式阅读器客户端库会处理 iframe 的创建和样式设定,以及与沉浸式阅读器后端服务的通信。 沉浸式阅读器服务会处理语音各部分、文本转语音、翻译等的内容。

环境准备

  • Azure 订阅 - 免费创建订阅
  • Visual Studio 2022
  • 为 Microsoft Entra 身份验证配置的沉浸式阅读器资源。

创建 Web 应用项目

在 Visual Studio 中使用具有内置“模型-视图-控制器”的 ASP.NET Core Web 应用程序模板和 ASP.NET Core 6 创建一个新项目。 将该项目命名为“QuickstartSampleWebApp”。
file
file
file

设置身份验证

配置身份验证值

右键单击_解决方案资源管理器_中的项目,然后选择“管理用户机密”。 这将打开一个名为 secrets.json 的文件。 此文件未签入到源代码管理中。 将 secrets.json 的内容替换为以下内容,并提供在创建沉浸式阅读器资源时给出的值。

{"TenantId": "YOUR_TENANT_ID","ClientId": "YOUR_CLIENT_ID","ClientSecret": "YOUR_CLIENT_SECRET","Subdomain": "YOUR_SUBDOMAIN"
}

安装标识客户端 NuGet 包

以下代码使用 Microsoft.Identity.Client NuGet 包中的对象,因此将需要在项目中添加对该包的引用。

从“工具”->“NuGet 包管理器”->“包管理器控制台”打开 NuGet 包管理器控制台,并运行以下命令:

    Install-Package Microsoft.Identity.Client -Version 4.42.0

更新控制器以获取令牌

打开 Controllers\HomeController.cs,然后在该文件顶部的 using 语句后添加以下代码。

using Microsoft.Identity.Client;

现在,我们将配置控制器以从 secrets.json 获取 Microsoft Entra ID 值。 在 HomeController 类的顶部,在 public class HomeController : Controller { 之后添加以下代码。

private readonly string TenantId;     // Azure subscription TenantId
private readonly string ClientId;     // Azure AD ApplicationId
private readonly string ClientSecret; // Azure AD Application Service Principal password
private readonly string Subdomain;    // Immersive Reader resource subdomain (resource 'Name' if the resource was created in the Azure portal, or 'CustomSubDomain' option if the resource was created with Azure CLI PowerShell. Check the Azure portal for the subdomain on the Endpoint in the resource Overview page, for example, 'https://[SUBDOMAIN].cognitiveservices.azure.com/')private IConfidentialClientApplication _confidentialClientApplication;
private IConfidentialClientApplication ConfidentialClientApplication
{get {if (_confidentialClientApplication == null) {_confidentialClientApplication = ConfidentialClientApplicationBuilder.Create(ClientId).WithClientSecret(ClientSecret).WithAuthority($"https://login.windows.net/{TenantId}").Build();}return _confidentialClientApplication;}
}public HomeController(Microsoft.Extensions.Configuration.IConfiguration configuration)
{TenantId = configuration["TenantId"];ClientId = configuration["ClientId"];ClientSecret = configuration["ClientSecret"];Subdomain = configuration["Subdomain"];if (string.IsNullOrWhiteSpace(TenantId)){throw new ArgumentNullException("TenantId is null! Did you add that info to secrets.json?");}if (string.IsNullOrWhiteSpace(ClientId)){throw new ArgumentNullException("ClientId is null! Did you add that info to secrets.json?");}if (string.IsNullOrWhiteSpace(ClientSecret)){throw new ArgumentNullException("ClientSecret is null! Did you add that info to secrets.json?");}if (string.IsNullOrWhiteSpace(Subdomain)){throw new ArgumentNullException("Subdomain is null! Did you add that info to secrets.json?");}
}/// <summary>
/// Get an Azure AD authentication token
/// </summary>
public async Task<string> GetTokenAsync()
{const string resource = "https://cognitiveservices.azure.com/";var authResult = await ConfidentialClientApplication.AcquireTokenForClient(new[] { $"{resource}/.default" }).ExecuteAsync().ConfigureAwait(false);return authResult.AccessToken;
}[HttpGet]
public async Task<JsonResult> GetTokenAndSubdomain()
{try{string tokenResult = await GetTokenAsync();return new JsonResult(new { token = tokenResult, subdomain = Subdomain });}catch (Exception e){string message = "Unable to acquire Azure AD token. Check the console for more information.";Debug.WriteLine(message, e);return new JsonResult(new { error = message });}
}

添加示例内容

首先,打开 Views\Shared\Layout.cshtml。 在行 </head> 之前,添加以下代码:

@RenderSection("Styles", required: false)

现在,我们将向此 Web 应用添加示例内容。 打开 Views\Home\Index.cshtml,并将所有自动生成的代码替换为以下示例:

@{ViewData["Title"] = "Immersive Reader C# Quickstart";
}@section Styles {<style type="text/css">.immersive-reader-button {background-color: white;margin-top: 5px;border: 1px solid black;float: right;}</style>
}<div class="container"><button class="immersive-reader-button" data-button-style="iconAndText" data-locale="en"></button><h1 id="ir-title">About Immersive Reader</h1><div id="ir-content" lang="en-us"><p>Immersive Reader is a tool that implements proven techniques to improve reading comprehension for emerging readers, language learners, and people with learning differences.The Immersive Reader is designed to make reading more accessible for everyone. The Immersive Reader<ul><li>Shows content in a minimal reading view</li><li>Displays pictures of commonly used words</li><li>Highlights nouns, verbs, adjectives, and adverbs</li><li>Reads your content out loud to you</li><li>Translates your content into another language</li><li>Breaks down words into syllables</li></ul></p><h3>The Immersive Reader is available in many languages.</h3><p lang="es-es">El Lector inmersivo está disponible en varios idiomas.</p><p lang="zh-cn">沉浸式阅读器支持许多语言</p><p lang="de-de">Der plastische Reader ist in vielen Sprachen verfügbar.</p><p lang="ar-eg" dir="rtl" style="text-align:right">يتوفر \"القارئ الشامل\" في العديد من اللغات.</p></div>
</div>

请注意,所有文本都有一个 lang 属性,该属性描述了文本的语言。 此属性可帮助沉浸式阅读器提供相关的语言和语法功能。

添加 JavaScript 以处理启动沉浸式阅读器

沉浸式阅读器库提供了启动沉浸式阅读器和呈现沉浸式阅读器按钮等功能。

Views\Home\Index.cshtml 的底部,添加以下代码:

@section Scripts
{<script src="https://ircdname.azureedge.net/immersivereadersdk/immersive-reader-sdk.1.4.0.js"></script><script>function getTokenAndSubdomainAsync() {return new Promise(function (resolve, reject) {$.ajax({url: "@Url.Action("GetTokenAndSubdomain", "Home")",type: "GET",success: function (data) {if (data.error) {reject(data.error);} else {resolve(data);}},error: function (err) {reject(err);}});});}$(".immersive-reader-button").click(function () {handleLaunchImmersiveReader();});function handleLaunchImmersiveReader() {getTokenAndSubdomainAsync().then(function (response) {const token = response["token"];const subdomain = response["subdomain"];// Learn more about chunk usage and supported MIME types https://learn.microsoft.com/azure/ai-services/immersive-reader/reference#chunkconst data = {title: $("#ir-title").text(),chunks: [{content: $("#ir-content").html(),mimeType: "text/html"}]};// Learn more about options https://learn.microsoft.com/azure/ai-services/immersive-reader/reference#optionsconst options = {"onExit": exitCallback,"uiZIndex": 2000};ImmersiveReader.launchAsync(token, subdomain, data, options).catch(function (error) {alert("Error in launching the Immersive Reader. Check the console.");console.log(error);});}).catch(function (error) {alert("Error in getting the Immersive Reader token and subdomain. Check the console.");console.log(error);});}function exitCallback() {console.log("This is the callback function. It is executed when the Immersive Reader closes.");}</script>
}

生成并运行应用

在菜单栏中,选择“调试”>“开始调试”,或按 F5 启动应用程序。

在浏览器中,应该看到:
file

启动沉浸式阅读器

选择“沉浸式阅读器”按钮后,将会看到沉浸式阅读器随页面上的内容一起启动。
file

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

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

相关文章

《ORANGE’S:一个操作系统的实现》读书笔记(三十八)尾声(三)

这篇文章是尾声的第三部分&#xff0c;也是《ORANGE’S&#xff1a;一个操作系统的实现》读书笔记的最后一篇文章&#xff0c;本篇文章记录如何将我们开发的OS安装到真实的计算机&#xff08;建议在虚拟机中进行&#xff09;。 将OS安装到真实的计算机 其实安装到真实的硬盘和…

JS slice() 方法总结

在JavaScript中&#xff0c;有一种数组方法叫做slice()&#xff0c;它基于给定的起始和结束位置&#xff0c;创建一个新的数组副本。该方法能够将数组的一部分切成另一个数组。 语法 array.slice(start, end) start: 可选参数&#xff0c;表示切片起始位置的索引。如果没有指…

《Linux C编程实战》笔记:信号的屏蔽

在《Linux C编程实战》笔记&#xff1a;信号的捕捉和处理-CSDN博客的sigaction的sa_mask成员&#xff0c;它的类型就是一个信号集&#xff0c;下面我们来介绍它 信号集 信号的总数目达64个&#xff0c;所以不能用一个整数表示它们的集合&#xff0c;int类型通常是4字节32位&a…

Linux | makefile简单教程 | Makefile的工作原理

前言 在学习完了Linux的基本操作之后&#xff0c;我们知道在linux中编写代码&#xff0c;编译代码都是要手动gcc命令&#xff0c;来执行这串代码的。 但是我们难道在以后运行代码的时候&#xff0c;难道都要自己敲gcc命令嘛&#xff1f;这是不是有点太烦了&#xff1f; 在vs中…

力扣646. 最长数对链

动态规划 思路&#xff1a; 思路与 力扣354. 俄罗斯套娃信封问题 类似将序列进行排序&#xff0c;然后假设 dp[i] 为第 i 个元素的最长数对链个数&#xff1b;则其状态转移方程&#xff1a; 第 i 个元素之前的某一个元素&#xff08;假设是下标是 j&#xff09;&#xff0c;如…

KVM部署Alibaba Cloud Linux操作系统

下载镜像文件 下载链接&#xff1a;https://mirrors.aliyun.com/alinux/image/?spma2c4g.11186623.0.0.79ed5af6pehv54 下载文件&#xff1a;aliyun_3_x64_20G_nocloud_alibase_20230727.qcow2 部署KVM虚拟化环境 yum -y install qemu libvirt rr-testsuite systemctl star…

[SUCTF 2019]CheckIn1

黑名单过滤后缀’ph&#xff0c;并且白名单image类型要有对应文件头 对<?过滤&#xff0c;改用GIF89a<script languagephp>eval($_POST[cmd]);</script>&#xff0c;成功把getshell.gif上传上去了 尝试用.htaccess将上传的gif当作php解析&#xff0c;但是失败…

美工前端和数据对接一起做的可视化大屏开发项目工期一周足矣

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 可视化大屏已经成为企业和组织中不可或缺的一部分。它不仅可以帮助企业更好地展示业务数…

[docker] Docker的私有仓库部署——Harbor

一、Docker原生私有仓库—— Registry 1.1 Registry的简单了解 关于Docker的仓库分为私有库和公有仓库&#xff0c;共有仓库只要在官方注册用户&#xff0c;登录即可使用。但对于仓库的使用&#xff0c;企业还是会有自己的专属镜像&#xff0c;所以私有库的搭建也是很有必要的…

jQuery实现选择方法和保护信息方法

最近呢&#xff01;一直在学习jQuery语法&#xff0c;也没时间发布文章&#xff0c;现在学的差不多了&#xff0c;先跟大家分享下学习感受吧&#xff01;JavaScript学过后&#xff0c;再学习jQuery语法&#xff0c;应该是简单的&#xff0c;但我总是容易把它们搞混&#xff0c;…

开源模型部署及使用

开源模型部署及使用 1.Langchain-Chatchat1.环境2.运行3.效果 2.facefusion1.环境2.运行3.效果 3.Aquila1.环境2.运行 1.Langchain-Chatchat Langchain-Chatchat这里面可以调用许多模型&#xff0c;我本地下载了chatglm3模型文件&#xff0c;所以就用这个模型。 1.环境 根据…

牛客网---------[USACO 2016 Jan S]Angry Cows

题目描述 Bessie the cow has designed what she thinks will be the next big hit video game: "Angry Cows". The premise, which she believes is completely original, is that the player shoots cows with a slingshot into a one-dimensional scene consistin…

实现负载均衡

1.安装依赖 sudo apt insta11 libgd-dev 2.下载nginx wget http://nginx.org/download/nginx-1.22.1.tar.gz 3.解压nginx tar -zvxf nginx-1.22.1.tar.g2 4.编译安装 cd nginx-1.22.1 5.编译并指定安装位置&#xff0c;执行安装之后会创建指定文件夹/www/env/nginx ./configure…

【大数据】流处理基础概念(二):时间语义(处理时间、事件时间、水位线)

流处理基础概念&#xff08;一&#xff09;&#xff1a;Dataflow 编程基础、并行流处理流处理基础概念&#xff08;二&#xff09;&#xff1a;时间语义&#xff08;处理时间、事件时间、水位线&#xff09;流处理基础概念&#xff08;三&#xff09;&#xff1a;状态和一致性模…

使用pysimplegui+opencv编写一个摄像头的播放器

需求 使用pysimplegui和opencv实现一个播放器&#xff0c;播放 摄像头的画面。 代码实现 import cv2 import time from typing import Iterable, NamedTuple, Optionalimport PySimpleGUI as sgclass CameraSpec(NamedTuple):name: strindex: intwidth: intheight: intfps: i…

c# ADODB.Recordset实例调用Fields报错

代码&#xff1a; using System; using System.CodeDom; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ADODB;namespace ConsoleApp1 {internal class Programre{static ADODB.Recordset recordsetInstance…

代码随想录刷题笔记 DAY15 | 翻转二叉树 No.226 | 对称二叉树 No.101

Day 15 01. 翻转二叉树&#xff08;No. 226&#xff09; 题目链接 代码随想录题解 1.1 题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9…

Odoo14 中的小部件列表

们有不同类型的小部件用于不同的目的&#xff0c;帮助我们简化操作。小部件用于使代码变得简单且用户友好&#xff0c;这将有助于软件的编码和编程方面。在 Odoo 14 开发中&#xff0c;我们可以利用不同的小部件&#xff0c;这些小部件可用于编程操作的某些特定方面。这些简化工…

Oracle Linux 9.3 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

微信小程序元素/文字在横向和纵向实现居中对齐、两端对齐、左右对齐、上下对齐

元素对齐往往是新学者的一大困惑点&#xff0c;在此总结常用的各种元素和文字对齐方式以供参考&#xff1a; 初始显示 .wxml <view style"width: 100%;height: 500rpx; background-color: lightgray;"><view style"width: 200rpx;height:100rpx;bac…