开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 0 Fork 0

BinWoo/TalkingHead

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
main
分支 (1)
标签 (6)
main
v1.2.3
v1.2.2
v1.2.1
v1.2.0
v1.1.0
v1.0.0
main
分支 (1)
标签 (6)
main
v1.2.3
v1.2.2
v1.2.1
v1.2.0
v1.1.0
v1.0.0
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
main
分支 (1)
标签 (6)
main
v1.2.3
v1.2.2
v1.2.1
v1.2.0
v1.1.0
v1.0.0
TalkingHead
/
examples
/
mp3.html
TalkingHead
/
examples
/
mp3.html
mp3.html 6.09 KB
一键复制 编辑 原始数据 按行查看 历史
met4citizen 提交于 2024年06月14日 15:50 +08:00 . Updated to use v1.2
<!DOCTYPE html>
<html>
<head>
<title>Talking Head - MP3 example</title>
<style>
body, html { width:100%; height:100%; margin: 0; padding: 0; background-color: dimgray; color: white; }
#avatar { display: block; position: absolute; top: 0; left: 0; right: 40%; bottom: 0; }
#controls { display: flex; flex-direction: column; gap: 10px; position: absolute; top: 50px; left: Calc( 60% + 50px); right: 50px; bottom: 50px; }
#load { font-family: Arial; font-size: 20px; }
#json { flex: 1; background-color: lightgray; font-family: Arial; font-size: 20px; }
#play { font-family: Arial; font-size: 20px; }
#loading { display: block; position: absolute; top: 50px; left: 50px; width: 200px; font-family: Arial; font-size: 20px; }
</style>
<script type="importmap">
{ "imports":
{
"three": "https://cdn.jsdelivr.net/npm/three@0.161.0/build/three.module.js/+esm",
"three/addons/": "https://cdn.jsdelivr.net/npm/three@0.161.0/examples/jsm/",
"talkinghead": "https://cdn.jsdelivr.net/gh/met4citizen/TalkingHead@1.2/modules/talkinghead.mjs"
}
}
</script>
<script type="module">
import { TalkingHead } from "talkinghead";
let head; // TalkingHead instance
let audio; // Audio object
// Make a transcription of an audio file using OpenAI's Whisper API
async function loadAudio(file) {
try {
const nodeJSON = document.getElementById('json');
nodeJSON.value = "Please wait...";
const nodePlay = document.getElementById('play');
nodePlay.disabled = true;
// OpenAI Whisper request
const form = new FormData();
form.append("file", file);
form.append("model", "whisper-1");
form.append("language", "en");
form.append("response_format", "verbose_json" );
form.append("timestamp_granularities[]", "word" );
form.append("timestamp_granularities[]", "segment" );
// NOTE: Never put your API key in a client-side code unless you know
// that you are the only one to have access to that code!
const response = await fetch( "https://api.openai.com/v1/audio/transcriptions" , {
method: "POST",
body: form,
headers: {
"Authorization": "Bearer <add-your-openai-api-key-here>" // <- Change this
}
});
if ( response.ok ) {
const json = await response.json();
nodeJSON.value = JSON.stringify(json, null, 4);
// Fetch audio
if ( json.words && json.words.length ) {
var reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = async readerEvent => {
let arraybuffer = readerEvent.target.result;
let audiobuffer = await head.audioCtx.decodeAudioData(arraybuffer);
// TalkingHead audio object
audio = {
audio: audiobuffer,
words: [],
wtimes: [],
wdurations: [],
markers: [],
mtimes: []
};
// Add words to the audio object
json.words.forEach( x => {
audio.words.push( x.word );
audio.wtimes.push( 1000 * x.start - 150 );
audio.wdurations.push( 1000 * (x.end - x.start) );
});
// Callback function to make the avatar look at the camera
const startSegment = async () => {
head.lookAtCamera(500);
head.speakWithHands();
};
// Add timed callback markers to the audio object
json.segments.forEach( x => {
if ( x.start > 2 && x.text.length > 10 ) {
audio.markers.push( startSegment );
audio.mtimes.push( 1000 * x.start - 1000 );
}
});
// Enable play button
nodePlay.disabled = false;
}
}
} else {
nodeJSON.value = 'Error: ' + response.status + '' + response.statusText;
console.log(response);
}
} catch (error) {
console.log(error);
}
}
document.addEventListener('DOMContentLoaded', async function(e) {
// Instantiate the class
// NOTE: Text-to-speech not initialized
const nodeAvatar = document.getElementById('avatar');
head = new TalkingHead( nodeAvatar, {
ttsEndpoint: "https://eu-texttospeech.googleapis.com/v1beta1/text:synthesize",
lipsyncModules: ["en", "fi"],
cameraView: "head"
});
// Load and show the avatar
const nodeLoading = document.getElementById('loading');
try {
await head.showAvatar( {
url: 'https://models.readyplayer.me/64bfa15f0e72c63d7c3934a6.glb?morphTargets=ARKit,Oculus+Visemes,mouthOpen,mouthSmile,eyesClosed,eyesLookUp,eyesLookDown&textureSizeLimit=1024&textureFormat=png',
body: 'F',
avatarMood: 'neutral',
lipsyncLang: 'en'
}, (ev) => {
if ( ev.lengthComputable ) {
let val = Math.min(100,Math.round(ev.loaded/ev.total * 100 ));
nodeLoading.textContent = "Loading " + val + "%";
}
});
nodeLoading.style.display = 'none';
} catch (error) {
console.log(error);
nodeLoading.textContent = error.toString();
}
// File changed
const nodeLoad = document.getElementById('load');
nodeLoad.addEventListener('change', function(ev) {
let file = ev.target.files[0];
loadAudio(file);
});
// Play button clicked
const nodePlay = document.getElementById('play');
nodePlay.addEventListener('click', function() {
if ( audio ) {
head.speakAudio( audio );
}
});
});
</script>
</head>
<body>
<div id="avatar"></div>
<div id="controls">
<input id="load" type="file" accept=".m4a,.mp3,.webm,.mp4,.mpga,.wav,.mpeg">
<textarea id="json" readonly></textarea>
<input id="play" type="button" value="Play" disabled="disable">
</div>
<div id="loading"></div>
</body>
</html>
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

暂无描述
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/bwcode/TalkingHead.git
git@gitee.com:bwcode/TalkingHead.git
bwcode
TalkingHead
TalkingHead
main
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /