【EVI】Hume AI 初探

写在前面的话

Hume AI宣布已在B轮融资中筹集5000万美元,由前Google DeepMind研究员Alan Cowen创立并担任CEO。该AI模型专注于理解人类情感,并发布了「共情语音界面」演示,通过语音对话实现互动。从 Hume AI 官网展示的信息,EVI 能够识别和响应 53 种不同情绪。这一从声音中辨别情绪的能力来源于包括全球数十万人的受控实验数据在内的全面研究,EVI 正是基于对不同文化来源声音和面部表情的复杂分析,才构成了 AI 情绪识别能力的基础。

听说后,我简单地了解了Hume AI文档。从接入方式来看,与之前接入GPT的方式差不多,通过网络请求的方式去弄
…总之,一言难尽。

Hume AI介绍

Hume AI 可以集成到任何涉及人类数据的应用程序或研究中:音频、视频、图像或文本。使用api来访问模型,这些模型可以在细微的面部和声音行为中测量超过50个维度的情绪表达。捕捉细微的表情,如脸上的无聊和欲望,声音表情,如叹息和笑,讲话中持续的情感语调,文本中传达的情感,以及对情感体验的时刻到时刻的多模态估计。

EVI

EVI(EMPATHIC VOICE INTERFACE ),Hume的EVI接口可以理解和模拟语音语调、单词重音等,以优化人类与人工智能的互动。
语音AI助手

Demo

具有共情的能力的语音AI。
官方的在线Demo: https://demo.hume.ai

在这里插入图片描述

快速开始

本小节内容由官网(quickstart)翻译而来。

获取API KEY

Hume AI采用即用即付的付费模式。

为了建立经过身份验证的连接,首先需要使用我们的 API 密钥和客户端密钥实例化 Hume 客户端。这些密钥可以通过登录门户并访问API 密钥页面来获取。

在下面的示例代码中,API 密钥和客户端密钥已保存到环境变量中。避免在项目中对这些值进行硬编码,以防止它们被泄露。

import { Hume, HumeClient } from 'hume';// instantiate the Hume client and authenticate
const client = new HumeClient({apiKey: import.meta.env.HUME_API_KEY,clientSecret: import.meta.env.HUME_CLIENT_SECRET,
});

使用我们的 Typescript SDK 时,在使用您的凭据实例化 Hume 客户端后,将获取与 EVI 建立经过身份验证的连接所需的访问令牌并在后台应用。

连接

使用我们的凭据实例化 Hume 客户端后,我们现在可以与 EVI 建立经过身份验证的 WebSocket 连接并定义我们的 WebSocket 事件处理程序。目前,我们将包含占位符事件处理程序,以便在后续步骤中更新。

import { Hume, HumeClient } from 'hume';// instantiate the Hume client and authenticate
const client = new HumeClient({apiKey: import.meta.env.HUME_API_KEY,clientSecret: import.meta.env.HUME_CLIENT_SECRET,
});// instantiates WebSocket and establishes an authenticated connection
const socket = await client.empathicVoice.chat.connect({onOpen: () => {console.log('WebSocket connection opened');},onMessage: (message) => {console.log(message);},onError: (error) => {console.error(error);},onClose: () => {console.log('WebSocket connection closed');}
});

上传音频

要捕获音频并将其作为音频输入通过套接字发送,需要执行几个步骤。

  • 需要处理用户访问麦克风的权限。
  • 使用 Media Stream API 捕获音频,并使用 MediaRecorder API 录制捕获的音频。
  • 对录制的音频 Blob 进行 base64 编码,
  • 使用该sendAudioInput方法通过 WebSocket 发送编码的音频。

接受的音频格式包括:mp3、wav、aac、ogg、flac、webm、avr、cdda、cvs/vms、mp2、mp4、ac3、avi、wmv、mpeg、ircam

import {convertBlobToBase64,ensureSingleValidAudioTrack,getAudioStream,
} from 'hume';// the recorder responsible for recording the audio stream to be prepared as the audio input
let recorder: MediaRecorder | null = null;
// the stream of audio captured from the user's microphone
let audioStream: MediaStream | null = null;// define function for capturing audio
async function captureAudio(): Promise<void> {// prompts user for permission to capture audio, obtains media stream upon approvalaudioStream = await getAudioStream();// ensure there is only one audio track in the streamensureSingleValidAudioTrack(audioStream);// instantiate the media recorderrecorder = new MediaRecorder(audioStream, { mimeType });// callback for when recorded chunk is available to be processedrecorder.ondataavailable = async ({ data }) => {// IF size of data is smaller than 1 byte then do nothingif (data.size < 1) return;// base64 encode audio dataconst encodedAudioData = await convertBlobToBase64(data);// define the audio_input message JSONconst audioInput: Omit<Hume.empathicVoice.AudioInput, 'type'> = {data: encodedAudioData,};// send audio_input messagesocket?.sendAudioInput(audioInput);};// capture audio input at a rate of 100ms (recommended)const timeSlice = 100;recorder.start(timeSlice);
}// define a WebSocket open event handler to capture audio
async function handleWebSocketOpenEvent(): Promise<void> {// place logic here which you would like invoked when the socket opensconsole.log('Web socket connection opened');await captureAudio();
}

响应

响应将包含多条消息,详细信息如下:

  1. user_message:此消息封装了音频输入的转录。此外,它还包括与说话者的声音韵律相关的表情测量预测。
  2. assistant_message:对于响应中的每个句子,AssistantMessage都会发送一个。此消息不仅传递响应的内容,而且还包含有关生成的音频响应的表达质量的预测。
  3. audio_output:每个都会附带AssistantMessage一条消息。这包含与 相对应的实际音频(二进制)响应。AudioOutputAssistantMessage
  4. assistant_end:表示对音频输入的响应的结束,AssistantEnd 消息作为通信的最后一部分传递。

这里我们将重点播放接收到的音频输出。要播放响应中的音频输出,我们需要定义将接收到的二进制文件转换为 Blob 的逻辑,并创建 HTMLAudioInput 来播放音频。然后,我们需要更新客户端的 on message WebSocket 事件处理程序,以在接收音频输出时调用播放音频的逻辑。为了管理此处传入音频的播放,我们将实现一个队列并按顺序播放音频。

import { convertBase64ToBlob,getBrowserSupportedMimeType
} from 'hume';// audio playback queue
const audioQueue: Blob[] = [];
// flag which denotes whether audio is currently playing or not
let isPlaying = false;
// the current audio element to be played
let currentAudio: : HTMLAudioElement | null = null;
// mime type supported by the browser the application is running in
const mimeType: MimeType = (() => {const result = getBrowserSupportedMimeType();return result.success ? result.mimeType : MimeType.WEBM;
})();// play the audio within the playback queue, converting each Blob into playable HTMLAudioElements
function playAudio(): void {// IF there is nothing in the audioQueue OR audio is currently playing then do nothingif (!audioQueue.length || isPlaying) return;// update isPlaying stateisPlaying = true;// pull next audio output from the queueconst audioBlob = audioQueue.shift();// IF audioBlob is unexpectedly undefined then do nothingif (!audioBlob) return;// converts Blob to AudioElement for playbackconst audioUrl = URL.createObjectURL(audioBlob);currentAudio = new Audio(audioUrl);// play audiocurrentAudio.play();// callback for when audio finishes playingcurrentAudio.onended = () => {// update isPlaying stateisPlaying = false;// attempt to pull next audio output from queueif (audioQueue.length) playAudio();};
}// define a WebSocket message event handler to play audio output
function handleWebSocketMessageEvent(message: Hume.empathicVoice.SubscribeEvent
): void {// place logic here which you would like to invoke when receiving a message through the socketswitch (message.type) {// add received audio to the playback queue, and play next audio outputcase 'audio_output':// convert base64 encoded audio to a Blobconst audioOutput = message.data;const blob = convertBase64ToBlob(audioOutput, mimeType);// add audio Blob to audioQueueaudioQueue.push(blob);// play the next audio outputif (audioQueue.length === 1) playAudio();break;}
}

中断

可中断性是 Empathic Voice Interface 的一大特色。如果在接收上一个音频输入的响应消息时通过 websocket 发送音频输入,则将停止发送对上一个音频输入的响应。此外,界面将发回一条 user_interruption消息,并开始响应新的音频输入。

// function for stopping the audio and clearing the queue
function stopAudio(): void {// stop the audio playbackcurrentAudio?.pause();currentAudio = null;// update audio playback stateisPlaying = false;// clear the audioQueueaudioQueue.length = 0;
}// update WebSocket message event handler to handle interruption
function handleWebSocketMessageEvent(message: Hume.empathicVoice.SubscribeEvent
): void {// place logic here which you would like to invoke when receiving a message through the socketswitch (message.type) {// add received audio to the playback queue, and play next audio outputcase 'audio_output':// convert base64 encoded audio to a Blobconst audioOutput = message.data;const blob = convertBase64ToBlob(audioOutput, mimeType);// add audio Blob to audioQueueaudioQueue.push(blob);// play the next audio outputif (audioQueue.length === 1) playAudio();break;// stop audio playback, clear audio playback queue, and update audio playback state on interruptcase 'user_interruption':stopAudio();break;}
}

API参考

官方链接:API Reference

网络请求URL:
https://api.hume.ai/v0/evi/tools?page_number=0&page_size=2

示例代码:

curl -G https://api.hume.ai/v0/evi/tools \-H "X-Hume-Api-Key: " \-d page_number=0 \-d page_size=2

TypeScript示例:

// List tools (GET /tools)
const response = await fetch("https://api.hume.ai/v0/evi/tools?page_number=0&page_size=2", {method: "GET",headers: {"X-Hume-Api-Key": ""},
});
const body = await response.json();
console.log(body);

Python示例

import requests
# List tools (GET /tools)
response = requests.get("https://api.hume.ai/v0/evi/tools?page_number=0&page_size=2",headers={"X-Hume-Api-Key": ""},
)
print(response.json())

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

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

相关文章

力扣刷题--747. 至少是其他数字两倍的最大数【简单】

题目描述 给你一个整数数组 nums &#xff0c;其中总是存在 唯一的 一个最大整数 。 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是&#xff0c;则返回 最大元素的下标 &#xff0c;否则返回 -1 。 示例 1&#xff1a; 输入&#xff1a;n…

Python-opencv通过距离变换提取图像骨骼

文章目录 距离变换distanceTransform函数 距离变换 如果把二值图像理解成地形&#xff0c;黑色表示海洋&#xff0c;白色表示陆地&#xff0c;那么陆地上任意一点&#xff0c;到海洋都有一个最近的距离&#xff0c;如下图所示&#xff0c;对于左侧二值图像来说&#xff0c;【d…

漂流瓶挂机项目,聊天脚本赚钱新玩法,号称单机30-50+ (教程+软件)

一、项目简介&#xff1a; 漂流瓶挂机项目主要是通过使用探遇漂流瓶、音麦漂流瓶等聊天软件&#xff0c;为用户提供一个聊天赚钱的平台。男性用户需要充值后才能发送消息&#xff0c;而女性用户则可以通过接收消息赚取分红。男性用户发送给女性用户的消息费用大约在.1-.2元之间…

VScode中对git的学习笔记

1.git是什么&#xff1f; Git是一个功能强大的分布式版本控制系统&#xff0c;由Linux内核的创始人Linus Torvalds在2005年创建。它以其速度、数据完整性和支持大型项目的能力而闻名&#xff0c;被广泛应用于软件开发中。Git允许开发者在本地机器上拥有完整的代码库副本&#x…

SashulinMessageBroker:在消息流中调用C++ DLL

一、背景 在现实应用中&#xff0c;算法、核心逻辑为了追求快速高效的运行速度&#xff0c;很多人都采用C来编写&#xff0c;并打包成动态库供外部使用。SMB针对这种应用场景&#xff0c;提供了DLL组件&#xff0c;实现在消息流中对DLL的动态调用。下实例讲解如何实现DLL as S…

多旋翼+发电机:国债应急系留照明无人机技术详解

多旋翼发电机技术的应急系留照明无人机是一种集成了先进飞行技术、发电技术和照明技术的无人机系统。这种无人机具有高度的灵活性、移动性和适应性&#xff0c;能够在各种复杂环境下迅速部署&#xff0c;为夜间搜救、救援等应急任务提供高效、可靠的照明支持。 无人机参数&…

融汇11款AI工具构建完美应用

本文将为您介绍25个开源项目&#xff0c;分为上下两篇以便您融汇它们来制作自己的AI应用。人工智能&#xff08;AI&#xff09;应用在近年来得到了长足的发展。从语音助手到软件开发&#xff0c;人工智能已在我们的生活中无处不在&#xff0c;并得到了广泛应用。 如您所见&…

构建智慧城市公共服务系统的功能架构设计

随着城市化进程的加速&#xff0c;城市公共服务系统在保障居民生活品质、提升城市管理水平方面扮演着愈发重要的角色。构建智慧城市公共服务系统的功能架构设计至关重要&#xff0c;它不仅需要充分考虑居民需求与城市管理的实际情况&#xff0c;还需要整合先进的科技手段&#…

LINGO:存贮问题

存贮模型中的基本概念 模型&#xff1a; 基本要素&#xff1a; &#xff08;1&#xff09;需求率&#xff1a;单位时间内对某种物品的需求量&#xff0c;用D表示。 &#xff08;2&#xff09;订货批量&#xff1a;一次订货中&#xff0c;包含某种货物的数量&#xff0c;用 Q表…

【C语言】实现贪吃蛇--项目实践(超详细)

前言&#xff1a; 贪吃蛇游戏大家都玩过吧&#xff1f;这次我们要用C语言来亲手制作一个&#xff01;这个项目不仅能让我们复习C语言的知识&#xff0c;还能了解游戏是怎么一步步做出来的。我们会一起完成蛇的移动、食物的生成&#xff0c;还有碰撞检测等有趣的部分。准备好了…

新计划,不断变更!做自己,接受不美好!猪肝移植——早读(逆天打工人爬取热门微信文章解读)

时间不等人 引言Python 代码第一篇 做自己&#xff0c;没有很好也没关系第二篇结尾 引言 新计划&#xff1a; 早上一次性发几个视频不现实 所以更改一下 待后面有比较稳定的框架再优化 每天早上更新 早到8点 晚到10点 你刚刚好上班或者上课 然后偷瞄的看两眼 学习一下 补充知…

SSM流浪宠物领养系统 毕业设计-附源码 270917

摘 要 流浪宠物一直是影响城市环境与居民生活的一个不可忽略的因素。基于此&#xff0c;本文设计并实现一个流浪宠物领养系统。用户可以通过本系统查看搜索流浪宠物的相关信息、进行领养申请&#xff0c;为其提供爱心帮助。本系统有效地解决了流浪宠物领养工作开展困难等问题&a…

STM32F1之OV7725摄像头·SCCB总线详解(附带源码编写)

STM32F1之OV7725摄像头-CSDN博客 STM32F1之OV7725摄像头像素数据输出时序、FIFO 读写时序以及摄像头的驱动原理详解-CSDN博客 目录 1. 硬件设计 1.1 SCCB 控制相关 1.2 VGA 时序相关 1.3 FIFO 相关 1.4 XCLK 信号 2. 代码设计 2.1 SCCB总线软件实现 2.1.1 宏定…

上位机图像处理和嵌入式模块部署(f103 mcu运行freertos)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 mcu一般有两个用途,一个是控制,一个是非控制。控制类的应用一般要求实时性比较高,什么时候做什么,都是有严格的时间要求的。而非控制类的应用,则要求实现尽可能多的功能,比如…

spring boot整合j2cache 配置项目全局键标识 帮助定位是哪个项目产生的缓存

我们利用 j2cache 存进 redis的缓存 key 可以加个全局标识 这样 到时看缓存 方便别人看是哪个项目存进去的 例如 这里 我们存入的 book 我们 keys * 查看 就知道是个book 但不知道具体来自那套系统 我们在 j2cache.properties 中加上 redis.namespace 项目全局键标识 我们…

42-5 应急响应之日志分析

一、Windows 系统日志排查 1)日志概述 在 Windows 2000 专业版、Windows XP 和 Windows Server 2003 中: 系统日志的位置为 C:\WINDOWS\System32\config\SysEvent.evt安全性日志的位置为 C:\WINDOWS\System32\config\SecEvent.evt应用程序日志的位置为 C:\WINNT\System32\c…

【漏洞复现】海康威视综合安防管理平台 iSecure Center applyCT fastjson 远程代码执行

0x01 漏洞名称 海康威视综合安防管理平台 iSecure Center applyCT fastjson 远程代码执行 0x02 漏洞影响 0x03 搜索引擎 app"HIKVISION-综合安防管理平台"0x04 漏洞详情 POST /bic/ssoService/v1/applyCT HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Wi…

NASA数据集——阿尔法喷气式大气实验二氧化碳和甲烷数据

Alpha Jet Atmospheric eXperiment Carbon Dioxide and Methane Data 阿尔法喷气式大气实验二氧化碳和甲烷数据 简介 Alpha Jet Atmospheric eXperiment (AJAX) 是美国国家航空航天局艾姆斯研究中心与 H211, L.L.C. 公司的合作项目&#xff0c;旨在促进对加利福尼亚、内华达…

vue+iview tabs context-menu 弹出框怎么修改样式

今天遇到一个需求说页面顶部的菜单右键弹出框离得有点远 代码是这样 <Tabs type"card" closable class"main-tags-col-tabs" v-model"activeTab" on-click"handleClickTag" :before-remove"handleBeforeRemove" capt…

什么是容器:从基础到进阶的全面介绍

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…