<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Test &#8211; Jarbly | The Jarbly Group &amp; Jarbly Venture Labs</title>
	<atom:link href="https://jarbly.com/category/test/feed/" rel="self" type="application/rss+xml" />
	<link>https://jarbly.com</link>
	<description>Business Brokerage, Consulting &#38; Venture Development</description>
	<lastBuildDate>Thu, 24 Sep 2026 14:08:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://jarbly.com/wp-content/uploads/2026/09/cropped-jg2-32x32.png</url>
	<title>Test &#8211; Jarbly | The Jarbly Group &amp; Jarbly Venture Labs</title>
	<link>https://jarbly.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>J.A.R.B.L.Y. Voice Command Center</title>
		<link>https://jarbly.com/jarbly-voice-command-center/</link>
		
		<dc:creator><![CDATA[JARBLY]]></dc:creator>
		<pubDate>Thu, 24 Sep 2026 10:30:34 +0000</pubDate>
				<category><![CDATA[Test]]></category>
		<guid isPermaLink="false">https://jarbly.com/?p=26890</guid>

					<description><![CDATA[JARBLY Realtime Voice JARBLY OPENAI REALTIME VOICE TEST CHECKING HTTPS… Upload index.html and token.php to the same HTTPS folder. Open in Chrome, click START JARBLY, allow microphone access, then say “Hey Jarbly, tell me what you can do.” JARBLYVOICECENTER START JARBLY MUTE MIC STOP JARBLY OFFLINEClick START JARBLY to begin. SYSTEM // Waiting to start&#8230;]]></description>
										<content:encoded><![CDATA[<p><!doctype html><br />
<html lang="en"><br />
<head><br />
<meta charset="utf-8"><br />
<meta name="viewport" content="width=device-width,initial-scale=1"><br />
<title>JARBLY Realtime Voice</title></p>
<style>
:root{--bg:#02070a;--panel:#061419;--cyan:#31e7ef;--orange:#ffad58;--text:#e8fdff;--muted:#719aa0;--green:#67f2bd;--red:#ff7d83}
*{box-sizing:border-box}html,body{margin:0;min-height:100%;background:var(--bg);color:var(--text);font-family:Arial,Helvetica,sans-serif}
body{padding:18px;background:radial-gradient(circle at 50% 25%,rgba(49,231,239,.09),transparent 32%),var(--bg)}
.wrap{max-width:1100px;margin:auto}.top{display:flex;justify-content:space-between;align-items:center;padding:16px 18px;border:1px solid #15545d;background:#061419;margin-bottom:12px}
.logo{font-weight:900;letter-spacing:.28em;color:var(--cyan);font-size:20px}.sub{color:var(--muted);font-size:10px;margin-top:5px}.badge{font:11px monospace;padding:6px 9px;border:1px solid #6c3035;color:#ff989f}.badge.ok{border-color:#1e7959;color:var(--green)}
.notice{padding:11px 13px;border:1px solid #75501e;background:#1b1308;color:#ffc37d;font-size:12px;line-height:1.5;margin-bottom:12px}
.panel{border:1px solid #15545d;background:#061419}.center{min-height:620px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:radial-gradient(circle,rgba(49,231,239,.14),transparent 49%),#041015}
.orb{width:215px;height:215px;border-radius:50%;display:grid;place-items:center;text-align:center;border:1px solid var(--cyan);background:radial-gradient(circle at 38% 30%,#eaffff 0 2%,#39dbe6 4%,#08717f 24%,#031114 68%);box-shadow:0 0 38px rgba(49,231,239,.75),0 0 130px rgba(49,231,239,.2);font-size:12px;letter-spacing:.13em}
.orb.connect{animation:pulse .9s infinite}.orb.listen{box-shadow:0 0 60px rgba(49,231,239,1),0 0 150px rgba(49,231,239,.35);transform:scale(1.04)}.orb.speak{animation:pulse .5s infinite;box-shadow:0 0 55px rgba(255,173,88,.9),0 0 140px rgba(255,173,88,.28)}@keyframes pulse{50%{transform:scale(1.08)}}
.controls{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-top:30px}
button{background:#08242b;color:var(--cyan);border:1px solid #1a6873;padding:13px 18px;font-weight:800;cursor:pointer;font-size:13px}button.orange{color:var(--orange);border-color:#875629}button.danger{color:var(--red);border-color:#74353b}button:disabled{opacity:.45}
.status{text-align:center;color:var(--cyan);font-size:13px;margin-top:20px;min-height:58px}.status small{display:block;color:var(--muted);margin-top:7px;max-width:650px;line-height:1.45}
.log{margin-top:12px;border:1px solid #15545d;background:#061419;min-height:200px;max-height:340px;overflow:auto;padding:14px;font:13px/1.55 monospace;white-space:pre-wrap}
.footer{margin-top:12px;color:var(--muted);font-size:11px;line-height:1.5}
</style>
<p></head><br />
<body></p>
<div class="wrap">
<div class="top">
<div>
<div class="logo">JARBLY</div>
<div class="sub">OPENAI REALTIME VOICE TEST</div>
</div>
<div id="secure" class="badge">CHECKING HTTPS…</div>
</div>
<div class="notice">Upload <b>index.html</b> and <b>token.php</b> to the same HTTPS folder. Open in Chrome, click <b>START JARBLY</b>, allow microphone access, then say <b>“Hey Jarbly, tell me what you can do.”</b></div>
<section class="panel center">
<div id="orb" class="orb">JARBLY<br />VOICE<br />CENTER</div>
<div class="controls">
<button id="startBtn" class="orange">START JARBLY</button><br />
<button id="muteBtn" disabled>MUTE MIC</button><br />
<button id="stopBtn" class="danger" disabled>STOP JARBLY</button>
</div>
<div id="status" class="status">OFFLINE<small id="detail">Click START JARBLY to begin.</small></div>
</section>
<div id="log" class="log">SYSTEM // Waiting to start JARBLY.</div>
<div class="footer">Realtime speech-to-speech over WebRTC. Permanent API key stays on your server in token.php.</div>
</div>
<p><script>
(() => {
const $=id=>document.getElementById(id);
let pc=null,dc=null,localStream=null,remoteAudio=null,connected=false,muted=false,assistantTranscript="";
const secure=location.protocol==="https:"||location.hostname==="localhost";
$("secure").textContent=secure?"HTTPS READY":"HTTPS REQUIRED";
$("secure").className="badge"+(secure?" ok":"");</p>
<p>function log(text){$("log").textContent+="\n"+text;$("log").scrollTop=$("log").scrollHeight}
function state(cls,title,detail){$("orb").className="orb "+(cls||"");$("status").firstChild.nodeValue=title;$("detail").textContent=detail||""}</p>
<p>function cleanup(){
connected=false;muted=false;
try{dc&&dc.close()}catch{}
try{pc&&pc.close()}catch{}
try{localStream&&localStream.getTracks().forEach(t=>t.stop())}catch{}
try{remoteAudio&&remoteAudio.remove()}catch{}
dc=pc=localStream=remoteAudio=null;
$("startBtn").disabled=false;$("muteBtn").disabled=true;$("stopBtn").disabled=true;$("muteBtn").textContent="MUTE MIC";
state("","OFFLINE","Click START JARBLY to begin again.");
}</p>
<p>async function startJarbly(){
if(!secure){log("SYSTEM // HTTPS required.");state("","HTTPS REQUIRED","Upload these files to an HTTPS page.");return}
$("startBtn").disabled=true;state("connect","CONNECTING","Requesting microphone permission…");
try{
localStream=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:true,noiseSuppression:true,autoGainControl:true}});
log("SYSTEM // Microphone permission granted.");
const tokenRes=await fetch("token.php",{cache:"no-store"});
const tokenData=await tokenRes.json();
if(!tokenRes.ok||!tokenData.value)throw new Error(tokenData.error||"token.php did not return a client secret.");
const ephemeralKey=tokenData.value;</p>
<p>pc=new RTCPeerConnection();
remoteAudio=document.createElement("audio");remoteAudio.autoplay=true;remoteAudio.playsInline=true;document.body.appendChild(remoteAudio);
pc.ontrack=e=>remoteAudio.srcObject=e.streams[0];
localStream.getTracks().forEach(track=>pc.addTrack(track,localStream));</p>
<p>dc=pc.createDataChannel("oai-events");
dc.onopen=()=>{connected=true;$("muteBtn").disabled=false;$("stopBtn").disabled=false;state("listen","JARBLY ONLINE","Say: “Hey Jarbly, tell me what you can do.”");log("SYSTEM // Realtime session connected.")};
dc.onmessage=event=>{
let e;try{e=JSON.parse(event.data)}catch{return}
if(e.type==="input_audio_buffer.speech_started")state("listen","LISTENING","I can hear you…");
if(e.type==="input_audio_buffer.speech_stopped")state("connect","THINKING","JARBLY is preparing a response…");
if(e.type==="response.output_audio_transcript.delta"){assistantTranscript+=e.delta||"";state("speak","JARBLY SPEAKING","You can interrupt at any time.");}
if(e.type==="response.output_audio_transcript.done"){const t=(e.transcript||assistantTranscript||"").trim();if(t)log("JARBLY // "+t);assistantTranscript="";}
if(e.type==="response.done"&&connected)state("listen","LISTENING","Continue talking naturally.");
if(e.type==="error")log("SYSTEM // "+(e.error?.message||JSON.stringify(e)));
};</p>
<p>const offer=await pc.createOffer();
await pc.setLocalDescription(offer);
const sdpRes=await fetch("https://api.openai.com/v1/realtime/calls",{method:"POST",body:offer.sdp,headers:{"Authorization":"Bearer "+ephemeralKey,"Content-Type":"application/sdp"}});
if(!sdpRes.ok)throw new Error("Realtime connection failed: "+(await sdpRes.text()).slice(0,300));
await pc.setRemoteDescription({type:"answer",sdp:await sdpRes.text()});
}catch(err){log("SYSTEM // "+(err.message||String(err)));state("","CONNECTION FAILED",err.message||String(err));cleanup()}
}</p>
<p>$("startBtn").onclick=startJarbly;
$("muteBtn").onclick=()=>{if(!localStream)return;muted=!muted;localStream.getAudioTracks().forEach(t=>t.enabled=!muted);$("muteBtn").textContent=muted?"UNMUTE MIC":"MUTE MIC";state(muted?"":"listen",muted?"MIC MUTED":"LISTENING",muted?"JARBLY cannot hear you.":"Continue talking naturally.")};
$("stopBtn").onclick=()=>{try{dc&&dc.readyState==="open"&&dc.send(JSON.stringify({type:"session.close"}))}catch{}log("SYSTEM // JARBLY stopped.");cleanup()};
})();
</script><br />
</body><br />
</html></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
