// Name: Speech to Text // ID: SpeechToTextByBr0tcraft // Description: An easy way to convert speech to text. (function (Scratch) { 'use strict'; // Ensure the extension runs unsandboxed if (!Scratch.extensions.unsandboxed) throw new Error('This extension must run unsandboxed'); class SpeechToTextExtension { constructor(runtime) { this.runtime = runtime; this.recognition = new webkitSpeechRecognition(); this.audio = new Audio(); this.recognition.lang = 'de-DE'; // Default language } getInfo() { return { id: 'SpeechToTextByBr0tcraft', name: 'Speech to Text', color1: '#80abff', color2: '#3a7eff', color3: '#0058ff', menuIconURI: 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxNDYuNzYwOTQiIGhlaWdodD0iMTgzLjcyNDM1IiB2aWV3Qm94PSIwLDAsMTQ2Ljc2MDk0LDE4My43MjQzNSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2OC44NzkxOCwtODguMTM3ODMpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0yNjYuMzIxODQsMjU1LjE4MjczYy0xNS41MTU3LDEuNjk2NiAtMzQuODc2OTQsLTguNzIyNTEgLTQzLjI0NDQsLTIzLjI3MTg2Yy04LjM2NzQ3LC0xNC41NDkzNSAtMi41NzI2NiwtMjcuNzE5MzkgMTIuOTQzMDQsLTI5LjQxNmMxNS41MTU3LC0xLjY5NjYxIDM0Ljg3NjkzLDguNzIyNTEgNDMuMjQ0NCwyMy4yNzE4NmM4LjM2NzQ2LDE0LjU0OTM1IDIuNTcyNjYsMjcuNzE5MzkgLTEyLjk0MzA0LDI5LjQxNnoiIGZpbGw9IiM4NThiZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIi8+PHBhdGggZD0iTTI5Ni41NDg3MSwyMjcuNTk1NjdsLTQuOTY1NzIsMjIuMjk2MDlsLTc5LjU0MTY3LC05LjY4MTM4bC00LjI1MzksLTI2LjM3MzJ6IiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpbmRleCZxdW90OzpudWxsfSIgZmlsbD0iIzU1NWRmZiIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjAiLz48cGF0aCBkPSJNMjA2LjUzMDgzLDE0NC44ODYxNGw0LjI1MzksLTI2LjM3MzJsNzkuNTQxNjgsLTkuNjgxMzhsNC45NjU3MiwyMi4yOTYwOXoiIGZpbGw9IiM1NTVkZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIi8+PHBhdGggZD0iTTI3Ny4zMTM1MywyNzEuODYyMTdjLTU3LjQyMDE1LDAgLTEwOC40MzQzNSwtNDIuMTE4NDYgLTEwOC40MzQzNSwtOTIuNTAwMTdjMCwtNTAuMzgxNzIgNDYuNTQ4MjUsLTkxLjIyNDE3IDEwMy45Njg0OSwtOTEuMjI0MTdjNi4wMzEyNywwIDE4LjEwNzI0LDIxLjc2NDg0IDE4LjEwNzI0LDIxLjc2NDg0Yy01NS45MzgzMywxLjM5MTE1IC05MC41NTc3MSwyOC4yNTE4MSAtOTAuNTU3NzEsNzQuNTYzMjVjMCw0Ni4zMTE0NCA5MS44MzM3MSw2NS4xOTI3IDkxLjgzMzcxLDY1LjE5MjdjLTQuNzY0MjMsMy42MDI5OCAtOC44ODYwOCwyMi4yMDM1NiAtMTQuOTE3MjYsMjIuMjAzNTZ6IiBmaWxsPSIjMDAwZWZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iTmFOIi8+PHRleHQgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjA0LjM4NDEzLDE5Mi4wNjYyNykgc2NhbGUoMC44MTEwNCwwLjgxMTA0KSIgZm9udC1zaXplPSI0MCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aW5kZXgmcXVvdDs6bnVsbH0iIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1saW5lY2FwPSJidXR0IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIGZvbnQtZmFtaWx5PSJTYW5zIFNlcmlmIiBmb250LXdlaWdodD0ibm9ybWFsIiB0ZXh0LWFuY2hvcj0ic3RhcnQiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTogbm9ybWFsIj48dHNwYW4geD0iMCIgZHk9IjAiPkM8L3RzcGFuPjwvdGV4dD48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMjQuNzQzODgsMTk4LjAxNDY2KSBzY2FsZSgxLjI5NDk0LDEuMjk0OTQpIiBmb250LXNpemU9IjQwIiB4bWw6c3BhY2U9InByZXNlcnZlIiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpbmRleCZxdW90OzpudWxsfSIgZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgZm9udC1mYW1pbHk9IlNhbnMgU2VyaWYiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIHRleHQtYW5jaG9yPSJzdGFydCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjx0c3BhbiB4PSIwIiBkeT0iMCI+QjwvdHNwYW4+PC90ZXh0Pjx0ZXh0IHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2MC41OTg2NCwyMDUuMjY2NjkpIHNjYWxlKDEuOTMxMjgsMS45MzEyOCkiIGZvbnQtc2l6ZT0iNDAiIHhtbDpzcGFjZT0icHJlc2VydmUiIGRhdGEtcGFwZXItZGF0YT0ieyZxdW90O2luZGV4JnF1b3Q7Om51bGx9IiBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBmb250LWZhbWlseT0iU2FucyBTZXJpZiIgZm9udC13ZWlnaHQ9Im5vcm1hbCIgdGV4dC1hbmNob3I9InN0YXJ0IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI+PHRzcGFuIHg9IjAiIGR5PSIwIj5BPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L3N2Zz48IS0tcm90YXRpb25DZW50ZXI6NzEuMTIwODE5OTk5OTk5OTg6OTEuODYyMTY1LS0+', blocks: [ { opcode: 'konvert', blockType: Scratch.BlockType.REPORTER, text: 'Convert speech to text', disableMonitor: true }, { opcode: 'setLanguage', blockType: Scratch.BlockType.COMMAND, text: 'Set language to [l]', arguments: { l: { type: Scratch.ArgumentType.STRING, defaultValue: 'de-DE', menu: 'LANGUAGE' } } }, { opcode: 'Language', blockType: Scratch.BlockType.REPORTER, text: 'language' }, ], menus: { LANGUAGE: { acceptReporters: true, items: [ { text: 'English', value: 'en-US' }, { text: 'Spanish', value: 'es-ES' }, { text: 'French', value: 'fr_FR' }, { text: 'German', value: 'de-DE' }, { text: 'Italian', value: 'it-IT' }, { text: 'Japanese', value: 'ja-JP' }, { text: 'Korean', value: 'ko-KR' }, { text: 'Portuguese', value: 'pt-BR' }, { text: 'Chinese', value: 'zh-CN' }, { text: 'Russian', value: 'ru-RU' }, ], }, }, }; } konvert() { this.recognition.interimResults = false; return new Promise((resolve, reject) => { this.recognition.onresult = (event) => { const transcript = event.results[0][0].transcript; resolve(transcript); }; this.recognition.onerror = (event) => { reject(`Error in speech recognition: ${event.error}`); }; // Start the speech recognition when the block is triggered this.recognition.start(); }); } setLanguage(args) { const newLanguage = args.l; this.recognition.lang = newLanguage; } Language(args) { return this.recognition.lang; } } // Register the extension with Scratch Scratch.extensions.register(new SpeechToTextExtension()); })(Scratch);