音频数据上的会话情感分析

情感分析,也被称为观点挖掘,是自然语言处理(NLP)中一个流行的任务,因为它有着广泛的工业应用。在专门将自然语言处理技术应用于文本数据的背景下,主要目标是训练出一个能够将给定文本分类到不同情感类别的模型。下图给出了情感分类器的高级概述。

例如,三类分类问题的类可以是 Positive 、 Negative 和 Neutral 。三类情感分析问题的一个例子是流行的 Twitter 情感分析数据集(https://www.kaggle.com/datasets/jp797498e/twitter-entity-sentiment-analysis),这是一个实体级别的情感分析任务,针对 Twitter 上不同用户发布的多语言推文。

尽管以往大多数自然语言处理(NLP)研究和开发主要集中在对文本进行情感分析,但最近我们看到语音互动工具已被广泛采用和流行,使得研究人员和组织着手构建语音领域的情感分类器。

因此,这篇文章将演示如何使用 AssemblyAI API 和 Python 在对话数据上构建情感分析系统。端到端系统在涉及严格客户支持和反馈评估的领域有广泛的适用性,这使其成为一个重要而有价值的问题,特别是在语音领域。最后,我还将进行深入分析,以增强所得结果的可解释性,并从数据中得出适当的见解。

本文的代码在这里:https://deepnote.com/workspace/jacky-su-683574b3-f209-4c4a-871f-2917f8e4b220/project/Conversational-Sentiment-Analysis-Duplicate-4d2c8161-1773-4114-a416-d37e393c3ee5/notebook/sentiment%20analysis-0476d5b83f0346d3958dba74bc803e83。
文中有很多处本应该有嵌入代码,但是CSDN编辑器不支持展示,所以最好对照着代码链接来看文章,代码链接中的代码也是按照本文的目录结构分的,所以很容易对应。

对话音频数据的情感分析

在这一部分,我将演示如何使用 AssemblyAI API 将给定录音对话中的单句分类为三种情感类别: Positive 、 Negative 和 Neutral 。

步骤 1:安装要求

构建情感分类器的要求非常少。就 Python 库而言,我们只需要 requests 包。可以按照以下方式进行:

pip install requests

步骤 2:生成您的 API 令牌

下一步是在 AssemblyAI 网站(https://www.assemblyai.com/)上创建一个免费账户。完成后,您将获得私有 API 访问密钥,我们将使用它来访问语音转文本模型。

第 3 步:上传音频文件

为了完成本教程,我将使用两人之间的预录音对话来执行情感分析。一旦您获得 API 密钥,就可以开始对预录音文件进行情感分类任务。

然而,在此之前,您需要上传音频文件,以便通过 URL 访问。选项包括上传到 AWS S3 存储桶、SoundCloud 等音频托管服务,或 AssemblyAI 的自托管服务等。我已将音频文件上传到 SoundCloud,可以在下面访问。

如果您希望将音频文件直接上传到 AssemblyAI 的托管服务,您也可以这样做。我已在下面的代码块中逐步演示了这一步骤。

步骤 3.1:导入需求

我们从导入项目所需的要求开始。

步骤 3.2:指定文件位置和 API_Key

接下来,我们需要指定本地机器上音频文件的位置以及注册后获得的 API 密钥。

第 3.3 步:指定上传端点

  • endpoint : 这指定了要调用的服务,在本例中是"上传"服务。
  • headers :这包含了 API 密钥和内容类型。

步骤 3.4:定义上传函数

音频文件一次最多只能上传 5MB(5,242,880 字节)。因此需要分块上传数据,然后在服务端合并这些块。因此您无需担心处理大量 URL。

步骤 3.5:上传

最后一步是发起 POST 请求。POST 请求的响应是一个 JSON,其中包含了音频文件的 upload_url 。我将在执行音频情感分类的下一步骤中使用这个 URL。

第 4 步:情感分析

在这一步中,我们已经完成了执行对音频文件进行情感分析任务所需的所有必要前提条件。现在,我们可以继续调用 API 来获取所需的结果。这是一个分两步进行的过程,将在下面的小节中进行演示。

第 4.1 步:提交文件进行转录

第一步是调用一个 HTTP POST 请求。这实质上是将您的音频文件发送到后台运行的 AI 模型以进行转录,并指示它们对转录的文本执行情感分析。

发送到 POST 请求的参数是:

  1. endpoint :它指定要调用的转录服务。
  2. json :这包含你的音频文件的 URL 作为 audio_url 键。由于我们希望对对话数据进行情感分析, sentiment_analysis 标志和 speaker_labels 被设置为 True 。
  3. headers :这包含了 authorization 键和 content-type 。

在收到的 JSON 响应中,当前的 post 请求状态为 queued 。这表示音频正在进行转录。

此外, sentiment_analysis 标志也出现在 JSON 响应中。但是,与 sentiment_analysis_results 键相对应的值为 None,因为当前状态为 queued 。

步骤 4.2:获取转录结果

要检查我们的 POST 请求的状态,我们需要使用上面收到的 JSON 响应中的 id 键发出一个 GET 请求。

接下来,我们可以进行一个 GET 请求,如下面的代码块所示。

传递给 GET 请求的参数为:

  1. endpoint :这指定了通过 id 键确定的调用的服务和 API 调用标识符。
  2. headers :这里保存您的唯一 API 密钥。

在这里,您应该知道转录结果在 status 键变为 completed 之前是不会准备好的。转录所需的时间取决于输入音频文件的长度。因此,您必须定期重复 GET 请求来检查转录状态。下面实现了一种简单的方法:

情感分析结果

一旦 status 变为 completed ,您将收到类似于下面提到的响应。

  1. 在 JSON 响应中, status 被标记为 completed 。这表示在转录音频时没有出现错误。
  2. text 键包含了输入音频对话的全部转录文本,其中包括22个句子。
  3. 由于音频文件由多个扬声器组成,我们在 words 键中看到所有 speaker 键均为非空。 speaker 键要么为"A"要么为"B"。
  4. 我们可以看到所有个别单词和整个转录文本的置信度得分。该得分范围从 0 到 1,0 为最低,1 为最高。
  5. 对于音频中 22 个单独句子的情感分析结果可以通过 JSON 响应中的 sentiment_analysis_results 键访问。
  6. 与每个句子相对应,我们获得一个与上述第 4 点类似的 confidence 分数。
  7. 每个句子的情感可以使用句子字典的 sentiment 键来检索。以下显示了第二句的情感分析结果:

情感分析洞见

JSON 通常很难阅读和解释。因此,为了使数据更具有视觉吸引力,并进行进一步分析,让我们将上述情感分析结果转换为 DataFrame。我们将存储句子的 text 、 duration 、 speaker 和 sentiment 。下面是实现:

在上述代码生成的 DataFrame 如下图所示。其中包括对话中说的 22 句话,以及相应的说话者标签(“A"和"B”)、持续时间(秒)和模型预测的情绪。

演讲者的分布

每个演讲者发言的句子数量可以使用如下所示的 value_counts() 方法进行计算:

想查看说话人的百分比分布,可以像下面这样将 normalize = True 传递给 value_counts() 方法:

演讲者"A"和"B"在句子数量方面对对话做出了同等贡献。

扬声器持续时间分布

接下来,让我们计算对话中每位发言者的个人贡献。如下所示:

我们使用 groupby() 方法并计算他们演讲的总时长。A 人是演讲持续时间最长的主要演讲者。

#3 情绪分布

在通话过程中说的 22 句话中,只有三句被标记为 negative 情感。此外,没有任何一句被预测为 positive 情感。

正态分布可以按以下方式计算:

#4 发言人层面的情感分布

最后,让我们计算个人发言者的情感分布。这里,我们将使用 crosstab() 而不是 groupby() 方法来实现更好的可视化效果。这如下所示:

发言人"A"说出的否定性句子的比例高于发言人"B"。

#5 情感层面平均句子持续时间

最后,我们将计算属于个别情绪类别的句子的平均持续时间。这是使用 groupby() 方法实现的:

平均 negative 句子的持续时间小于 neutral 句子的持续时间。

总之,在这篇文章中,我们讨论了 AssemblyAI API 的一个特定的 NLP 用例。具体来说,我们看到如何在一个由多个说话者组成的预录音音频文件上构建一个情感分类模块。最后,我们对情感分析结果进行了深入分析。从 API 获得的结果突出了输入音频文件中 22 个单独句子的情感。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CTF Web】BUUCTF BUU LFI COURSE 1 Writeup(代码审计+PHP+文件包含漏洞)

BUU LFI COURSE 1 1 点击启动靶机。 解法 <?php /*** Created by PhpStorm.* User: jinzhao* Date: 2019/7/9* Time: 7:07 AM*/highlight_file(__FILE__);if(isset($_GET[file])) {$str $_GET[file];include $_GET[file]; }如果GET请求中接收到file参数&#xff0c;就会…

刷新方盒子最快10万销量纪录 捷途旅行者何以颠覆越野市场?

近年”方盒子“产品迅速崛起&#xff0c;在新一轮的市场角逐中&#xff0c;率先突围的并非传统豪强&#xff0c;而是首次进军越野市场的捷途汽车。作为“燃油车&#xff0c;”捷途旅行者&#xff0c;在面对纯电、混动等产品的强势围剿下&#xff0c;仅用时9个月便成为细分市场销…

Linux ip命令常用操作

ip 命令来自 iproute2 软件包&#xff0c;在 CentOS 7 中默认已安装&#xff08;yum install -y iproute&#xff09;。 iproute2 软件包提供了很多命令&#xff08;rpm -ql iproute |grep bin&#xff09;&#xff0c;如 ss 命令、bridge&#xff0c;这些命令可以完全替代 if…

Vue3 【实战】封装 useLocation

技术要点 通过 Vue3 的组合式API 仿写 react 中的 hook 代码实现 封装 hooks/useLocation.js import { reactive, onMounted, toRefs } from vue// 模拟异步获取 function getLocation(fail) {return new Promise((resolve) > {setTimeout(() > {if (fail) {// 模拟失败…

Vue3 使用audio播放语音+监听播放语音完成事件

需求&#xff1a;输入一段文字&#xff0c;点击语音框&#xff0c;将本地语音&#xff08;提前准备好的&#xff09; 播放出来 播放中效果 代码 <div class"listConAI" click"handleOpenSpeech" ><imgsrc"../../../../assets/images/blueo…

剪画小程序:自媒体必备神器:【视频翻译】自动识别语言、翻译、配音,让外语视频秒变母语!

Hello&#xff0c;大家好呀&#xff01;我是不会画画的小画~ 今天给大家带来一款敲实用的视频翻译工具一一 小程序【剪画】 我们有很小伙伴在学习他国语言时&#xff0c;最大的障碍就是语言的问题了&#xff0c;想要 理解其中的内容&#xff0c;在这之前要下很大的功夫去掌握…

Rust基础学习-Rust中的文件操作

文件结构 在Rust中&#xff0c;std::fs::File 结构体代表一个文件。它允许我们对文件执行读/写操作。文件 I/O 是通过提供与文件系统交互的功能的 std::fs 模块执行的。 File 结构体中的所有方法都返回std::io::Result的变体&#xff0c;或者简单地是 Result 枚举。这里会涉及…

猫熊超市管理系统

import java.util.Scanner;//增加商品类 //此类用来录入一个商品的所有属性&#xff0c;并作为结果对其返回 public class Add {public Goods add1() {Scanner scanner new Scanner(System.in);System.out.println("请输入商品名称");String name scanner.next();S…

android自定义系统广播 系统与app进行通信

使用场景 我们的定制软件需要在按下电源键时监听并播报软件信息&#xff0c;像我们之前做法是监听屏幕的开关 android.intent.action.SCREEN_ON 广播可以达到要求&#xff0c;但是定制系统CPU熄屏不休眠导致这个广播被拦截收不到了&#xff0c;所以我们就追踪到系统代码的Key…

resultType的类型错误

resultType的类型错误&#xff0c;不能是List而应该是对应的返回Bean对象的类型&#xff0c;VO 这里是引用 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: java.lang…

木叶飞舞之【机器人ROS2】篇章_第四节、ROS2非常简单的传参方式--利用NodeOptions和get_parameter方法

系列文章目录 木叶飞舞之【机器人ROS2】篇章_第一节、ROS2 humble及cartorgrapher安装 木叶飞舞之【机器人ROS2】篇章_第二节、turtlebot3安装 木叶飞舞之【机器人ROS2】篇章_第三节、给turtlebot3安装realsense深度相机 木叶飞舞之【机器人ROS2】篇章_第四节、ROS2非常简单的…

halcon 算子 get_grayval_interpolated BiCubic 插值验证

测试发现 halcon BiCubic基函数中的a-1.0

自适应手机端+电脑端企业建站网站系统源码 760多建站模版任意选择 带完整的安装代码包以及搭建教程

系统概述 随着互联网的迅猛发展&#xff0c;企业对于网站的需求日益增长。传统的建站方式往往存在着成本高、周期长、维护困难等问题&#xff0c;难以适应快速变化的市场环境。为了解决这些难题&#xff0c;我们的开发团队深入研究企业建站的痛点和需求&#xff0c;结合先进的…

【K8s】专题四(6):Kubernetes 控制器之 Job

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、基本介绍 二、工作原理 三、相关特性 四、资源清单&#xff08;示例&#xff09; 五…

如何在 Mac 上使用 Windows 版 Excel 的全部功能

作为 Mac 用户&#xff0c;你是否怀念 Excel 的一些关键功能&#xff1f;是不是在 Mac 版 Excel 中找不到全面的 VBA、Active X 和表单控件、智能标签、Power Pivot 等关键工具&#xff1f;Mac 用户们&#xff0c;其实你不必错过这些功能。终极解决方案就是&#xff1a;通过 Pa…

为啥要在虚拟机上搞开发呢:一个码农的Mac折腾史

作为一个码农&#xff0c;我一直在不停地学习新技术&#xff0c;适应新环境。但说实话&#xff0c;我最大的挑战之一是那天我决定从 Windows 转投 Mac 的阵营。 一开始&#xff0c;我还挺犹豫的。 Windows 和 Linux 一直是我求学和工作的得力伙伴。我在那个熟悉的世界里觉得很…

激发AI创新潜能,OPENAIGC开发者大赛赛题解析

人工智能&#xff08;AI&#xff09;的飞速发展&#xff0c;特别是AIGC、大模型、数字人技术的成熟&#xff0c;不仅改变了数据处理和信息消费的方式&#xff0c;也为企业和个人提供了前所未有的机遇。在这种技术进步的背景下&#xff0c;由联想拯救者、AIGC开放社区、英特尔共…

内地户口转香港身份的7种途径!2024年怎么同时拥有2个身份?一篇说明白

很多人还不知道怎么同时拥有内地身份和香港身份&#xff0c;这里一次性说明白&#xff0c;不同背景情况及政策有可能随时变化&#xff0c;这里分享最近拿香港身份的7种途径。 #01 优才『香港优秀人才计划』 获批准的申请人无须在来港定居前先获得本地雇主聘任。所有申请人均必…

淘宝扭蛋机小程序:解锁个性化扭蛋新体验

在追求个性化的今天&#xff0c;淘宝扭蛋机小程序以其独特的功能和设计&#xff0c;为我们解锁了全新的个性化扭蛋新体验。 1. 定制化扭蛋选择 淘宝扭蛋机小程序提供了多种定制化扭蛋选择&#xff0c;让你根据自己的喜好和需求&#xff0c;挑选心仪的扭蛋机。无论是喜欢动漫角…

界面控件Telerik UI for WPF中文教程 - 用RadSvgImage升级应用程序UI

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…