Files
2026-07-13 13:30:30 +08:00

205 lines
5.3 KiB
HTML

<head>
<link
href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0"
/>
<script type="importmap">
{
"imports": {
"@material/web/": "https://esm.run/@material/web/"
}
}
</script>
<script type="module">
import "@material/web/all.js";
import { styles as typescaleStyles } from "@material/web/typography/md-typescale-styles.js";
document.adoptedStyleSheets.push(typescaleStyles.styleSheet);
</script>
<script src="gemini-live-api.js"></script>
<script src="live-media-manager.js"></script>
<script src="cookieJar.js"></script>
<link rel="stylesheet" href="styles.css" />
<script defer src="script.js"></script>
</head>
<body>
<h1 class="md-typescale-display-medium">Multimodal Live API</h1>
<p class="md-typescale-body-medium">
The Multimodal Live API enables low-latency, two-way interactions that use
text, audio, and video input, with audio and text output.
</p>
<br />
<div id="model-config-container">
<div>
<md-outlined-text-field
id="token"
label="Access Token"
value=""
type="password"
></md-outlined-text-field>
<br />
<br />
<md-outlined-text-field
id="project"
label="Project ID"
value=""
></md-outlined-text-field>
</div>
<div class="modality-container">
<p class="md-typescale-body-medium" style="margin-top: 0">
Model response type
</p>
<form>
<md-radio
id="audio-radio"
name="responseModality"
value="AUDIO"
checked="checked"
></md-radio>
<label for="audio-radio">
<span class="material-symbols-outlined"> volume_up </span>
<span class="icon-text">Audio</span>
</label>
<br /><br />
<md-radio
id="text-radio"
name="responseModality"
value="TEXT"
></md-radio>
<label for="text-radio">
<span class="material-symbols-outlined"> text_fields </span>
<span class="icon-text">Text</span>
</label>
</form>
</div>
<md-outlined-text-field
id="systemInstructions"
type="textarea"
label="System Instructions"
rows="3"
>
</md-outlined-text-field>
<div>
<br />
<md-outlined-button onclick="connectBtnClick()"
>Connect</md-outlined-button
>
<br /><br />
<md-outlined-button onclick="disconnectBtnClick()"
>Disconnect</md-outlined-button
>
</div>
</div>
<br />
<div id="model-state">
<div id="disconnected" class="state">
<span class="material-symbols-outlined"> cloud_off </span>
<span class="icon-text">disconnected</span>
</div>
<div id="connecting" class="state" hidden>
<span class="material-symbols-outlined"> hourglass_empty </span>
<span class="icon-text">connecting...</span>
</div>
<div id="connected" class="state" hidden>
<span class="material-symbols-outlined"> cloud_done </span>
<span class="icon-text">connected</span>
</div>
<div id="speaking" class="state" hidden>
<span class="material-symbols-outlined"> graphic_eq </span>
<span class="icon-text">model speaking</span>
</div>
</div>
<br />
<div id="user-input-container">
<div>
<div>
<md-outlined-select
id="cameraSource"
label="Camera Input"
onchange="newCameraSelected()"
>
</md-outlined-select>
</div>
<br />
<div>
<md-outlined-select
id="audioSource"
label="Microphone Input"
onchange="newMicSelected()"
>
</md-outlined-select>
</div>
<br />
<div class="spread">
<span id="micBtn">
<md-filled-icon-button onclick="micBtnClick()">
<md-icon>mic</md-icon>
</md-filled-icon-button>
</span>
<span id="micOffBtn" hidden>
<md-filled-icon-button onclick="micOffBtnClick()">
<md-icon>mic_off</md-icon>
</md-filled-icon-button>
</span>
<span id="cameraBtn">
<md-filled-icon-button onclick="cameraBtnClick()">
<md-icon>videocam</md-icon>
</md-filled-icon-button>
</span>
<span id="screenBtn">
<md-filled-icon-button onclick="screenShareBtnClick()">
<md-icon>present_to_all</md-icon>
</md-filled-icon-button>
</span>
</div>
</div>
<div>
<div id="video-preview">
<video id="video" autoplay playsinline muted></video>
<canvas id="canvas"></canvas>
</div>
</div>
<div>
<md-outlined-text-field
id="text-message"
label="Text Message"
value=""
></md-outlined-text-field>
<md-icon-button onclick="newUserMessage()">
<md-icon>send</md-icon>
</md-icon-button>
<br />
<div id="text-chat"></div>
</div>
</div>
<md-dialog id="dialog" close>
<div slot="content">
<span id="dialogMessage">A dialog that is opened by default.</span>
</div>
</md-dialog>
</body>