Spaces:
Sleeping
Sleeping
import { Client } from "@gradio/client"; | |
document.addEventListener("DOMContentLoaded", function() { | |
const audioPlayer = document.getElementById('player'); | |
const settingsBtn = document.getElementById('settingsBtn'); | |
const settingsModal = document.getElementById('settingsModal'); | |
const closeBtn = document.querySelector('.close'); | |
const saveSettingsBtn = document.getElementById('saveSettings'); | |
const apiKeyInput = document.getElementById('apiKey'); | |
const toggleApiKeyBtn = document.getElementById('toggleApiKey'); | |
const apiServerInput = document.getElementById('apiServer'); | |
let originalApiKey = ''; | |
let originalApiServer = ''; | |
// Load saved settings on page load | |
const savedApiKey = localStorage.getItem('openaiApiKey'); | |
const savedApiServer = localStorage.getItem('apiServer') || 'http://127.0.0.1:7860'; | |
if (savedApiKey) { | |
apiKeyInput.value = savedApiKey; | |
originalApiKey = savedApiKey; | |
} | |
apiServerInput.value = savedApiServer; | |
originalApiServer = savedApiServer; | |
// Toggle API key visibility | |
toggleApiKeyBtn.onclick = function() { | |
if (apiKeyInput.type === "password") { | |
apiKeyInput.type = "text"; | |
toggleApiKeyBtn.textContent = "🔒"; | |
} else { | |
apiKeyInput.type = "password"; | |
toggleApiKeyBtn.textContent = "👁️"; | |
} | |
} | |
// Open settings modal | |
settingsBtn.onclick = function() { | |
originalApiKey = apiKeyInput.value; | |
originalApiServer = apiServerInput.value; | |
settingsModal.style.display = "block"; | |
apiKeyInput.focus(); | |
} | |
// Close settings modal | |
function closeModal() { | |
settingsModal.style.display = "none"; | |
apiKeyInput.value = originalApiKey; // Revert to original value | |
} | |
closeBtn.onclick = closeModal; | |
// Close modal if clicked outside | |
window.onclick = function(event) { | |
if (event.target == settingsModal) { | |
closeModal(); | |
} | |
} | |
// Handle keydown events | |
document.addEventListener('keydown', function(event) { | |
if (settingsModal.style.display === "block") { | |
if (event.key === "Escape") { | |
closeModal(); | |
} else if (event.key === "Enter") { | |
saveSettings(); | |
} | |
} | |
}); | |
// Save settings | |
function saveSettings() { | |
const apiKey = apiKeyInput.value.trim(); | |
const apiServer = apiServerInput.value.trim(); | |
if (apiKey && apiServer) { | |
localStorage.setItem('openaiApiKey', apiKey); | |
localStorage.setItem('apiServer', apiServer); | |
originalApiKey = apiKey; | |
originalApiServer = apiServer; | |
alert('Settings saved successfully!'); | |
closeModal(); | |
} else { | |
alert('Please enter both a valid API key and API server.'); | |
} | |
} | |
saveSettingsBtn.onclick = saveSettings; | |
// Function to fetch MP3 from API endpoint when a link is shared | |
async function fetchMp3(link) { | |
console.log('Starting fetchMp3 function with link:', link); | |
const loadingIndicator = document.getElementById('loadingIndicator'); | |
const audioPlayer = document.getElementById('player'); | |
const playButton = document.getElementById('playButton'); | |
const transcriptionContainer = document.getElementById('transcriptionContainer'); | |
const transcriptionElement = document.getElementById('transcription'); | |
if (loadingIndicator) loadingIndicator.style.display = 'block'; | |
if (transcriptionContainer) transcriptionContainer.style.display = 'none'; | |
try { | |
const apiKey = localStorage.getItem('openaiApiKey'); | |
const apiServer = localStorage.getItem('apiServer'); | |
console.log('Retrieved API key and server from localStorage'); | |
console.log('API Server:', apiServer); | |
if (!apiKey) { | |
throw new Error("API key not set. Please set your OpenAI API key in the settings."); | |
} | |
if (!apiServer) { | |
throw new Error("API server not set. Please set the API server in the settings."); | |
} | |
console.log('Attempting to connect to Gradio app...'); | |
// Connect to local Gradio app | |
const client = await Client.connect(apiServer); | |
//connect to HF deployed one OK | |
//const client = await Client.connect("Mightypeacock/webtoaudio"); | |
console.log('Gradio client created successfully'); | |
console.log(await client.view_api()) | |
console.log('Preparing to make prediction...'); | |
// Make the prediction | |
const result = await client.predict("/generate_audio", { | |
url:link, | |
openai_api_key: apiKey, | |
text_model: "gpt-4o-mini", | |
audio_model: "tts-1", | |
speaker_1_voice: "alloy", | |
speaker_2_voice: "echo", | |
api_base: null, // api_base | |
edited_transcript: "", // edited_transcript | |
user_feedback: "", // user_feedback | |
original_text: "summary" // original_text | |
// debug: true, | |
}); | |
console.log('Raw result from predict:', result); | |
console.log('Result data:', result.data); | |
console.log('Prediction made successfully'); | |
// Check if result.data is an array and has at least one element | |
if (!Array.isArray(result.data) || result.data.length === 0) { | |
throw new Error('Unexpected result format from server'); | |
} | |
// Assuming the audio file URL is the second item in the result | |
const audioFileUrl = result.data[0].url; | |
console.log('Received audio file URL:', audioFileUrl); | |
// Check if the URL is valid | |
if (typeof audioFileUrl !== 'string' || !audioFileUrl.startsWith('http')) { | |
throw new Error(`Invalid audio file URL received: ${audioFileUrl}`); | |
} | |
// Set the audio player source | |
if (audioPlayer) { | |
audioPlayer.src = audioFileUrl; | |
} else { | |
throw new Error('Audio player element not found'); | |
} | |
// Show play button | |
if (playButton) { | |
playButton.style.display = 'block'; | |
playButton.onclick = () => audioPlayer.play(); | |
} else { | |
console.warn('Play button not found, audio controls will be used instead'); | |
} | |
// Display the transcription | |
if (transcriptionElement && transcriptionContainer) { | |
const transcription = result.data[1]; | |
transcriptionElement.textContent = transcription; | |
transcriptionContainer.style.display = 'block'; | |
} else { | |
console.warn('Transcription elements not found'); | |
} | |
console.log('Audio ready for playback and transcription displayed'); | |
} catch (error) { | |
console.error('Error in fetchMp3:', error); | |
console.error('Error stack:', error.stack); | |
alert(`Error fetching MP3: ${error.message}`); | |
// Clear the audio player source and hide the play button | |
if (audioPlayer) audioPlayer.src = ''; | |
if (playButton) playButton.style.display = 'none'; | |
if (transcriptionContainer) transcriptionContainer.style.display = 'none'; | |
} finally { | |
if (loadingIndicator) | |
loadingIndicator.style.display = 'none'; | |
} | |
} | |
// Get the link from the shared URL | |
const queryParams = new URLSearchParams(window.location.search); | |
const sharedLink = queryParams.get('url'); | |
console.log('Shared link from URL:', sharedLink); | |
// Only call the API to get MP3 if a valid URL is provided | |
if (sharedLink) { | |
console.log('Valid URL provided, calling fetchMp3'); | |
fetchMp3(sharedLink); | |
} else { | |
console.log("No URL provided. Waiting for user input."); | |
// You might want to update the UI here to indicate that the user needs to provide a URL | |
} | |
}); | |
if ('mediaSession' in navigator) { | |
navigator.mediaSession.metadata = new MediaMetadata({ | |
title: 'Sample MP3', | |
artist: 'Unknown Artist', | |
album: 'Demo Album', | |
artwork: [ | |
{ src: '/icons/icon-192x192.png', sizes: '192x192', type: 'image/png' }, | |
{ src: '/icons/icon-512x512.png', sizes: '512x512', type: 'image/png' } | |
] | |
}); | |
navigator.mediaSession.setActionHandler('play', function() { | |
audioPlayer.play(); | |
}); | |
navigator.mediaSession.setActionHandler('pause', function() { | |
audioPlayer.pause(); | |
}); | |
navigator.mediaSession.setActionHandler('seekbackward', function() { | |
audioPlayer.currentTime = Math.max(audioPlayer.currentTime - 10, 0); | |
}); | |
navigator.mediaSession.setActionHandler('seekforward', function() { | |
audioPlayer.currentTime = Math.min(audioPlayer.currentTime + 10, audioPlayer.duration); | |
}); | |
} | |