问题描述
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 行代码并更改了生成脚本的方式。
main.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>