【问题标题】:How to Python automatic language detection from SpeechRecognition如何从 SpeechRecognition 进行 Python 自动语言检测
【发布时间】:2021-07-20 03:01:28
【问题描述】:

当用户点击转录按钮时,Python 需要自动识别正在加载的音频文件的语言并以特定语言打印音频文件中的文本,这是否可能以及该功能应该是什么样子,请帮助.

from flask import Flask, render_template, request, redirect
import speech_recognition as sr

app = Flask(__name__)


@app.route("/", methods=["GET", "POST"])
def index():
    transcript = ""
    if request.method == "POST":
        print("FORM DATA RECEIVED")

        if "file" not in request.files:
            return redirect(request.url)

        file = request.files["file"]
        if file.filename == "":
            return redirect(request.url)

        if file:
            recognizer = sr.Recognizer()
            audioFile = sr.AudioFile(file)
            with audioFile as source:
                data = recognizer.record(source)

            transcript = recognizer.recognize_google(data, language="en-US")

    return render_template('index.html', transcript=transcript)


if __name__ == "__main__":
    app.run(debug=True, threaded=True)

好的,我在 HTML 下拉列表中创建了,但是如何链接它以获得transcript = recognizer.recognize_google(data, language="en-US") 所选语言的结果?

<label for="lang">Language:</label>
  <select name="lang" id="langs">
    <option value="en">English</option>
    <option value="es">Spanis</option>
    <option value="de">German</option>
  </select>

完整模板:

from flask import Flask, render_template, request, redirect
import speech_recognition as sr
import requests


app = Flask(__name__)


def get_languages():
    url = 'https://cloud.google.com/speech-to-text/docs/languages'
    resp = requests.get(url)
    start_text = '        <tbody class="list">\n'
    end_text = '        </tbody>\n'
    table = resp.text.split(start_text)[1].split(end_text)[0]
    tr_start = '          <tr>\n'
    sections = table.split(tr_start)[1:]
    languages = []

    for section in sections:
        short = section.splitlines()[1].split('<td>')[1].split('<')[0]
        long = section.splitlines()[0].split('<td>')[1].split('<')[0]
        if len(languages) > 0:
            # dupe check. For some reason the page has all
            # languages twice
            if languages[-1] != {'short': short, 'long': long}:
                languages.append({'short': short, 'long': long})
        else:
            languages.append({'short': short, 'long': long})
    print(f'FOUND {len(languages)} LANGUAGES')
    return languages


language_list = get_languages()


@app.route("/", methods=["GET", "POST"])
def index():
    transcript = ""
    if request.method == "POST":
        print("FORM DATA RECEIVED")
        # set the language, use en-US by default
        language = request.form.get('langs') or 'en-US'

        if "file" not in request.files:
            return redirect(request.url)

        file = request.files["file"]
        if file.filename == "":
            return redirect(request.url)

        if file:
            recognizer = sr.Recognizer()
            audioFile = sr.AudioFile(file)
            with audioFile as source:
                data = recognizer.record(source)

            # change the line below
            transcript = recognizer.recognize_google(data, language=language)

    return render_template('index.html', transcript=transcript, language_list=language_list)


if __name__ == "__main__":
    app.run(debug=True, threaded=True)

【问题讨论】:

  • 您说的是通用翻译器。该技术不存在。当您知道所说的语言时,语音识别就足够困难了。也许您可以进行研究以实现这一目标。
  • 比如我有一个西班牙语的音频文件,目前这个脚本只能识别英语,我需要在加载西班牙语音频文件时,Python自动识别西班牙语。
  • 对。我完全理解你在问什么。如果您知道该文件是西班牙语并将该信息与文件一起传递,您可以在脚本中选择正确的语言。但是除了《星际迷航》之外,根本不存在听文件并找出它是什么语言的技术。

标签: python speech-recognition speech-to-text google-cloud-speech


【解决方案1】:

编辑

您可能希望将方法 get_languages() 移动到另一个 py 文件,运行一次以将 language_list 保存为 JSON,并将 JSON 包含在您的 Flask 应用程序中,以便您可以从那里加载它,而不是让每次 Flask 应用启动时执行请求。

getlanguages.py

import requests
import json


def get_languages():
    url = 'https://cloud.google.com/speech-to-text/docs/languages'
    resp = requests.get(url)
    start_text = '        <tbody class="list">\n'
    end_text = '        </tbody>\n'
    table = resp.text.split(start_text)[1].split(end_text)[0]
    tr_start = '          <tr>\n'
    sections = table.split(tr_start)[1:]
    languages = []

    for section in sections:
        short = section.splitlines()[1].split('<td>')[1].split('<')[0]
        long = section.splitlines()[0].split('<td>')[1].split('<')[0]
        if len(languages) > 0:
        # dupe check
            if languages[-1] != {'short': short, 'long': long}:
                languages.append({'short': short, 'long': long})
        else:
            languages.append({'short': short, 'long': long})
    print(f'FOUND {len(languages)} LANGUAGES')
    return languages


with open('languages.json', 'w') as outfile:
    json.dump(get_languages(), outfile, indent=4)

app.py

删除该函数并将对language_list的赋值替换为下面的代码。

with open('languages.json') as infile:
    language_list = json.load(infile)

旧答案


我有一些可能对你有用的个人项目的代码。它对包含语音 API 可以处理的所有语言的 the page 执行请求,并提取完整的语言名称和 BCP-47 代码。您可以将其与 for 循环模板一起使用来创建下拉列表。

然后它只是从表单提交中获取变量并将语言变量传递给语音 API。我在index() 中添加了 1 行代码,并更改了脚本的生成方式。

ma​​in.py

get_languages() 方法需要在应用程序在 dunder main 中实例化之前调用...

from flask import Flask, render_template, request, redirect
import speech_recognition as sr
import requests


app = Flask(__name__)


def get_languages():
    url = 'https://cloud.google.com/speech-to-text/docs/languages'
    resp = requests.get(url)
    start_text = '        <tbody class="list">\n'
    end_text = '        </tbody>\n'
    table = resp.text.split(start_text)[1].split(end_text)[0]
    tr_start = '          <tr>\n'
    sections = table.split(tr_start)[1:]
    languages = []

    for section in sections:
        short = section.splitlines()[1].split('<td>')[1].split('<')[0]
        long = section.splitlines()[0].split('<td>')[1].split('<')[0]
        if len(languages) > 0:
            # dupe check. For some reason the page has all
            # languages twice
            if languages[-1] != {'short': short, 'long': long}:
                languages.append({'short': short, 'long': long})
        else:
            languages.append({'short': short, 'long': long})
    print(f'FOUND {len(languages)} LANGUAGES')
    return languages


language_list = get_languages()


@app.route("/", methods=["GET", "POST"])
def index():
    transcript = ""
    if request.method == "POST":
        print("FORM DATA RECEIVED")
        # set the language, use en-US by default
        language = request.form.get('lang') or 'en-US'
        print(f'SELECTED LANGUAGE: {language}')

        if "file" not in request.files:
            return redirect(request.url)

        file = request.files["file"]
        if file.filename == "":
            return redirect(request.url)

        if file:
            recognizer = sr.Recognizer()
            audioFile = sr.AudioFile(file)
            with audioFile as source:
                data = recognizer.record(source)

            # change the line below
            transcript = recognizer.recognize_google(data, language=language)

    return render_template('index.html', transcript=transcript, language_list=language_list)


if __name__ == "__main__":
    app.run(debug=True, threaded=True)

模板

将您的模板部分更改为此

<label for="lang">Language:</label>
    <select name="lang" id="langs">
        {% for lan in language_list %}
            <option value="{{ lan.short }}">{{ lan.long }}</option>
        {% endfor %}
    </select>

【讨论】:

  • 感谢您的帮助,但是当我运行代码时,它只打印英文,无法识别其他语言,这是什么问题?
  • 你能把你正在使用的完整模板放在问题中吗?
  • 所以,有两件事:我在language = request.form.get('lang') or 'en-US' 中有错字。我使用的是langs 而不是lang。我已经编辑了我的代码。第二件事是,在您的模板中,您在表单标签之外有选择下拉菜单。您需要将其移动到表单标签内,使其成为表单的一部分...
  • 我做了另一个编辑,将语言列表的生成移动到一个单独的 py 文件中,并简单地将 JSON 加载到另一个 py 文件生成的 Flask 应用程序中......
  • 如果它适合您,请随时接受答案:-)
猜你喜欢
  • 2012-10-27
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2019-11-26
  • 2020-11-10
  • 1970-01-01
相关资源
最近更新 更多