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.rhkb.cn/news/245745.html

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

相关文章

防火墙在企业园区出口安全方案中的应用(ENSP实现)

拓扑图 需求&#xff1a; 1、企业出口网关设备必须具备较高的可靠性&#xff0c;为了避免单点故障&#xff0c;要求两台设备形成双机热备状态。当一台设备发生故障时&#xff0c;另一台设备会接替其工作&#xff0c;不会影响业务正常运行。 2、企业从两个ISP租用了两条链路&…

HTML-表格

表格 1.基本结构 一个完整的表格由&#xff1a;表格标题、表格头部、表格主体、表格脚注&#xff0c;四部分组成 表格涉及到的标签&#xff1a; table&#xff1a;表格 caption&#xff1a;标题 thead&#xff1a;表格头部 tbody&#xff1a;表格主体 tfoot&#xff1a;表格注…

算法基础之树状数组

文章目录 树状数组 树状数组 树状数组能解决的最关键的问题就是能够 O ( log ⁡ n ) O(\log n) O(logn)内&#xff0c;给某个位置上的数&#xff0c;加上一个数&#xff0c;或者求前缀和 他和前缀和数组的区别就是&#xff0c;树状数组支持修改原数组的内容&#xff0c;而前缀…

2.数据结构 顺序表(自留笔记)

文章目录 一.静态顺序表&#xff1a;长度固定二.动态顺序表1.下面证明原地扩容和异地扩容代码如下&#xff1a;2.下面是写一段Print&#xff0c;打印数字看看&#xff1a;3.头插4.尾删5.头删6.越界一定会报错吗7.下标插入8.下标删除9.查找数字10.应用&#xff1a;利用顺序表写一…

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资…

项目测试 手机系统 改串号 写IMEI 改MEID 改手机型号 等信息配置信息 演示视频 和一键新机

项目测试 手机系统 改串号 写IMEI 改MEID 改手机型号 等信息配置信息 演示视频 和配置说明 项目-手机系统支持直接改串号 IMEI MEID 手机型号 等信息配置信息 演示视频 支持 条形码 SN IMEI 1 IMEI 2 MEID 唯一SN 蓝牙地址 wifi地址 mac "一键新机"这个术语通常出现…

HTML-表单

表单 概念&#xff1a;一个包含交互的区域&#xff0c;用于收集用户提供的数据。 1.基本结构 示例代码&#xff1a; <form action"https://www.baidu.com/s" target"_blank" method"get"><input type"text" name"wd&q…

Spring 的存储和获取Bean

文章目录 获取 Spring 上下文对象的方式存储 Bean 对象的方式类注解配置扫描路径&#xff08;必须&#xff09;Controller&#xff08;控制器存储&#xff09;Service&#xff08;服务&#xff09;Repository&#xff08;持久层&#xff09;Component&#xff08;工具&#xff…

【WPF.NET开发】WPF 中的 Layout

本文内容 元素边界框布局系统测量和排列子元素面板元素和自定义布局行为布局性能注意事项子像素渲染和布局舍入 本主题介绍 Windows Presentation Foundation (WPF) 布局系统。 了解布局计算发生的方式和时间对于在 WPF 中创建用户界面非常重要。 1、元素边界框 在 WPF 中构…

【mongoDB】集合的创建和删除

目录 1.集合的创建 2. 查看所有集合 3.删除集合 1.集合的创建 格式&#xff1a; db.createCollection ( name ) 例如创建一个名为 bbb 的集合 还可以通过传递一个选项对象来指定集合的属性&#xff0c;例如最大文档的大小&#xff0c;索引选项等 例如 这样创建了一个名为 cc…

TCP 三次握手以及滑动窗口

TCP 三次握手 简介&#xff1a; TCP 是一种面向连接的单播协议&#xff0c;在发送数据前&#xff0c;通信双方必须在彼此间建立一条连接。所谓的 “ 连接” &#xff0c;其实是客户端和服务器的内存里保存的一份关于对方的信息&#xff0c;如 IP 地址、端口号等。 TCP 可以…

人工智能的未来展望:自然语言处理(NLP)与计算机视觉(CV)

NLP和CV是人工智能的两个重要分支&#xff0c;它们在处理和分析信息方面有不同的侧重点和挑战。 NLP&#xff08;自然语言处理&#xff09;旨在让计算机理解和生成人类语言&#xff0c;主要处理的是文本信息。NLP的研究和应用主要集中在如何让计算机理解和生成人类语言&#x…

Github 无法正常访问?一招解决

查询IP网址: https://ip.chinaz.com/ 主页如下&#xff1a; 分别查询以下三个网址的IP&#xff1a; github.com github.global.ssl.fastly.net assets-cdn.github.com 修改 hosts 文件&#xff1a; 将 /etc/hosts 复制到 home 下 sudo cp /etc/hosts ./ gedit hosts 在底下…

开源模型部署及使用

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

(数据结构练习题)合并两个有序数组

&#x1f308;前言&#xff1a;在刷题过程中发现超精简的代码。 力扣链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 &#x1f4ab;正文 首先这是题目内容&#xff0c;大家看到这个题时肯定会有很多不同的做法比如遍历链表将两个链表…

shared_ptr 与 unique_ptr 的转换 笔记

推荐B站文章&#xff1a; 6.shared_ptr与unique_ptr_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p6&vd_sourcea934d7fc6f47698a29dac90a922ba5a3我的往期文章&#xff1a; 独占指针&#xff1a;unique_ptr 与 函数调用-CSDN博客https://blog.csdn.n…

ChatGPT 和文心一言 | 两大AI助手哪个更胜一筹

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

TryHackMe-Umbrella

靶场介绍 Breach Umbrella Corp’s time-tracking server by exploiting misconfigurations around containerisation. 利用集装箱化的错误配置&#xff0c;破坏Umbrella公司的时间跟踪服务器。 Task 1 What is the DB password? 数据库的密码是多少&#xff1f; 端口扫描&am…

农业四情监测系统的工作原理

TH-Q3农业四情监测系统的工作原理主要涉及感知层、传输层、应用层和决策层四个部分。 首先&#xff0c;感知层负责通过各种传感器和检测设备对农作物、土壤、气象等因素进行实时监测。例如&#xff0c;土壤湿度传感器可以测量土壤的体积含水量&#xff0c;而自动监测系统则可以…

Tomcat运维

目录 一、Tomcat简介 二、系统环境说明 1、关闭防火墙&#xff0c;selinux 2、安装JDK 3、安装Tomcat 三、Tomcat目录介绍 1、tomcat主目录介绍 2、webapps目录介绍 3、Tomcat配置介绍&#xff08;conf&#xff09; 4、Tomcat的管理 四、Tomcat 配置管理页面(了解) …