Change ChatGPT Image And Text To Speach Function

ChatGPT

目前為 2023-01-17 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Change ChatGPT Image And Text To Speach Function
// @namespace    Change ChatGPT Image And Text To Speach Function
// @version      0.1
// @description  ChatGPT
// @author       kaes-u-paya for text to speach and mei for the image change
// @match        https://chat.openai.com/chat
// @grant        none
// @license MIT
// ==/UserScript==

//var link = "https://s3.bmp.ovh/imgs/2022/12/18/f2294e4eb27e9161.jpg";
var link = "https://cdn4.iconfinder.com/data/icons/artificial-intelligence-35/64/artificial-intelligence-ai-avatar-robot-512.png";
var circle = false;
var shadow = false;

//var textinput = "Hi how are you?";

document.addEventListener("DOMNodeInserted", function(event) {

  let tar = event.target.nodeName;
  let rel = event.relatedNode.nodeName;

/*
 * alert('inserted ' + event.target.childNodes[0].childNodes[0].childNodes[0].childNodes[0].getElementsByTagName('img')[1].alt);// new node -- extract your name from google account avatar logo alt text
 */

/*
try {
  let AiLogo = event.target.childNodes[0].childNodes[0].childNodes[0].getElementsByTagName('svg')[0].getAttribute("class"); // find the event when the AI logo will be inserted - class -> 'h-6 w-6'
} catch (event) {
  if (event.name === 'TypeError') { //element doesnt exist yet (undefined) - wait for the element to be created
  } else {
    throw event; // re-throw the error
  }
}
*/
let AiLogo = event.target.childNodes[0].childNodes[0].childNodes[0].getElementsByTagName('svg')[0].getAttribute("class"); // find the event when the AI logo will be inserted - class -> 'h-6 w-6'
if (AiLogo === 'h-6 w-6'){ //now swap the logo with the custom logo

    let elementsSVG = document.querySelectorAll('.flex.flex-col.relative.items-end svg');
    elementsSVG.forEach(function(elementSVG) {
        var imgElement = document.createElement("img");
        imgElement.src = link;
        if(circle){imgElement.style.borderRadius = "14px";}
        if(shadow){imgElement.style.boxShadow = "0 2px 4px rgba(0,0,0,6)";}

        elementSVG.parentNode.replaceChild(imgElement, elementSVG);
    });

    let elementsRound = document.querySelectorAll('.relative.p-1.rounded-sm.text-white.flex.items-center.justify-center');
    elementsRound.forEach(function(elementRound) {
        elementRound.style.padding = '0';
        if(circle){elementRound.style.borderRadius = "14px";}
    });

}

/*
try {
  let AiAnswer = event.target.childNodes[0].childNodes[1].childNodes[0].getElementsByTagName('div')[0].getAttribute("class"); //find the event when the AI gives an answer
} catch (event) {
  if (event.name === 'TypeError') { //element doesnt exist yet (undefined) - wait for the element to be created
  } else {
    throw event; // re-throw the error
  }
}
*/

let AiAnswer = event.target.childNodes[0].childNodes[1].childNodes[0].getElementsByTagName('div')[0].getAttribute("class"); //find the event when the AI gives an answer
if (AiAnswer === 'min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap'){

//alert (event.relatedNode.innerHTML);

let collectionA = document.getElementsByClassName('w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]'); //maybe that tag is different if you don't unse the dark theme!
var cLL = collectionA.length;


     if (cLL > 0){

var readcounter = 0;
var countnochange = 0;
var delay = 6000; //Delay for one loop = 6 seconds
var cutstart = 0;
var cutend = 0;
var cut1 = 0;
var cut2 = 0;
var speakstring = '';
var oldlenght = 0;


  var myLoop = setInterval(function() {

  var currentLL = collectionA[cLL-1].childNodes[0].childNodes[1].childNodes[0].childNodes[0].childNodes[0].innerHTML;
      currentLL = currentLL.substr(3,currentLL.length-2);

    if (currentLL.length > oldlenght){
       oldlenght = currentLL.length;
       countnochange = 0;
    }


     readcounter++;


      var posd = currentLL.lastIndexOf('.')+1;
      var posp = currentLL.lastIndexOf(':')+1;
      var pose = currentLL.lastIndexOf('!')+1;
      var posq = currentLL.lastIndexOf('?')+1;
      var posb = currentLL.lastIndexOf(',')+1;
      var posX = currentLL.lastIndexOf(' ')+1;

    console.log ('posd: '+posd+' posp: '+posp+' pose: '+pose+' posq: '+posq+' posb: '+posb+' posX: '+posX);

   if (posd > cut1) {cut1 = posd;}
   if (posp > cut1) {cut1 = posp;}
   if (pose > cut1) {cut1 = pose;}
   if (posq > cut1) {cut1 = posq;}

   if (posb > cut2) {cut2 = posb;}
   if (posX > cut2) {cut2 = posX;}

   if (posX-posb<20){cut2 = posb;}else{cut2 = posX;} //prefer cutting at ',' instead of the ' ' if the the ',' is less than 20 chars away.. for fluent speaking
   if (cut2>cut1){cutend = cut2;}else{cutend = cut1;} //prefer .:!?

console.log ('----------------------------------------------------------');
console.log ('start: '+cutstart);
console.log ('stop: '+cutend);

var diff = oldlenght - cutend;
console.log ('lenght: '+oldlenght);
console.log ('diff: '+diff);

if (readcounter === 1){
    speakstring = currentLL.substr(cutstart, cutend);
    speakstring = speakstring.replaceAll(/(<([^>]+)>)/ig,' '); //replace all tags with ' '
}else{
   var fixend = cutend - diff;
    console.log ('fixing end to: '+fixend);
    speakstring = currentLL.substr(cutstart, fixend); //WTF!!!!
    speakstring = speakstring.substr(0, (speakstring.length - diff));
    speakstring = speakstring.replaceAll(/(<([^>]+)>)/ig,' ');
}

    console.log ('readcounter:'+readcounter);
    console.log ('speakstring:'+speakstring);
    console.log ('----------------------------------------------------------');
    const synth = window.speechSynthesis;
    const voices = window.speechSynthesis.getVoices();
    //console.log ('voices:'+voices.length);
    const lastVoice = voices[voices.length - 1];//change voice - https://codersblock.com/blog/javascript-text-to-speech-and-its-many-quirks/
    const utterThis2 = new SpeechSynthesisUtterance(speakstring);
    utterThis2.voice = lastVoice;
    synth.speak(utterThis2);
    cutstart = cutend; //for next loop cycle


    if (currentLL.length === oldlenght){ // no change in text AI finisched writeing
        countnochange++;
        console.log ('count answer no change: '+countnochange);
          if (countnochange > 7){ //aftere 7 loops stop checking for changed answer
           clearInterval(myLoop);
            console.log ('count answer no change: '+countnochange);
            console.log ('stoped checking for answerchange');
            countnochange = 0;
          }
    }

  }, delay);

}

} //end answer

});

/*

let textelements = document.querySelectorAll('.flex.flex-col.w-full.py-2');
let element = textelements[0];
let textarea = element.querySelector('textarea');
textarea.value = textinput;

*/


/*
document.addEventListener('DOMContentLoaded', function() {

});
*/


QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址