xxxxxxxxxx
247
const openAIProxy = "https://openai-api-proxy.glitch.me";
let feedback;
let mediaStream;
let mediaRecorder;
// Variable to store user input words
let inputWords = [];
// Flag to toggle color mode
let colored = true;
// Flag to track if keyboard controls are active
let pressed = false;
// Array to store synonyms fetched from API
let wordList = [];
// Object to store word synonyms
let wordDict = {};
function setup() {
createCanvas(windowWidth, windowHeight);
background (0);
textFont('Verdana')
input = createInput();
input.position(20,20);
createElement("br");
feedback = createP("");
createElement("br");
feedback.position(10,600)
}
function draw() {
background(20, 50);
translate(width/2, height/2);
// Process user input
inputWords = input.value().split(" ");
//let textSizeVar;
if (!pressed) {
textSizeVar = map(mouseY, 0, height, 10, 30);
mappedMouseX = map(mouseX, width/2, 0, 0, 300)
}
for (i = 0; i < 400; i++) {
let ang = i/4.6 + frameCount/110;
let r = i + noise(i) * 2 * mappedMouseX;
if (colored) {
// Calculate a percentage for the color gradient
let percent = map(i, 0, 400, 0, 70);
// Interpolate between two colors using lerpColor
if (percent < 0.5) {
col = lerpColor(color('#FDF48A'), color('#FF5631'), map(percent, 0, 0.5, 0, 1));
} else {
col = lerpColor(color('#FF5631'), color('#634FFF'), map(percent, 0.5, 1, 0, 1));
}
} else {
col = 255;
}
fill(col);
textSize(textSizeVar);
// Draw text at calculated position
let word = inputWords[i];
if (word) {
for (let j = 0; j < word.length; j++) {
let charIndex = j % word.length;
text(word.charAt(charIndex), cos(ang) * r, sin(ang) * r);
ang += 0.1; // Increment angle for each character to avoid overlapping
}
}
// Display synonyms
let synonyms = wordDict[word];
if (synonyms) {
for (let synonym of synonyms) {
r += 7; // Increase radius for synonyms to separate them
for (let j = 0; j < synonym.length; j++) {
let charIndex = j % synonym.length;
text(synonym.charAt(charIndex), cos(ang) * r, sin(ang) * r);
ang += 0.1; // Increment angle for each character to avoid overlapping
}
}
}
}
}
function keyPressed() {
// Toggle color mode with the up arrow
if (keyCode === UP_ARROW){
colored = !colored;
pressed = !pressed;
}
else if (keyCode === RETURN){
// Fetch synonyms when enter key is pressed
startup();
}
}
// Fetch synonyms of a given word from API
async function getSynonyms(word) {
if (wordList.indexOf(word) == -1) {
wordList.push(word);
// let synonyms = [];
try {
let synonyms = [];
await fetch('https://api.api-ninjas.com/v1/thesaurus?word=' + word, {
method: 'GET',
headers: { 'X-Api-Key': 'GhrROZHVzgzvaB/7pBQN2A==dhEHiZJ01zkonkso'},
})
.then(response => response.json())
.then(data => {
// Printing synonyms to the console
console.log("Synonyms for '" + word + "':");
data.synonyms.forEach(synonym => {
//console.log(synonym);
synonyms.push(synonym);
});
})
.catch(error => {
console.error('Error:', error);
});
console.log(synonyms);
if (synonyms.length > 40) {
synonyms.splice(40, synonyms.length - 40);
}
wordDict[word] = synonyms;
return synonyms;
} catch (error) {
console.error('Error fetching synonyms:', error);
return [];
}
} else {
return [];
}
}
// Function to handle fetching synonyms when user inputs a new word
function startup() {
console.log("startup");
let startWord = inputWords[inputWords.length - 1];
getSynonyms(startWord)
.then(result => next_list = result)
.catch(err => console.log(err));
inputWords.push(new Word(startWord, 0, 0, random(-10, 10)));
prev_list = [startWord];
}
function keyPressed() {
if (key === 'a') {
startRecording();
}
}
function keyReleased() {
if (key === 'a') {
stopRecording();
}
}
async function askForAudio(audio) {
document.body.style.cursor = "progress";
try{
feedback.html("Waiting for reply from OpenAi Audio...");
//read test.m4a file audio file from disk
//https://stackoverflow.com/questions/10058814/get-data-from-fs-readfile
console.log("Asking Audio From OpenAI via Proxy");
const formData = new FormData();
formData.append("file", audio);
formData.append("model", "whisper-1");
const url = openAIProxy + "/askOpenAIAudio/";
console.log("audio url", url);
const response = await fetch(url, {
mode: "cors",
method: "POST",
body: formData,
});
const openAI_json = await response.json();
console.log("audio_response", openAI_json.transcription);
feedback.html(openAI_json.transcription);
document.body.style.cursor = "auto";
startup(openAI_json.transcription)
} catch (error) {
console.error("Error reading audio:", error);
}
}
async function startRecording() {
try {
// Request access to the user's microphone
mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });
let mrChunks = [];
// Create a media recorder and start recording
mediaRecorder = new MediaRecorder(mediaStream);
mediaRecorder.addEventListener("dataavailable", (event) => {
mrChunks.push(event.data);
});
mediaRecorder.addEventListener("stop", (event) => {
const recordedData = new Blob(mrChunks, { type: "audio/webm" });
console.log("Recording stopped", recordedData);
let audioElement = document.createElement("audio");
// //var audioURL = window.URL.createObjectURL(recordedData);
// //audioElement.controls = true;
// document.body.appendChild(audioElement);
// audioElement.src = window.URL.createObjectURL(recordedData);
console.log(audioElement);
askForAudio(recordedData);
});
mediaRecorder.start();
console.log("Recording started");
} catch(error) {
console.error("Error starting recording:", error);
}
}
function stopRecording() {
if (mediaRecorder && mediaRecorder.state !== 'inactive') {
mediaRecorder.stop();
}
}