Commit Β·
43d7d48
0
Parent(s):
Duplicate from mrfakename/Translate
Browse filesCo-authored-by: mrfakename <mrfakename@users.noreply.huggingface.co>
- .gitattributes +31 -0
- README.md +38 -0
- available_models.py +48 -0
- main.py +71 -0
- requirements.txt +6 -0
.gitattributes
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: Translator
|
| 3 |
+
emoji: π£οΈ
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: pink
|
| 6 |
+
sdk: streamlit
|
| 7 |
+
app_file: main.py
|
| 8 |
+
pinned: false
|
| 9 |
+
duplicated_from: mrfakename/Translate
|
| 10 |
+
---
|
| 11 |
+
|
| 12 |
+
# Configuration
|
| 13 |
+
|
| 14 |
+
`title`: _string_
|
| 15 |
+
Display title for the Space
|
| 16 |
+
|
| 17 |
+
`emoji`: _string_
|
| 18 |
+
Space emoji (emoji-only character allowed)
|
| 19 |
+
|
| 20 |
+
`colorFrom`: _string_
|
| 21 |
+
Color for Thumbnail gradient (red, yellow, green, blue, indigo, purple, pink, gray)
|
| 22 |
+
|
| 23 |
+
`colorTo`: _string_
|
| 24 |
+
Color for Thumbnail gradient (red, yellow, green, blue, indigo, purple, pink, gray)
|
| 25 |
+
|
| 26 |
+
`sdk`: _string_
|
| 27 |
+
Can be either `gradio`, `streamlit`, or `static`
|
| 28 |
+
|
| 29 |
+
`sdk_version` : _string_
|
| 30 |
+
Only applicable for `streamlit` SDK.
|
| 31 |
+
See [doc](https://hf.co/docs/hub/spaces) for more info on supported versions.
|
| 32 |
+
|
| 33 |
+
`app_file`: _string_
|
| 34 |
+
Path to your main application file (which contains either `gradio` or `streamlit` Python code, or `static` html code).
|
| 35 |
+
Path is relative to the root of the repository.
|
| 36 |
+
|
| 37 |
+
`pinned`: _boolean_
|
| 38 |
+
Whether the Space stays on top of your list.
|
available_models.py
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
π£οΈ Translator - Translate text from one language to another.
|
| 3 |
+
|
| 4 |
+
MODELS list all available models.
|
| 5 |
+
|
| 6 |
+
Author:
|
| 7 |
+
- @ChainYo
|
| 8 |
+
"""
|
| 9 |
+
|
| 10 |
+
MODELS = {
|
| 11 |
+
"πΊπΈ English->πΊπΈ English": [0,],
|
| 12 |
+
"πΊπΈ English->π«π· French": ["Helsinki-NLP/opus-mt-en-fr", "https://huggingface.co/Helsinki-NLP/opus-mt-en-fr"],
|
| 13 |
+
"πΊπΈ English->π©πͺ German": ["Helsinki-NLP/opus-mt-en-de", "https://huggingface.co/Helsinki-NLP/opus-mt-en-de"],
|
| 14 |
+
"πΊπΈ English->πͺπΈ Spanish": ["Helsinki-NLP/opus-mt-en-es", "https://huggingface.co/Helsinki-NLP/opus-mt-en-es"],
|
| 15 |
+
"πΊπΈ English->π·πΊ Russian": ["Helsinki-NLP/opus-mt-en-ru", "https://huggingface.co/Helsinki-NLP/opus-mt-en-ru"],
|
| 16 |
+
"πΊπΈ English->π¨π³ Chinese": ["Helsinki-NLP/opus-mt-en-zh", "https://huggingface.co/Helsinki-NLP/opus-mt-en-zh"],
|
| 17 |
+
"π«π· French->π«π· French": [0, None],
|
| 18 |
+
"π«π· French->πΊπΈ English": ["Helsinki-NLP/opus-mt-fr-en", "https://huggingface.co/Helsinki-NLP/opus-mt-fr-en"],
|
| 19 |
+
"π«π· French->π©πͺ German": ["Helsinki-NLP/opus-mt-fr-de", "https://huggingface.co/Helsinki-NLP/opus-mt-fr-de"],
|
| 20 |
+
"π«π· French->πͺπΈ Spanish": ["Helsinki-NLP/opus-mt-fr-es", "https://huggingface.co/Helsinki-NLP/opus-mt-fr-es"],
|
| 21 |
+
"π«π· French->π·πΊ Russian": ["Helsinki-NLP/opus-mt-fr-ru", "https://huggingface.co/Helsinki-NLP/opus-mt-fr-ru"],
|
| 22 |
+
"π«π· French->π¨π³ Chinese": [None, None],
|
| 23 |
+
"πͺπΈ Spanish->πͺπΈ Spanish": [0, None],
|
| 24 |
+
"πͺπΈ Spanish->πΊπΈ English": ["Helsinki-NLP/opus-mt-es-en", "https://huggingface.co/Helsinki-NLP/opus-mt-es-en"],
|
| 25 |
+
"πͺπΈ Spanish->π©πͺ German": ["Helsinki-NLP/opus-mt-es-de", "https://huggingface.co/Helsinki-NLP/opus-mt-es-de"],
|
| 26 |
+
"πͺπΈ Spanish->π«π· French": ["Helsinki-NLP/opus-mt-es-fr", "https://huggingface.co/Helsinki-NLP/opus-mt-es-fr"],
|
| 27 |
+
"πͺπΈ Spanish->π·πΊ Russian": ["Helsinki-NLP/opus-mt-es-ru", "https://huggingface.co/Helsinki-NLP/opus-mt-es-ru"],
|
| 28 |
+
"πͺπΈ Spanish->π¨π³ Chinese": ["Helsinki-NLP/opus-tatoeba-es-zh", "https://huggingface.co/Helsinki-NLP/opus-tatoeba-es-zh"],
|
| 29 |
+
"π©πͺ German->π©πͺ German": [0, None],
|
| 30 |
+
"π©πͺ German->πΊπΈ English": ["Helsinki-NLP/opus-mt-de-en", "https://huggingface.co/Helsinki-NLP/opus-mt-de-en"],
|
| 31 |
+
"π©πͺ German->πͺπΈ Spanish": ["Helsinki-NLP/opus-mt-de-es", "https://huggingface.co/Helsinki-NLP/opus-mt-de-es"],
|
| 32 |
+
"π©πͺ German->π«π· French": ["Helsinki-NLP/opus-mt-de-fr", "https://huggingface.co/Helsinki-NLP/opus-mt-de-fr"],
|
| 33 |
+
"π©πͺ German->π·πΊ Russian": [None, None],
|
| 34 |
+
"π©πͺ German->π¨π³ Chinese": ["Helsinki-NLP/opus-mt-de-ZH", "https://huggingface.co/Helsinki-NLP/opus-mt-de-ZH"],
|
| 35 |
+
"π·πΊ Russian->π·πΊ Russian": [0, None],
|
| 36 |
+
"π·πΊ Russian->πΊπΈ English": ["Helsinki-NLP/opus-mt-ru-en", "https://huggingface.co/Helsinki-NLP/opus-mt-ru-en"],
|
| 37 |
+
"π·πΊ Russian->πͺπΈ Spanish": ["Helsinki-NLP/opus-mt-ru-es", "https://huggingface.co/Helsinki-NLP/opus-mt-ru-es"],
|
| 38 |
+
"π·πΊ Russian->π«π· French": ["Helsinki-NLP/opus-mt-ru-fr", "https://huggingface.co/Helsinki-NLP/opus-mt-ru-fr"],
|
| 39 |
+
"π·πΊ Russian->π©πͺ German": [None, None],
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
"π¨π³ Chinese->πΊπΈ English": ["Helsinki-NLP/opus-mt-zh-en", "https://huggingface.co/Helsinki-NLP/opus-mt-zh-en"],
|
| 44 |
+
"π¨π³ Chinese->πͺπΈ Spanish": [None, None],
|
| 45 |
+
"π¨π³ Chinese->π«π· French": [None, None],
|
| 46 |
+
"π¨π³ Chinese->π¨π³ Chinese": [0, None],
|
| 47 |
+
"π¨π³ Chinese->π©πͺ German": [None, None],
|
| 48 |
+
}
|
main.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
π£οΈ Translator - Translate text from one language to another.
|
| 3 |
+
|
| 4 |
+
Application file made with Streamlit.
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
import re
|
| 8 |
+
import streamlit as st
|
| 9 |
+
|
| 10 |
+
from datetime import datetime
|
| 11 |
+
from transformers import pipeline
|
| 12 |
+
from available_models import MODELS
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
st.set_page_config(page_title="Translate", page_icon="π£οΈ")
|
| 16 |
+
st.title("Translate", "main")
|
| 17 |
+
st.subheader("Using cutting-edge AI/ML technology to translate text for you.")
|
| 18 |
+
st.markdown("""
|
| 19 |
+
Welcome to Translate. Here, we harness the power of cutting-edge Artificial Intelligence and Machine Learning to translate text for _you_.
|
| 20 |
+
|
| 21 |
+
Translate is a free tool to translate quickly and easily! Start today by typing your text into the form below and selecting a language pair!
|
| 22 |
+
""")
|
| 23 |
+
hide_streamlit_style = """
|
| 24 |
+
<style>
|
| 25 |
+
#MainMenu {visibility: hidden;}
|
| 26 |
+
footer {visibility: hidden;}
|
| 27 |
+
</style>
|
| 28 |
+
"""
|
| 29 |
+
st.markdown(hide_streamlit_style, unsafe_allow_html=True)
|
| 30 |
+
lang1, lang2 = st.columns(2)
|
| 31 |
+
lang1.selectbox(
|
| 32 |
+
"Source Language", ["πΊπΈ English", "π«π· French", "π©πͺ German", "πͺπΈ Spanish", "π¨π³ Chinese"],
|
| 33 |
+
key="input_lang", index=0,
|
| 34 |
+
)
|
| 35 |
+
lang2.selectbox(
|
| 36 |
+
"Target Language", ["πΊπΈ English", "π«π· French", "π©πͺ German", "πͺπΈ Spanish", "π¨π³ Chinese"],
|
| 37 |
+
key="output_lang", index=3,
|
| 38 |
+
)
|
| 39 |
+
|
| 40 |
+
selected_model = MODELS[f"{st.session_state['input_lang']}->{st.session_state['output_lang']}"]
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
if selected_model[0] == None:
|
| 44 |
+
st.write("Sorry, we can't translate this language pair! Please try a different one!")
|
| 45 |
+
elif selected_model[0] == 0:
|
| 46 |
+
st.write("Haha! We know what you're trying to do and you can't do it! You're not allowed to translate languages from one language to the same one!")
|
| 47 |
+
else:
|
| 48 |
+
input_text = st.text_area("Enter text to translate:", height=200, key="input")
|
| 49 |
+
translate_text = st.button("Translate")
|
| 50 |
+
|
| 51 |
+
if translate_text:
|
| 52 |
+
with st.spinner(text="Just a sec, it takes a minute to load up the AI/ML!"):
|
| 53 |
+
task = pipeline(
|
| 54 |
+
"translation",
|
| 55 |
+
model=selected_model[0],
|
| 56 |
+
tokenizer=selected_model[0],
|
| 57 |
+
)
|
| 58 |
+
|
| 59 |
+
progress_bar = st.progress(0)
|
| 60 |
+
with st.spinner(text="Just a little bit more time! We wish it was easy, but AI takes some time!"):
|
| 61 |
+
text_to_translate = re.split('(?<=[.!?]) +', input_text)
|
| 62 |
+
total_progress = len(text_to_translate)
|
| 63 |
+
|
| 64 |
+
for i, text in enumerate(text_to_translate):
|
| 65 |
+
translation = task(text)
|
| 66 |
+
text_to_translate[i] = translation[0]["translation_text"]
|
| 67 |
+
progress_bar.progress((i + 1) / total_progress)
|
| 68 |
+
|
| 69 |
+
st.success("Yay! It's done! Check out your translation below!")
|
| 70 |
+
st.write("**Here's your translation:**")
|
| 71 |
+
st.code(' '.join(text_to_translate))
|
requirements.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
streamlit==1.3.1
|
| 2 |
+
transformers==4.15.0
|
| 3 |
+
torch==1.10.1
|
| 4 |
+
torchaudio==0.10.1
|
| 5 |
+
torchvision==0.11.2
|
| 6 |
+
sentencepiece==0.1.96
|