ные, светящиеся белые. В цветном режиме промпт остаётся чистым и реалистичным. Промпт собирается в реальном времени по мере выбора параметров. Он полностью редактируется перед отправкой. Кнопка Копировать Промпт MJ отправляет его в Midjourney. Кнопка Инжектировать в Студию переносит его в обе зоны редактирования студии. При наличии ключа Reve 2.0 — прямая генерация прямо из модуля. Это логика фотографа-портретиста: сначала видишь лицо в голове, потом нажимаешь кнопку.', }, }; function ttsSetLang(lang,btn){_ttsLang=lang;document.querySelectorAll('.tts-lang').forEach(b=>b.classList.remove('active'));btn.classList.add('active');const lbl=(lang==='fr')?'Présentation':(lang==='en')?'Presentation':'Презентация';document.querySelectorAll('.tts-btn .tts-label').forEach(el=>{if(!['Arrêter','Stop','Стоп','…'].includes(el.textContent))el.textContent=lbl;});} async function ttsSpeak(btn,key){if(_ttsActive===btn){ttsStop();return;}ttsStop();const text=(_TTS[_ttsLang]||_TTS['fr'])[key];if(!text)return;_ttsCtx=new(window.AudioContext||window.webkitAudioContext)();_ttsCtx.resume();const icon=btn.querySelector('.tts-icon'),label=btn.querySelector('.tts-label');icon.textContent='⏳';label.textContent='…';btn.disabled=true;try{const resp=await fetch('https://philippejacquot.com/wp-content/uploads/api-tts.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({text,voice:'Kore'})});if(!resp.ok)throw new Error('HTTP '+resp.status);const data=await resp.json();if(data.error)throw new Error(data.error);const part=data?.candidates?.[0]?.content?.parts?.[0]?.inlineData;if(!part?.data)throw new Error('No audio');const bytes=Uint8Array.from(atob(part.data),c=>c.charCodeAt(0));const rateM=(part.mimeType||'').match(/rate=(\d+)/);const sr=rateM?parseInt(rateM[1]):24000;const wav=_pcm2wav(bytes,sr);await _ttsCtx.resume();const buf=await _ttsCtx.decodeAudioData(wav);_ttsSrc=_ttsCtx.createBufferSource();_ttsSrc.buffer=buf;_ttsSrc.connect(_ttsCtx.destination);const stop=(_ttsLang==='fr')?'Arrêter':(_ttsLang==='en')?'Stop':'Стоп';icon.textContent='🔊';label.textContent=stop;btn.classList.add('tts-playing');btn.disabled=false;_ttsActive=btn;_ttsSrc.onended=ttsStop;_ttsSrc.start(0);}catch(e){console.error('TTS:',e);const fb=(_ttsLang==='fr')?'Présentation':(_ttsLang==='en')?'Presentation':'Презентация';icon.textContent='🔊';label.textContent=fb;btn.disabled=false;}} function ttsStop(){if(_ttsSrc){try{_ttsSrc.stop();}catch(e){}_ttsSrc=null;}if(_ttsCtx){_ttsCtx.close();_ttsCtx=null;}if(_ttsActive){const icon=_ttsActive.querySelector('.tts-icon');const label=_ttsActive.querySelector('.tts-label');const fb=(_ttsLang==='fr')?'Présentation':(_ttsLang==='en')?'Presentation':'Презентация';if(icon)icon.textContent='🔊';if(label)label.textContent=fb;_ttsActive.classList.remove('tts-playing');_ttsActive.disabled=false;_ttsActive=null;}} function openDemoModal(){document.getElementById('demo-modal').classList.add('open');document.body.style.overflow='hidden';} function closeDemoModal(){document.getElementById('demo-modal').classList.remove('open');document.body.style.overflow='';} function sendDemoRequest(){ var prenom=(document.getElementById('demo-prenom').value||'').trim(); var nom=(document.getElementById('demo-nom').value||'').trim(); var email=(document.getElementById('demo-email').value||'').trim(); var pro=(document.getElementById('demo-pro').value||'').trim(); var c1=(document.getElementById('demo-c1').value||'').trim(); var c2=(document.getElementById('demo-c2').value||'').trim(); var c3=(document.getElementById('demo-c3').value||'').trim(); var msg=(document.getElementById('demo-msg').value||'').trim(); if(!prenom||!nom||!email){alert('Merci de renseigner au minimum Prénom, Nom et Email.');return;} var body='Bonjour Philippe,\n\nJe souhaite obtenir une démo personnalisée de THE FACE — Virtual Pro Photo Studios.\n\n'; body+='Prénom : '+prenom+'\nNom : '+nom+'\nEmail : '+email+'\n'; if(pro) body+='Profession / Société : '+pro+'\n'; if(c1||c2||c3){body+='\nCréneaux préférés :\n';if(c1)body+=' 1. '+c1+'\n';if(c2)body+=' 2. '+c2+'\n';if(c3)body+=' 3. '+c3+'\n';} if(msg) body+='\nMessage : '+msg+'\n'; body+='\nCordialement,\n'+prenom+' '+nom; var subject='Demande de démo — THE FACE Studio · Virtual Pro Photo Studios'; window.location.href='mailto:philippejacquot.mail@gmail.com?subject='+encodeURIComponent(subject)+'&body='+encodeURIComponent(body); setTimeout(closeDemoModal,1000); }