{"id":8020,"date":"2024-08-21T13:57:13","date_gmt":"2024-08-21T10:57:13","guid":{"rendered":"https:\/\/digitalrise.art\/?page_id=8020"},"modified":"2024-08-21T20:38:24","modified_gmt":"2024-08-21T17:38:24","slug":"%d7%90%d7%a0%d7%99%d7%9e%d7%a6%d7%99%d7%94","status":"publish","type":"page","link":"https:\/\/digitalrise.art\/?page_id=8020","title":{"rendered":"\u05d0\u05e0\u05d9\u05de\u05e6\u05d9\u05d4"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"8020\" class=\"elementor elementor-8020\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-97f79c9 e-con-full e-flex e-con e-parent\" data-id=\"97f79c9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c127f95 elementor-widget elementor-widget-html\" data-id=\"c127f95\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"he\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>\u05d1\u05d5\u05d8 \u05e2\u05dd \u05d0\u05e0\u05d9\u05de\u05e6\u05d9\u05d9\u05ea \u05e4\u05e0\u05d9\u05dd \u05de\u05e2\u05d5\u05d3\u05e0\u05ea<\/title>\r\n    <style>\r\n        body { margin: 0; direction: rtl; }\r\n        canvas { display: block; }\r\n        #speakButton {\r\n            position: absolute;\r\n            top: 20px;\r\n            left: 20px;\r\n            padding: 10px 20px;\r\n            background-color: #4CAF50;\r\n            color: white;\r\n            border: none;\r\n            cursor: pointer;\r\n        }\r\n        #errorMessage {\r\n            position: absolute;\r\n            top: 70px;\r\n            left: 20px;\r\n            color: red;\r\n            display: none;\r\n        }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n    <button id=\"speakButton\">\u05d4\u05ea\u05d7\u05dc \u05d3\u05d9\u05d1\u05d5\u05e8<\/button>\r\n    <div id=\"errorMessage\"><\/div>\r\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script>\r\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/tween.js\/18.6.4\/tween.umd.min.js\"><\/script>\r\n    <script>\r\n        let scene, camera, renderer, bot, uniforms;\r\n        const ttsApiKey = \"AIzaSyC2k08DtlGuNp_-jk3CR-Z9-IZLl_iMQQs\";\r\n        const ttsApiEndpoint = \"https:\/\/texttospeech.googleapis.com\/v1\/text:synthesize\";\r\n\r\n        init();\r\n        animate();\r\n\r\n        function init() {\r\n            scene = new THREE.Scene();\r\n            camera = new THREE.PerspectiveCamera(75, window.innerWidth \/ window.innerHeight, 0.1, 1000);\r\n            camera.position.z = 5;\r\n\r\n            renderer = new THREE.WebGLRenderer({ alpha: true });\r\n            renderer.setSize(window.innerWidth, window.innerHeight);\r\n            document.body.appendChild(renderer.domElement);\r\n\r\n            const textureLoader = new THREE.TextureLoader();\r\n            textureLoader.load('https:\/\/digitalrise.art\/animate\/bot.png', (texture) => {\r\n                texture.minFilter = THREE.LinearFilter;\r\n                texture.magFilter = THREE.LinearFilter;\r\n                texture.anisotropy = renderer.capabilities.getMaxAnisotropy();\r\n\r\n                uniforms = {\r\n                    uTexture: { value: texture },\r\n                    leftEyeCenter: { value: new THREE.Vector2(0.35, 0.50) },  \/\/ Slightly lowered\r\n                    rightEyeCenter: { value: new THREE.Vector2(0.65, 0.50) }, \/\/ Slightly lowered\r\n                    mouthCenter: { value: new THREE.Vector2(0.5, 0.2) },\r\n                    eyesClosed: { value: 0.0 },\r\n                    mouthOpen: { value: 0.0 }\r\n                };\r\n\r\n                const geometry = new THREE.PlaneGeometry(3, 3, 128, 128);\r\n                const material = new THREE.ShaderMaterial({\r\n                    uniforms: uniforms,\r\n                    vertexShader: `\r\n                        uniform vec2 leftEyeCenter;\r\n                        uniform vec2 rightEyeCenter;\r\n                        uniform vec2 mouthCenter;\r\n                        uniform float eyesClosed;\r\n                        uniform float mouthOpen;\r\n                        varying vec2 vUv;\r\n                        varying float vEyeEffect;\r\n                        varying float vMouthEffect;\r\n\r\n                        float sineInOut(float t) {\r\n                            return -0.5 * (cos(3.14159 * t) - 1.0);\r\n                        }\r\n\r\n                        void main() {\r\n                            vUv = uv;\r\n                            vec3 newPosition = position;\r\n\r\n                            \/\/ Eye blinking\r\n                            vec2 eyeCenter = (distance(uv, leftEyeCenter) < distance(uv, rightEyeCenter)) ? leftEyeCenter : rightEyeCenter;\r\n                            float eyeDistance = distance(uv, eyeCenter);\r\n                            if (eyeDistance < 0.10) {  \/\/ Reduced eye area\r\n                                float eyeDisplacement = sineInOut(eyesClosed) * 0.15;\r\n                                float verticalOffset = (uv.y - eyeCenter.y) \/ 0.10;\r\n                                newPosition.y -= eyeDisplacement * sign(verticalOffset) * (1.0 - abs(verticalOffset));\r\n                                vEyeEffect = 1.0 - (eyeDistance \/ 0.10);\r\n                            } else {\r\n                                vEyeEffect = 0.0;\r\n                            }\r\n\r\n                            \/\/ Mouth movement\r\n                            float mouthDistance = distance(uv, mouthCenter);\r\n                            if (mouthDistance < 0.15) {  \/\/ Reduced mouth area\r\n                                float mouthDisplacement = sineInOut(mouthOpen) * 0.05;  \/\/ Reduced displacement\r\n                                float verticalOffset = (uv.y - mouthCenter.y) \/ 0.15;\r\n                                if (verticalOffset > 0.0) {\r\n                                    \/\/ Upper lip\r\n                                    newPosition.y += mouthDisplacement * (1.0 - verticalOffset);\r\n                                } else {\r\n                                    \/\/ Lower lip\r\n                                    newPosition.y -= mouthDisplacement * (1.0 + verticalOffset);\r\n                                }\r\n                                vMouthEffect = 1.0 - (mouthDistance \/ 0.15);\r\n                            } else {\r\n                                vMouthEffect = 0.0;\r\n                            }\r\n\r\n                            gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0);\r\n                        }\r\n                    `,\r\n                    fragmentShader: `\r\n                        uniform sampler2D uTexture;\r\n                        uniform float mouthOpen;\r\n                        varying vec2 vUv;\r\n                        varying float vEyeEffect;\r\n                        varying float vMouthEffect;\r\n\r\n                        void main() {\r\n                            vec4 texColor = texture2D(uTexture, vUv);\r\n                            \r\n                            \/\/ Subtle lip color adjustment\r\n                            vec3 lipColor = vec3(0.8, 0.4, 0.4);  \/\/ More subtle red\r\n                            float lipIntensity = vMouthEffect * mouthOpen * 0.2;  \/\/ Reduced intensity\r\n                            texColor.rgb = mix(texColor.rgb, lipColor, lipIntensity);\r\n\r\n                            gl_FragColor = texColor;\r\n                        }\r\n                    `,\r\n                    transparent: true\r\n                });\r\n\r\n                bot = new THREE.Mesh(geometry, material);\r\n                scene.add(bot);\r\n            });\r\n\r\n            document.getElementById('speakButton').addEventListener('click', startSpeech);\r\n            window.addEventListener('resize', onWindowResize);\r\n\r\n            \/\/ Start blinking\r\n            setInterval(blink, 4000);\r\n        }\r\n\r\n        function blink() {\r\n            if (uniforms && uniforms.eyesClosed) {\r\n                new TWEEN.Tween(uniforms.eyesClosed)\r\n                    .to({ value: 1 }, 200)\r\n                    .yoyo(true)\r\n                    .repeat(1)\r\n                    .easing(TWEEN.Easing.Quadratic.InOut)\r\n                    .start();\r\n            }\r\n        }\r\n\r\n        function animate() {\r\n            requestAnimationFrame(animate);\r\n            TWEEN.update();\r\n            renderer.render(scene, camera);\r\n        }\r\n\r\n        async function startSpeech() {\r\n            const text = \"\u05e9\u05dc\u05d5\u05dd \u05dc\u05da \u05de\u05d4 \u05e9\u05dc\u05d5\u05de\u05da? \u05e9\u05de\u05d7\u05d9\u05dd \u05e9\u05d1\u05d7\u05e8\u05ea \u05d1DR DIGITAL, \u05d0\u05e0\u05d7\u05e0\u05d5 \u05de\u05ea\u05de\u05d7\u05d9\u05dd \u05d1\u05d1\u05e0\u05d9\u05d9\u05ea \u05d0\u05ea\u05e8\u05d9\u05dd, \u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d5\u05ea, \u05e6'\u05d0\u05d8 \u05d1\u05d5\u05d8\u05d9\u05dd \u05d5\u05e2\u05d5\u05d3, \u05e0\u05e9\u05de\u05d7 \u05dc\u05ea\u05ea \u05dc\u05da \u05e9\u05d9\u05e8\u05d5\u05ea.\";\r\n            try {\r\n                const response = await fetch(`${ttsApiEndpoint}?key=${ttsApiKey}`, {\r\n                    method: \"POST\",\r\n                    headers: {\r\n                        \"Content-Type\": \"application\/json\"\r\n                    },\r\n                    body: JSON.stringify({\r\n                        input: { text: text },\r\n                        voice: { languageCode: \"he-IL\", ssmlGender: \"FEMALE\" },\r\n                        audioConfig: { audioEncoding: \"MP3\" }\r\n                    })\r\n                });\r\n\r\n                if (!response.ok) {\r\n                    throw new Error(`HTTP error! status: ${response.status}`);\r\n                }\r\n\r\n                const data = await response.json();\r\n                if (data.audioContent) {\r\n                    const audio = new Audio(\"data:audio\/mp3;base64,\" + data.audioContent);\r\n                    audio.play();\r\n                    startMouthAnimation();\r\n                    audio.addEventListener(\"ended\", stopMouthAnimation);\r\n                } else {\r\n                    throw new Error(\"No audio content received\");\r\n                }\r\n            } catch (error) {\r\n                console.error(\"Error in text-to-speech:\", error);\r\n                showError(\"\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05d4\u05de\u05e8\u05ea \u05d8\u05e7\u05e1\u05d8 \u05dc\u05d3\u05d9\u05d1\u05d5\u05e8. \u05e0\u05d0 \u05dc\u05e0\u05e1\u05d5\u05ea \u05e9\u05d5\u05d1.\");\r\n            }\r\n        }\r\n\r\n        function startMouthAnimation() {\r\n            if (uniforms && uniforms.mouthOpen) {\r\n                new TWEEN.Tween(uniforms.mouthOpen)\r\n                    .to({ value: 1 }, 150)\r\n                    .yoyo(true)\r\n                    .repeat(Infinity)\r\n                    .easing(TWEEN.Easing.Sinusoidal.InOut)\r\n                    .start();\r\n            }\r\n        }\r\n\r\n        function stopMouthAnimation() {\r\n            TWEEN.removeAll();\r\n            if (uniforms && uniforms.mouthOpen) {\r\n                uniforms.mouthOpen.value = 0;\r\n            }\r\n        }\r\n\r\n        function onWindowResize() {\r\n            camera.aspect = window.innerWidth \/ window.innerHeight;\r\n            camera.updateProjectionMatrix();\r\n            renderer.setSize(window.innerWidth, window.innerHeight);\r\n        }\r\n\r\n        function showError(message) {\r\n            const errorElement = document.getElementById('errorMessage');\r\n            errorElement.textContent = message;\r\n            errorElement.style.display = 'block';\r\n        }\r\n    <\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u05d1\u05d5\u05d8 \u05e2\u05dd \u05d0\u05e0\u05d9\u05de\u05e6\u05d9\u05d9\u05ea \u05e4\u05e0\u05d9\u05dd \u05de\u05e2\u05d5\u05d3\u05e0\u05ea \u05d4\u05ea\u05d7\u05dc \u05d3\u05d9\u05d1\u05d5\u05e8<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_eb_attr":"","content-type":"","site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-8020","page","type-page","status-publish","hentry"],"ams_acf":[],"_links":{"self":[{"href":"https:\/\/digitalrise.art\/index.php?rest_route=\/wp\/v2\/pages\/8020","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalrise.art\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/digitalrise.art\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/digitalrise.art\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalrise.art\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8020"}],"version-history":[{"count":142,"href":"https:\/\/digitalrise.art\/index.php?rest_route=\/wp\/v2\/pages\/8020\/revisions"}],"predecessor-version":[{"id":8163,"href":"https:\/\/digitalrise.art\/index.php?rest_route=\/wp\/v2\/pages\/8020\/revisions\/8163"}],"wp:attachment":[{"href":"https:\/\/digitalrise.art\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}