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

news2024/10/6 16:31:33

目录

  • 一、什么是沉浸式阅读器
    • 将内容划分开来提高可读性
    • 显示常用字词的图片
    • 突出显示语音的各个部分
    • 朗读内容
    • 实时翻译内容
    • 将单词拆分为音节
  • 二、沉浸式阅读器如何工作?
    • 环境准备
    • 创建 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#chunk
                    const 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#options
                    const 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.coloradmin.cn/o/1412099.html

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

相关文章

Dify学习笔记-工具(七)

1、工具 工具定义 工具可以扩展 LLM 的能力&#xff0c;比如联网搜索、科学计算或绘制图片&#xff0c;赋予并增强了 LLM 连接外部世界的能力。Dify 提供了两种工具类型&#xff1a;第一方工具和自定义工具。 你可以直接使用 Dify 生态提供的第一方内置工具&#xff0c;或者轻…

基于Java的高校运动会管理系统的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的 系统功能测试 系统测试结论 代码参考 数据库参考 源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、…

倍增算法笔记

主要应用场景 RMQ&#xff1a;区间最值问题 LCA&#xff1a;最近公共祖先问题 RMQ问题——区间最值 如果用数组f[N]存储,用数组a[i][j]表示从第i个数起连续 2^j 个数中的最大值,[i,i 2^j - 1],显然a[i][0] f[i],则很容易得到状态转移方程: a[i][j] max(a[i][j - 1], a[i …

免 费 小程序商城搭建之鸿鹄云商 SAAS云产品概述

【SAAS云平台】打造全行业全渠道全场景的SaaS产品&#xff0c;为店铺经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营…

Java Web(五)--DOM

介绍 DOM 全称是 Document Object Model 文档对象模型&#xff1b; DOM 是 W3C&#xff08;万维网联盟&#xff09;的标准。 DOM 定义了访问 HTML 和 XML 文档的标准&#xff1a; "W3C 文档对象模型 &#xff08;DOM&#xff09; 是中立于平台和语言的接口&#xff0…

伊恩·斯图尔特《改变世界的17个方程》薛定谔方程笔记

想法是等这学期学到薛定谔方程后再把整份完善下。 它告诉我们什么&#xff1f; 这个方程不是把物质作为粒子&#xff0c;而是作为波&#xff0c;并描述这样的波如何传播。 为什么重要&#xff1f; 薛定谔方程是量子力学的基础&#xff0c;它与广义相对论一起构成了当今最有效的…

JAVA_EE_api_中英文对照版

点击即可下载&#xff1a; JAVA_EE_api_中英文对照版

外包干了4个月,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了差不多4年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能…

K/HW/E03-SY850/150型测宽测厚组合测量仪

关键字:测宽测厚组合测量仪,扁钢测宽仪器,板材测厚仪器,冷轧测宽测厚设备,组合测量仪, 产品简介&#xff1a; 设备同时对扁钢或钢板的宽度和厚度进行即时测量 基本原理 该设备共设置2只二维激光测量传感器和2只激光位移传感器。二维传感器设置在两侧&#xff0c;可根据板材厚…

(2)(2.8) Holybro 900Mhz XBP9X无线电遥测设备

文章目录 前言 1 特点 2 规格 3 电源 4 引脚输出 5 下载 前言 Holybro XBP9X 无线电设备可使用 Digi 免费的 XCTU 软件或通过 Digi 简化的 AT 或 API 命令集轻松进行配置。无线电台采用 256 位 AES 加密技术&#xff0c;可在设备之间安全可靠地传输关键数据。无线电的射…

TCP 三次握手以及滑动窗口

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

Ceph篇之利用Prometheus监控ceph服务

一、Ceph内置模块 Ceph manager 内部的模块中包含了 prometheus 的监控模块,并监听在每个 manager 节点的 9283 端口&#xff0c;该端口用于将采集到的信息通过 http 接口向 prometheus 提供数据。 二、监控搭建 1、启用 prometheus 监控模块 ceph mgr module enable promethe…

C++技术要点总结, 面试必备, 收藏起来慢慢看

目录 1. 语言对比 1.1 C 11 新特性 2.2 C 和 C 的区别 2.3 Python 和 C 的区别 2. 编译内存相关 2.1. C 程序编译过程 2.2. C 内存管理 2.3. 栈和堆的区别 2.4. 变量的区别 2.5. 全局变量定义在头文件中有什么问题&#xff1f; 2.6. 内存对齐 2.7. 什么是内存泄露 …

vue中使用canvas给图片绘制水印,即使下载图片也是带水印的

先看效果 话不多说直接上组件 1、Watermark.vue <template><div><canvas ref"canvas" :width"width" :height"height"></canvas></div> </template><script>export default {props: {// 图片地址ur…

Linux命令拓展

一、tr - 字符转换 效果展示&#xff1a; 将小写转换成大写 字符压缩 通式&#xff1a;tr -s 字符删除 通式&#xff1a;tr -d 补集 通式&#xff1a;tr -c 用法&#xff1a;随机密码 二、cut - 提取 通式&#xff1a;cut [选项] 文件 选项&#xff1a; -d&#xff1a;分隔符…

RT-Thread: 串口操作、增加串口、串口函数

说明&#xff1a;本文记录RT-Thread添加串口的步骤和串口的使用。 1.新增串口 官方链接&#xff1a;https://www.rt-thread.org/document/site/rtthread-studio/drivers/uart/v4.0.2/rtthread-studio-uart-v4.0.2/ 新增串口只需要在 board.h 文件中定义相关串口的宏定…

构建未来学堂:在线教育系统开发技术实践

在当今数字化时代&#xff0c;在线教育系统的开发越发显得至关重要。本文将带你深入了解在线教育系统的开发&#xff0c;涉及到关键的技术实践和代码示例。我们将采用现代化技术栈&#xff0c;为未来学堂的搭建提供实用的指南。 技术栈选择 在开始实际的开发之前&#xff0c…

ETL能实现什么流程控制方式?

随着大数据时代的到来&#xff0c;数据处理工具成为各个行业中不可或缺的一部分。运用数据处理工具&#xff0c;能够大幅度帮助开发人员进行数据处理等工作&#xff0c;以及能够更好的为企业创造出有价值的数据。那在使用ETL工具时&#xff0c;我们往往会通过ETL平台所携带的组…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-11 HTML5 表单验证

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>HTML5 表单验证</title> </head><body> <form action"#" method"get" novalidate>请输入您的邮箱:<input type&q…

训练YOLOv5模型(云端GPU)

Colab 选择GPU 查看配置 ! nvidia-smi上传压缩包并解压 压缩包 -> 解压的文件 !unzip /content/yolov5-5.0.zip -d/content/yolov5进入目标文件夹下 %cd /content/yolov5/yolov5-5.0安装所需包package !pip install -r requirements.txt添加插件-Tensorboard 失败的话…