微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 SpeechRecognition 进行 Python 自动语言检测

如何解决如何从 SpeechRecognition 进行 Python 自动语言检测

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

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,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("/","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)

解决方法

编辑

您可能希望将方法 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)

旧答案


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

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

ma​​in.py

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

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})
    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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。