Как подключить микрофон браузера к моему приложению flask? - PullRequest
2 голосов
/ 04 августа 2020

Я использую модуль распознавания речи, чтобы идентифицировать поисковый запрос с помощью голоса, а затем открываю страницу chrome Google, показывающую результат запроса. По сути, это замена голосового поиска Google, но запускается через терминал. Но я хочу превратить это в веб-приложение. Я создал приложение flask:

-Search (каталог)

-search.py (opens a tab using terminal directly/works independently)

-app.py (main flask app)

-static(directory)

-templates (directory)

Но поскольку приложение размещено на сервере, мой search.py ​​принимает входные данные с сервера mi c (в данном случае это микрофон моего P C / но на AWS он не будет работать). Как получить данные из клиентского браузера и использовать их в Speech.py? Следует ли мне удалить этот файл и использовать его непосредственно в своем основном приложении? Каков наиболее эффективный способ выполнения этой функции?

Вот мой сценарий search.py, если кто-то хочет знать: он работает через терминал.

import subprocess

import speech_recognition as sr

browser_exe_path = "..."

r=sr.Recognizer()
with sr.Microphone() as source:
    print("Listening!")
    audio=r.listen(source)

    try:
        s_name=r.recognize_google(audio)
        """
        Code to open browser and search the query
        """
    except:
        print("Error!")

1 Ответ

0 голосов
/ 16 августа 2020

Эти два, вероятно, будут наилучшими способами:

  • создать модуль / пакет вашего собственного инструмента распознавания речи и импортировать его в свое flask приложение
  • интегрировать функциональность

Если вы планируете использовать его снова, было бы неплохо сохранить распознавание речи отдельно от веб-приложения, потому что тогда вы можете использовать его снова. Но вы можете настроить его гораздо больше, если интегрируете, например, с функциями просмотра вашего приложения. Кроме того, вам, вероятно, следует поместить все ваши logi c search.py ​​в одну функцию или класс, чтобы вы могли его вызвать. В противном случае, если вы импортируете его в том виде, в каком он есть сейчас, он немедленно запустится.

В любом случае вам нужна структура речи, которая выглядит примерно так:

  1. Пользователь отправляет какую-то речь в прямом эфире, в записи или в виде файла. Мы назовем этот речевой файл speech.wav (или любой другой тип файла по вашему выбору).
  2. speech.wav читается и анализируется вашим инструментом распознавания речи. Он может вернуть список слов или, может быть, просто строку. Мы назовем это output.
  3. output возвращается на веб-страницу и отображается как что-то для чтения пользователем.

Я предлагаю начать с отправки формы и Если вы можете заставить это работать, вы можете попробовать распознавание живой речи с помощью AJAX. Запустите basi c и просто попросите пользователя добавить аудиофайл или записать его. Следующий скрипт откроет файловый браузер, если он находится на рабочем столе, или заставит пользователя записать, если он iOS или Android.

  <input name="audio-recording" type="file" accept="audio/*" id="audio-recording" capture>
  <label for="audio-recording">Add Audio</label>

  <p id="output"></p>

Итак, как только у них есть файл, вам нужно получить доступ к нему. Вы можете настроить его, но вот базовый c скрипт, который возьмет на себя управление вышеупомянутым звуком. Кредит за этот скрипт принадлежит разработчикам Google.

<script>
  const recorder = document.getElementById('audio-recording');

  recorder.addEventListener('change', function(e) {
    const file = e.target.files[0];
    const url = URL.createObjectURL(file);
    // Do something with the audio file.
    
  });
</script>

Там, где написано // Do something with the audio file, было бы неплохо сделать запрос AJAX GET, который вернет предложение. Но здесь все становится действительно сложно, потому что вам нужно передать информацию в flask в аргументах, а не в аудиофайл. Но поскольку мы сохранили место, где существует файл, с константой url в нашем скрипте, мы можем использовать это в качестве аргумента, например:

from flask import request, jsonify
import search # this is your own search.py that you mentioned in your question.

@app.route("/process_audio")
def process_audio():
    url = request.args.get("url")
    text = search.a_function(url) #returns the text from the audio, which you've done, so I've omitted code
    if text != None
        return jsonify(result="success",text=text)
    else:
        return jsonify(result="fail")

Это вернет данные в том, что называется Формат JSON, который похож на мост между клиентской js и серверной python. Это может выглядеть примерно так:

{
 "result":"success",
 "text":"This is a test voice recording"
}

Тогда вам понадобится jQuery (или любая другая js библиотека, но jQuery - это хорошо и легко) для управления AJAX звоните:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script type=text/javascript>
        const recorder = document.getElementById('audio-recording');

  recorder.addEventListener('change', function(e) {
    const file = e.target.files[0];
    const url = URL.createObjectURL(file);
    $.getJSON('/process_audio', {
          url: url 
        }, function(data) {
          $("#output").text(data.text);
            });
            return false;
          
    </script>

Приносим извинения за возможные ошибки брекетинга. Таким образом, он должен отправить запрос GET для некоторого JSON по URL-адресу «/ audio_process», который вернет то, что мы видели ранее, а затем он выведет "text" из JSON в "#output" HTML селектор.

Может потребоваться некоторая отладка, но, похоже, это помогает.

...