Python 如何在dash中实现我的应用程序来转录要上载的文件?
我已经成功创建了一个dash应用程序,可以让你上传文件。但是我正在尝试在它里面实现我的watson语音应用程序,以便它能够通过点击按钮来获取上传的文件并运行它们 上传代码-Python 如何在dash中实现我的应用程序来转录要上载的文件?,python,pandas,plotly,plotly-dash,Python,Pandas,Plotly,Plotly Dash,我已经成功创建了一个dash应用程序,可以让你上传文件。但是我正在尝试在它里面实现我的watson语音应用程序,以便它能够通过点击按钮来获取上传的文件并运行它们 上传代码- import base64 import os from urllib.parse import quote as urlquote from flask import Flask, send_from_directory import dash import dash_core_components as dcc imp
import base64
import os
from urllib.parse import quote as urlquote
from flask import Flask, send_from_directory
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
UPLOAD_DIRECTORY = "/project/app_uploaded_files"
if not os.path.exists(UPLOAD_DIRECTORY):
os.makedirs(UPLOAD_DIRECTORY)
# Normally, Dash creates its own Flask server internally. By creating our own,
# we can create a route for downloading files directly:
server = Flask(__name__)
app = dash.Dash(server=server)
@server.route("/download/<path:path>")
def download(path):
"""Serve a file from the upload directory."""
return send_from_directory(UPLOAD_DIRECTORY, path, as_attachment=True)
app.layout = html.Div(
[
html.H1("File Browser"),
html.H2("Upload"),
dcc.Upload(
id="upload-data",
children=html.Div(
["Drag and drop or click to select a file to upload."]
),
style={
"width": "100%",
"height": "60px",
"lineHeight": "60px",
"borderWidth": "1px",
"borderStyle": "dashed",
"borderRadius": "5px",
"textAlign": "center",
"margin": "10px",
},
multiple=True,
),
html.H2("File List"),
html.Ul(id="file-list"),
],
style={"max-width": "500px"},
)
def save_file(name, content):
"""Decode and store a file uploaded with Plotly Dash."""
data = content.encode("utf8").split(b";base64,")[1]
with open(os.path.join(UPLOAD_DIRECTORY, name), "wb") as fp:
fp.write(base64.decodebytes(data))
def uploaded_files():
"""List the files in the upload directory."""
files = []
for filename in os.listdir(UPLOAD_DIRECTORY):
path = os.path.join(UPLOAD_DIRECTORY, filename)
if os.path.isfile(path):
files.append(filename)
return files
def file_download_link(filename):
"""Create a Plotly Dash 'A' element that downloads a file from the app."""
location = "/download/{}".format(urlquote(filename))
return html.A(filename, href=location)
@app.callback(
Output("file-list", "children"),
[Input("upload-data", "filename"), Input("upload-data", "contents")],
)
def update_output(uploaded_filenames, uploaded_file_contents):
"""Save uploaded files and regenerate the file list."""
if uploaded_filenames is not None and uploaded_file_contents is not None:
for name, data in zip(uploaded_filenames, uploaded_file_contents):
save_file(name, data)
files = uploaded_files()
if len(files) == 0:
return [html.Li("No files yet!")]
else:
return [html.Li(file_download_link(filename)) for filename in files]
if __name__ == "__main__":
app.run_server(debug=False, port=8888)
我该怎么做呢?您可以将该按钮添加到
布局中。将另一个回调连接到该按钮以运行所需的代码,它可以输出到div
或类似文件。
import json
from os.path import join, dirname
from ibm_watson import SpeechToTextV1
from ibm_watson.websocket import RecognizeCallback, AudioSource
import threading
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
import pandas as pd
authenticator = IAMAuthenticator('XXX-XXX')
service = SpeechToTextV1(authenticator=authenticator)
service.set_service_url('https://api.us-east.speech-to-text.watson.cloud.ibm.com')
models = service.list_models().get_result()
#print(json.dumps(models, indent=2))
model = service.get_model('en-US_BroadbandModel').get_result()
#print(json.dumps(model, indent=2))
# This is the name of the file u need to change below
with open(join(dirname('__file__'), 'Call 8.wav'),
'rb') as audio_file:
# print(json.dumps(
output = service.recognize(
audio=audio_file,
speaker_labels=True,
content_type='audio/wav',
#timestamps=True,
#word_confidence=True,
inactivity_timeout = -1,
model='en-US_NarrowbandModel',
continuous=True).get_result(),
indent=2
df0 = pd.DataFrame([i for elts in output for alts in elts['results'] for i in alts['alternatives']])
df1 = pd.DataFrame([i for elts in output for i in elts['speaker_labels']])
list(df0.columns)
list(df1.columns)
df0 = df0.drop(["timestamps"], axis=1)
df1 = df1.drop(["final"], axis=1)
df1 = df1.drop(['confidence'],axis=1)
test3 = pd.concat([df0, df1], axis=1)
#sentiment
transcript = test3['transcript']
transcript = transcript.dropna()
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
analyzer = SentimentIntensityAnalyzer()
text = transcript
scores = []
for txt in text:
vs = analyzer.polarity_scores(txt)
scores.append(vs)
data = pd.DataFrame(text, columns= ['Text'])
data2 = pd.DataFrame(scores)
final_dataset= pd.concat([data,data2], axis=1)
test4 = pd.concat([test3,final_dataset], axis=1)
test4 = test4.drop(['Text'],axis=1)
test4.rename(columns={'neg':'Negative'},
inplace=True)
test4.rename(columns={'pos':'Positive'},
inplace=True)
test4.rename(columns={'neu':'Neutral'},
inplace=True)
# This is the name of the output csv file u need to change below
test4.to_csv("Call 8.csv")