Расширение Chrome: доступ к микрофону с помощью вызова распознавания речи - PullRequest
0 голосов
/ 18 июня 2019

Прежде чем читать это, это может быть связано с Как расширение Chrome может получить разрешение пользователя на использование микрофона его компьютера? Я добавил ответ ниже, включая код и мой манифест, если это поможет.

Я пишу минимальное расширение Chrome (использующее Chrome 75.0.3770.90 в MacOS 10.14.5) для реализации кнопки «прослушивания» для моего проекта доступности. Я написал HTML-версию с JavaScript, который работает с микрофоном.

Однако, когда я поднимаю этот код в файл Extension background.js, преобразование текста в речь работает, но не преобразование речи в текст. Код запускается, но мигающий микрофон никогда не появляется на вкладке.

Код, который работает:


    <!DOCTYPE html>
    <html>
        <body>
        <h2>All-in-one JavaScript Example</h2>
        <button onclick="myCode();">Listen</button> 
        <script>
            window.SpeechRecognition = window.webkitSpeechRecognition 
               || window.SpeechRecognition;

            function myCode() {
                recognition = new SpeechRecognition();
                recognition.start();
                recognition.onresult = function(event) {    
                if (event.results[0].isFinal) {
                    response = event.results[0][0].transcript;
                    synth = window.speechSynthesis;
                    synth.speak( new SpeechSynthesisUtterance( 
                        "i don't understand, "+response
                    ));
            }   }
            alert( "all-in-one: we're done!" );
        }
        </script>
        </body>
    </html>

Минимальный воспроизводимый пример:


    {
        "name": "myName",
        "description": "Press to talk",
        "version": "0.97",
        "manifest_version": 2,
        "background": {
            "scripts": ["background.js"],
            "persistent": false
        },
        "permissions": ["contentSettings","desktopCapture","*://*/*","tabCapture","tabs","tts","ttsEngine"],
        "browser_action": {
            "default_icon": "images/myIcon512.png",
            "default_title": "Press Ctrl(Win)/Command(Mac)+Shift+ Down to speak"
        },
        "commands": {
            "myCommand": {
                "suggested_key": {
                    "default": "Ctrl+Shift+Down",
                    "mac": "Command+Shift+Down"
                },
                "description": "Start speaking"
            }
        },
        "icons": {
            "512": "images/myIcon512.png"
        }
    }

Мой фон JavaScript - это:

    window.SpeechRecognition = window.webkitSpeechRecognition || window.SpeechRecognition;

    function myCode() {
        var recognition = new SpeechRecognition();
        recognition.onresult = function(event) {
            if (event.results[0].isFinal) {
                var synth = window.speechSynthesis;
                synth.speak( new SpeechSynthesisUtterance(
                        "sorry, I don't understand."
                    )
                );
            }   
        }
        recognition.start();
        alert( "extension: we're done!" );
    }
    chrome.commands.onCommand.addListener(function(command) {
        if (command === 'myCommand')
            myCode();
    });

Я также заметил, что код запускается только один раз - я могу продолжать нажимать кнопку прослушивания, но команда Extension запускается только один раз (включение предупреждения в начале функции отображается только в первый раз). )

По умолчанию в моем браузере он должен один раз спросить, что он делает в HTML-версии.

Спасибо, просто за то, что прочитали это далеко! Я поставил ответ с кодом ниже.

1 Ответ

0 голосов
/ 04 июля 2019

Проблема, с которой я столкнулся, заключается в том, что микрофон кажется фоновым заданием, а я пытаюсь взаимодействовать с содержимым вкладок. Я не думаю, что это обычно, и в результате в моем манифесте (полностью) появилось общее значение 'match' (*://*/*):

{ "name": "Enguage(TM) - Let's all talk to the Web",
  "short_name" : "Enguage",
  "description": "A vocal Web interface",
  "version": "0.98",
  "manifest_version": 2,
  "content_security_policy": "script-src 'self'; object-src 'self'",
  "background": {
    "scripts": ["kbTx.js"],
    "persistent": false
  },
  "content_scripts": [
    { "matches" : ["*://*/*"],
      "js": ["tabRx.js", "interp.js"]
  } ],
  "permissions": [
    "activeTab",
    "contentSettings",
    "desktopCapture",
    "tabCapture",
    "tabs",
    "tts"
  ],
  "browser_action": {
    "default_icon": "images/lbolt512.png",
    "default_title": "Press Ctrl(Win)/Command(Mac)+Shift+ Space and speak"
  },
  "commands": {
    "enguage": {
      "suggested_key": {
        "default": "Ctrl+Shift+Space",
        "mac": "Command+Shift+Space"
      },
      "description": "single utterance"
  } },
  "icons": {
    "16": "images/lbolt16.png",
    "48": "images/lbolt48.png",
    "128": "images/lbolt128.png",
    "512": "images/lbolt512.png"
} }

Я думаю, Google не понравится! Во всяком случае, я вставил слушатель клавиатуры в свой фоновый код (kbTx.js):


    chrome.commands.onCommand.addListener(function(command) {
        if (command === 'enguage') {
        // find the active tab...
        chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
            //send it a message...
            chrome.tabs.sendMessage(
                tabs[0].id,          // index not always 0?
                null, // message sent - none required?
                null                 // response callback - none expected!
                //function(response) {console.log("done" /*response.farewell*/);}
                );
            });
        }
    });

И я вставил контекстный скрипт, который прослушивает это сообщение (tabRx.js):


    window.SpeechRecognition = window.webkitSpeechRecognition || 
                                window.SpeechRecognition;

    chrome.runtime.onMessage.addListener(
        function(request, sender, sendResponse) {
            var recognition = new SpeechRecognition();
            recognition.start();
            recognition.continuous = false;
            recognition.onresult = function(event) {
                if (event.results[0].isFinal) {
                    window.speechSynthesis.speak(
                        new SpeechSynthesisUtterance(
                            interp( event.results[0][0].transcript )
                    )   );
        }   }   }
    );

Слушатель сообщений по существу содержит код в allInOne.html примере выше. Могут быть и другие способы сделать это, но это работает и кажется достаточно легким. Надеюсь, это поможет.

Пожалуйста, не стесняйтесь добавлять комментарии к этому, если вы думаете, что я могу улучшить свой код!

...