【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.pswp.cn/bicheng/16659.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16659.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16659.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機視覺與深度學習實戰:以Python為工具,基于深度學習的汽車目標檢測

隨著人工智能技術的飛速發展,計算機視覺與深度學習已經成為當今科技領域的熱點。其中,汽車目標檢測作為自動駕駛、智能交通等系統的核心技術,受到了廣泛關注。本文將以Python為工具,探討基于深度學習的汽車目標檢測方法及其實戰應用。 一、計算機視覺與深度學習基礎 計算機…

力扣刷題--747. 至少是其他數字兩倍的最大數【簡單】

題目描述 給你一個整數數組 nums &#xff0c;其中總是存在 唯一的 一個最大整數 。 請你找出數組中的最大元素并檢查它是否 至少是數組中每個其他數字的兩倍 。如果是&#xff0c;則返回 最大元素的下標 &#xff0c;否則返回 -1 。 示例 1&#xff1a; 輸入&#xff1a;n…

Python-opencv通過距離變換提取圖像骨骼

文章目錄 距離變換distanceTransform函數 距離變換 如果把二值圖像理解成地形&#xff0c;黑色表示海洋&#xff0c;白色表示陸地&#xff0c;那么陸地上任意一點&#xff0c;到海洋都有一個最近的距離&#xff0c;如下圖所示&#xff0c;對于左側二值圖像來說&#xff0c;【d…

Gitee的原理及應用詳解(三)

本系列文章簡介&#xff1a; Gitee是一款開源的代碼托管平臺&#xff0c;是國內最大的代碼托管平臺之一。它基于Git版本控制系統&#xff0c;提供了代碼托管、項目管理、協作開發、代碼審查等功能&#xff0c;方便團隊協作和項目管理。Gitee的出現&#xff0c;在國內的開發者社…

漂流瓶掛機項目,聊天腳本賺錢新玩法,號稱單機30-50+ (教程+軟件)

一、項目簡介&#xff1a; 漂流瓶掛機項目主要是通過使用探遇漂流瓶、音麥漂流瓶等聊天軟件&#xff0c;為用戶提供一個聊天賺錢的平臺。男性用戶需要充值后才能發送消息&#xff0c;而女性用戶則可以通過接收消息賺取分紅。男性用戶發送給女性用戶的消息費用大約在.1-.2元之間…

VScode中對git的學習筆記

1.git是什么&#xff1f; Git是一個功能強大的分布式版本控制系統&#xff0c;由Linux內核的創始人Linus Torvalds在2005年創建。它以其速度、數據完整性和支持大型項目的能力而聞名&#xff0c;被廣泛應用于軟件開發中。Git允許開發者在本地機器上擁有完整的代碼庫副本&#x…

讀書筆記分享

1.蘇格拉底只在需要的時候才索取&#xff0c;那樣便能以最少的物質滿足自身的要求。他認為每個人都天生體質脆弱&#xff0c;只有在貧乏的環境中才會鍛煉地強壯起來。生活中的大多數人認為&#xff0c;奢華才是幸福的生活。無休止的物質積聚&#xff0c;讓人們每天生活在一個內…

2024-05-27 blue-vh-問題點

摘要: 2024-05-27 思考-日記-問題點 問題點: 一. 同步接口的并發問題 接口調用是在客戶端的的上下文&#xff0c;無論是線程&#xff0c;協程&#xff0c;是在客戶端的執行上下文里面同步的話&#xff0c;是同步客戶端的調用接口的上下文&#xff0c;阻塞的是客戶端的上下文&a…

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表…

【MySQL精通之路】索引優化(2)

目錄 1 MySQL如何使用索引 2 主鍵優化 3 空間索引優化 4 外鍵優化 5 列索引 6 多列索引 7 驗證索引使用情況 8 InnoDB和MyISAM索引統計集合 9 B樹索引與哈希索引的比較 9.1 B-樹索引特征 9.2 哈希索引特征 10 索引擴展的使用 11 優化器使用生成的列索引 12 不可見…

【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 宏定…

推薦系統三方參與者

1.信息生產者 信息生產者是指制作和發布網絡信息內容的組織或個人。信息生產者的需求鏈路大致為&#xff1a;發布信息->期待曝光->期待閱讀->期待獎勵&#xff0c;需求得到滿足&#xff0c;持續生產&#xff0c;再次進入鏈路循環。生產者持續創作的激情和動力很大程度…

go語言內置io包中TreeReader函數的理解和使用示例

在go語言的內置io包中的這個 TreeReader函數&#xff0c;函數原型 func TeeReader(r Reader, w Writer) Reader 從函數原型中看是給他一個Reader, 和一個Writer 然后他給你返回一個Reader, 本文中我們把這個返回的Reader叫做 treeReader&#xff0c; 他是一個很特別的reader…