Plana-Archive commited on
Commit
383c60f
·
verified ·
1 Parent(s): ada48da

Upload folder using huggingface_hub

Browse files
Files changed (36) hide show
  1. .gitattributes +10 -0
  2. lyric-generator-ja/.gitattributes +33 -0
  3. lyric-generator-ja/.gitignore +116 -0
  4. lyric-generator-ja/README.md +13 -0
  5. lyric-generator-ja/app.py +111 -0
  6. lyric-generator-ja/frontend/README.md +2 -0
  7. lyric-generator-ja/frontend/babel.config.js +5 -0
  8. lyric-generator-ja/frontend/dist/css/chunk-vendors.db3e6b3f.css +0 -0
  9. lyric-generator-ja/frontend/dist/favicon.ico +0 -0
  10. lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.eot +3 -0
  11. lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.ttf +3 -0
  12. lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.woff +3 -0
  13. lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.woff2 +3 -0
  14. lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont_ie.eot +3 -0
  15. lyric-generator-ja/frontend/dist/font/materialdesignicons.min.css +0 -0
  16. lyric-generator-ja/frontend/dist/font/roboto.css +336 -0
  17. lyric-generator-ja/frontend/dist/index.html +1 -0
  18. lyric-generator-ja/frontend/dist/js/app.413041e4.js +1 -0
  19. lyric-generator-ja/frontend/dist/js/chunk-vendors.f5ab6a81.js +0 -0
  20. lyric-generator-ja/frontend/package.json +51 -0
  21. lyric-generator-ja/frontend/public/favicon.ico +0 -0
  22. lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.eot +3 -0
  23. lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.ttf +3 -0
  24. lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.woff +3 -0
  25. lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.woff2 +3 -0
  26. lyric-generator-ja/frontend/public/font/materialdesignicons-webfont_ie.eot +3 -0
  27. lyric-generator-ja/frontend/public/font/materialdesignicons.min.css +0 -0
  28. lyric-generator-ja/frontend/public/font/roboto.css +336 -0
  29. lyric-generator-ja/frontend/public/index.html +20 -0
  30. lyric-generator-ja/frontend/src/App.vue +355 -0
  31. lyric-generator-ja/frontend/src/main.js +12 -0
  32. lyric-generator-ja/frontend/src/plugins/vuetify.js +7 -0
  33. lyric-generator-ja/frontend/src/router/index.js +18 -0
  34. lyric-generator-ja/frontend/vue.config.js +7 -0
  35. lyric-generator-ja/frontend/yarn.lock +0 -0
  36. lyric-generator-ja/requirements.txt +6 -0
.gitattributes CHANGED
@@ -50,3 +50,13 @@ moe-tts/saved_model/20/cover.jpeg filter=lfs diff=lfs merge=lfs -text
50
  moe-tts/saved_model/4/cover.jpg filter=lfs diff=lfs merge=lfs -text
51
  moe-tts/saved_model/6/cover.jpg filter=lfs diff=lfs merge=lfs -text
52
  anime-remove-background/examples/03.jpg filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
50
  moe-tts/saved_model/4/cover.jpg filter=lfs diff=lfs merge=lfs -text
51
  moe-tts/saved_model/6/cover.jpg filter=lfs diff=lfs merge=lfs -text
52
  anime-remove-background/examples/03.jpg filter=lfs diff=lfs merge=lfs -text
53
+ lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.eot filter=lfs diff=lfs merge=lfs -text
54
+ lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.ttf filter=lfs diff=lfs merge=lfs -text
55
+ lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.woff filter=lfs diff=lfs merge=lfs -text
56
+ lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.woff2 filter=lfs diff=lfs merge=lfs -text
57
+ lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont_ie.eot filter=lfs diff=lfs merge=lfs -text
58
+ lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.eot filter=lfs diff=lfs merge=lfs -text
59
+ lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.ttf filter=lfs diff=lfs merge=lfs -text
60
+ lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.woff filter=lfs diff=lfs merge=lfs -text
61
+ lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.woff2 filter=lfs diff=lfs merge=lfs -text
62
+ lyric-generator-ja/frontend/public/font/materialdesignicons-webfont_ie.eot filter=lfs diff=lfs merge=lfs -text
lyric-generator-ja/.gitattributes ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ *.onnx filter=lfs diff=lfs merge=lfs -text
13
+ *.ot filter=lfs diff=lfs merge=lfs -text
14
+ *.parquet filter=lfs diff=lfs merge=lfs -text
15
+ *.pb filter=lfs diff=lfs merge=lfs -text
16
+ *.pt filter=lfs diff=lfs merge=lfs -text
17
+ *.pth filter=lfs diff=lfs merge=lfs -text
18
+ *.rar filter=lfs diff=lfs merge=lfs -text
19
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
20
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
21
+ *.tflite filter=lfs diff=lfs merge=lfs -text
22
+ *.tgz filter=lfs diff=lfs merge=lfs -text
23
+ *.wasm filter=lfs diff=lfs merge=lfs -text
24
+ *.xz filter=lfs diff=lfs merge=lfs -text
25
+ *.zip filter=lfs diff=lfs merge=lfs -text
26
+ *.zstandard filter=lfs diff=lfs merge=lfs -text
27
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
28
+ datgz filter=lfs diff=lfs merge=lfs -text
29
+ eot filter=lfs diff=lfs merge=lfs -text
30
+ ttf filter=lfs diff=lfs merge=lfs -text
31
+ *.ttf filter=lfs diff=lfs merge=lfs -text
32
+ *.datgz filter=lfs diff=lfs merge=lfs -text
33
+ *.eot filter=lfs diff=lfs merge=lfs -text
lyric-generator-ja/.gitignore ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ downloads/
14
+ eggs/
15
+ .eggs/
16
+ lib/
17
+ lib64/
18
+ parts/
19
+ sdist/
20
+ var/
21
+ wheels/
22
+ *.egg-info/
23
+ .installed.cfg
24
+ *.egg
25
+ MANIFEST
26
+
27
+ # PyInstaller
28
+ # Usually these files are written by a python script from a template
29
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
30
+ *.manifest
31
+ *.spec
32
+
33
+ # Installer logs
34
+ pip-log.txt
35
+ pip-delete-this-directory.txt
36
+
37
+ # Unit test / coverage reports
38
+ htmlcov/
39
+ .tox/
40
+ .nox/
41
+ .coverage
42
+ .coverage.*
43
+ .cache
44
+ nosetests.xml
45
+ coverage.xml
46
+ *.cover
47
+ .hypothesis/
48
+ .pytest_cache/
49
+
50
+ # Translations
51
+ *.mo
52
+ *.pot
53
+
54
+ # Django stuff:
55
+ *.log
56
+ local_settings.py
57
+ db.sqlite3
58
+
59
+ # Flask stuff:
60
+ instance/
61
+ .webassets-cache
62
+
63
+ # Scrapy stuff:
64
+ .scrapy
65
+
66
+ # Sphinx documentation
67
+ docs/_build/
68
+
69
+ # PyBuilder
70
+ target/
71
+
72
+ # Jupyter Notebook
73
+ .ipynb_checkpoints
74
+
75
+ # IPython
76
+ profile_default/
77
+ ipython_config.py
78
+
79
+ # pyenv
80
+ .python-version
81
+
82
+ # celery beat schedule file
83
+ celerybeat-schedule
84
+
85
+ # SageMath parsed files
86
+ *.sage.py
87
+
88
+ # Environments
89
+ .env
90
+ .venv
91
+ env/
92
+ venv/
93
+ ENV/
94
+ env.bak/
95
+ venv.bak/
96
+
97
+ # Spyder project settings
98
+ .spyderproject
99
+ .spyproject
100
+
101
+ # Rope project settings
102
+ .ropeproject
103
+
104
+ # mkdocs documentation
105
+ /site
106
+
107
+ # mypy
108
+ .mypy_cache/
109
+ .dmypy.json
110
+ dmypy.json
111
+
112
+ # Pyre type checker
113
+ .pyre/
114
+
115
+ .idea/
116
+ node_modules/
lyric-generator-ja/README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Japanese Lyric Generator
3
+ emoji: 🎼
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: gradio
7
+ sdk_version: 4.36.0
8
+ app_file: app.py
9
+ pinned: false
10
+ license: apache-2.0
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
lyric-generator-ja/app.py ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from transformers import T5Tokenizer, GPT2LMHeadModel
3
+ from flask import Flask, request, jsonify
4
+ import cutlet
5
+
6
+ convertors = {}
7
+ for romaji_sys in ["hepburn", "kunrei", "nippon"]:
8
+ convertors[romaji_sys] = cutlet.Cutlet(romaji_sys)
9
+
10
+ device = torch.device("cpu")
11
+ if torch.cuda.is_available():
12
+ device = torch.device("cuda")
13
+
14
+ tokenizer = T5Tokenizer.from_pretrained("skytnt/gpt2-japanese-lyric-medium")
15
+ model = GPT2LMHeadModel.from_pretrained("skytnt/gpt2-japanese-lyric-medium")
16
+ model = model.to(device)
17
+
18
+
19
+ def gen_lyric(title: str, prompt_text: str):
20
+ if len(title) != 0 or len(prompt_text) != 0:
21
+ prompt_text = "<s>" + title + "[CLS]" + prompt_text
22
+ prompt_text = prompt_text.replace("\n", "\\n ")
23
+ prompt_tokens = tokenizer.tokenize(prompt_text)
24
+ prompt_token_ids = tokenizer.convert_tokens_to_ids(prompt_tokens)
25
+ prompt_tensor = torch.LongTensor(prompt_token_ids)
26
+ prompt_tensor = prompt_tensor.view(1, -1).to(device)
27
+ else:
28
+ prompt_tensor = None
29
+ # model forward
30
+ output_sequences = model.generate(
31
+ input_ids=prompt_tensor,
32
+ max_length=512,
33
+ top_p=0.95,
34
+ top_k=40,
35
+ temperature=1.0,
36
+ do_sample=True,
37
+ early_stopping=True,
38
+ bos_token_id=tokenizer.bos_token_id,
39
+ eos_token_id=tokenizer.eos_token_id,
40
+ pad_token_id=tokenizer.pad_token_id,
41
+ num_return_sequences=1
42
+ )
43
+
44
+ # convert model outputs to readable sentence
45
+ generated_sequence = output_sequences.tolist()[0]
46
+ generated_tokens = tokenizer.convert_ids_to_tokens(generated_sequence)
47
+ generated_text = tokenizer.convert_tokens_to_string(generated_tokens)
48
+ generated_text = "\n".join([s.strip() for s in generated_text.split('\\n')]).replace(' ', '\u3000').replace('<s>',
49
+ '').replace(
50
+ '</s>', '\n\n---end---')
51
+ title_and_lyric = generated_text.split("[CLS]", 1)
52
+ if len(title_and_lyric) == 1:
53
+ title, lyric = "", title_and_lyric[0].strip()
54
+ else:
55
+ title, lyric = title_and_lyric[0].strip(), title_and_lyric[1].strip()
56
+ return title, lyric
57
+
58
+
59
+ app = Flask(__name__, static_url_path="", static_folder="frontend/dist")
60
+
61
+ @app.route('/')
62
+ def index_page():
63
+ return app.send_static_file("index.html")
64
+
65
+
66
+ @app.route('/gen', methods=["POST"])
67
+ def generate():
68
+ if request.method == "POST":
69
+ try:
70
+ data = request.get_json()
71
+ title = data['title']
72
+ text = data['text']
73
+ title, lyric = gen_lyric(title, text)
74
+ result = {
75
+ "state": 200,
76
+ "title": title,
77
+ "lyric": lyric
78
+ }
79
+ except Exception as e:
80
+ result = {
81
+ "state": 400,
82
+ "msg": f"{e}"
83
+ }
84
+ return jsonify(result), result["state"]
85
+
86
+
87
+ @app.route('/romaji', methods=["POST"])
88
+ def romaji():
89
+ if request.method == "POST":
90
+ try:
91
+ data = request.get_json()
92
+ text = data['text']
93
+ system = data['system']
94
+ lines = []
95
+ # 不支持带换行符的直接转换
96
+ for line in text.split("\n"):
97
+ lines.append(convertors[system].romaji(line))
98
+ result = {
99
+ "state": 200,
100
+ "romaji": "\n".join(lines),
101
+ }
102
+ except Exception as e:
103
+ result = {
104
+ "state": 400,
105
+ "msg": f"{e}"
106
+ }
107
+ return jsonify(result), result["state"]
108
+
109
+
110
+ if __name__ == '__main__':
111
+ app.run(host="0.0.0.0", port=7860, debug=False, use_reloader=False)
lyric-generator-ja/frontend/README.md ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # lyric-generator
2
+ 歌词生成器网站
lyric-generator-ja/frontend/babel.config.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ module.exports = {
2
+ presets: [
3
+ '@vue/cli-plugin-babel/preset'
4
+ ]
5
+ }
lyric-generator-ja/frontend/dist/css/chunk-vendors.db3e6b3f.css ADDED
The diff for this file is too large to render. See raw diff
 
lyric-generator-ja/frontend/dist/favicon.ico ADDED
lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.eot ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:55c35c20bedf831352d92854c2c41863b5736eecb1bcec91c965713388d0c14b
3
+ size 1187136
lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.ttf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5e9b23f9dacd79641485a9a3e9d07035b8b22f13e8a15b25544ca9debf618f0f
3
+ size 1186916
lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.woff ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d87b64d83211b941a1e104b2a245b31cc96a9454532335dc8d637a41efcae505
3
+ size 538776
lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont.woff2 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:12845dec7187730a27e1fd1e6ef53d92602730f83483af55895beeb9667c9333
3
+ size 372752
lyric-generator-ja/frontend/dist/font/materialdesignicons-webfont_ie.eot ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:55c35c20bedf831352d92854c2c41863b5736eecb1bcec91c965713388d0c14b
3
+ size 1187136
lyric-generator-ja/frontend/dist/font/materialdesignicons.min.css ADDED
The diff for this file is too large to render. See raw diff
 
lyric-generator-ja/frontend/dist/font/roboto.css ADDED
@@ -0,0 +1,336 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* cyrillic-ext */
2
+ @font-face {
3
+ font-family: 'Roboto';
4
+ font-style: normal;
5
+ font-weight: 100;
6
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxFIzIFKw.woff2) format('woff2');
7
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
8
+ }
9
+ /* cyrillic */
10
+ @font-face {
11
+ font-family: 'Roboto';
12
+ font-style: normal;
13
+ font-weight: 100;
14
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxMIzIFKw.woff2) format('woff2');
15
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
16
+ }
17
+ /* greek-ext */
18
+ @font-face {
19
+ font-family: 'Roboto';
20
+ font-style: normal;
21
+ font-weight: 100;
22
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxEIzIFKw.woff2) format('woff2');
23
+ unicode-range: U+1F00-1FFF;
24
+ }
25
+ /* greek */
26
+ @font-face {
27
+ font-family: 'Roboto';
28
+ font-style: normal;
29
+ font-weight: 100;
30
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxLIzIFKw.woff2) format('woff2');
31
+ unicode-range: U+0370-03FF;
32
+ }
33
+ /* vietnamese */
34
+ @font-face {
35
+ font-family: 'Roboto';
36
+ font-style: normal;
37
+ font-weight: 100;
38
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxHIzIFKw.woff2) format('woff2');
39
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
40
+ }
41
+ /* latin-ext */
42
+ @font-face {
43
+ font-family: 'Roboto';
44
+ font-style: normal;
45
+ font-weight: 100;
46
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxGIzIFKw.woff2) format('woff2');
47
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
48
+ }
49
+ /* latin */
50
+ @font-face {
51
+ font-family: 'Roboto';
52
+ font-style: normal;
53
+ font-weight: 100;
54
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxIIzI.woff2) format('woff2');
55
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
56
+ }
57
+ /* cyrillic-ext */
58
+ @font-face {
59
+ font-family: 'Roboto';
60
+ font-style: normal;
61
+ font-weight: 300;
62
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2) format('woff2');
63
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
64
+ }
65
+ /* cyrillic */
66
+ @font-face {
67
+ font-family: 'Roboto';
68
+ font-style: normal;
69
+ font-weight: 300;
70
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2) format('woff2');
71
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
72
+ }
73
+ /* greek-ext */
74
+ @font-face {
75
+ font-family: 'Roboto';
76
+ font-style: normal;
77
+ font-weight: 300;
78
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2) format('woff2');
79
+ unicode-range: U+1F00-1FFF;
80
+ }
81
+ /* greek */
82
+ @font-face {
83
+ font-family: 'Roboto';
84
+ font-style: normal;
85
+ font-weight: 300;
86
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2) format('woff2');
87
+ unicode-range: U+0370-03FF;
88
+ }
89
+ /* vietnamese */
90
+ @font-face {
91
+ font-family: 'Roboto';
92
+ font-style: normal;
93
+ font-weight: 300;
94
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2) format('woff2');
95
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
96
+ }
97
+ /* latin-ext */
98
+ @font-face {
99
+ font-family: 'Roboto';
100
+ font-style: normal;
101
+ font-weight: 300;
102
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2');
103
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
104
+ }
105
+ /* latin */
106
+ @font-face {
107
+ font-family: 'Roboto';
108
+ font-style: normal;
109
+ font-weight: 300;
110
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2');
111
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
112
+ }
113
+ /* cyrillic-ext */
114
+ @font-face {
115
+ font-family: 'Roboto';
116
+ font-style: normal;
117
+ font-weight: 400;
118
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2');
119
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
120
+ }
121
+ /* cyrillic */
122
+ @font-face {
123
+ font-family: 'Roboto';
124
+ font-style: normal;
125
+ font-weight: 400;
126
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2');
127
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
128
+ }
129
+ /* greek-ext */
130
+ @font-face {
131
+ font-family: 'Roboto';
132
+ font-style: normal;
133
+ font-weight: 400;
134
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2');
135
+ unicode-range: U+1F00-1FFF;
136
+ }
137
+ /* greek */
138
+ @font-face {
139
+ font-family: 'Roboto';
140
+ font-style: normal;
141
+ font-weight: 400;
142
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2');
143
+ unicode-range: U+0370-03FF;
144
+ }
145
+ /* vietnamese */
146
+ @font-face {
147
+ font-family: 'Roboto';
148
+ font-style: normal;
149
+ font-weight: 400;
150
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2');
151
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
152
+ }
153
+ /* latin-ext */
154
+ @font-face {
155
+ font-family: 'Roboto';
156
+ font-style: normal;
157
+ font-weight: 400;
158
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2');
159
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
160
+ }
161
+ /* latin */
162
+ @font-face {
163
+ font-family: 'Roboto';
164
+ font-style: normal;
165
+ font-weight: 400;
166
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2');
167
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
168
+ }
169
+ /* cyrillic-ext */
170
+ @font-face {
171
+ font-family: 'Roboto';
172
+ font-style: normal;
173
+ font-weight: 500;
174
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2) format('woff2');
175
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
176
+ }
177
+ /* cyrillic */
178
+ @font-face {
179
+ font-family: 'Roboto';
180
+ font-style: normal;
181
+ font-weight: 500;
182
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2) format('woff2');
183
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
184
+ }
185
+ /* greek-ext */
186
+ @font-face {
187
+ font-family: 'Roboto';
188
+ font-style: normal;
189
+ font-weight: 500;
190
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2) format('woff2');
191
+ unicode-range: U+1F00-1FFF;
192
+ }
193
+ /* greek */
194
+ @font-face {
195
+ font-family: 'Roboto';
196
+ font-style: normal;
197
+ font-weight: 500;
198
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2) format('woff2');
199
+ unicode-range: U+0370-03FF;
200
+ }
201
+ /* vietnamese */
202
+ @font-face {
203
+ font-family: 'Roboto';
204
+ font-style: normal;
205
+ font-weight: 500;
206
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2) format('woff2');
207
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
208
+ }
209
+ /* latin-ext */
210
+ @font-face {
211
+ font-family: 'Roboto';
212
+ font-style: normal;
213
+ font-weight: 500;
214
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2) format('woff2');
215
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
216
+ }
217
+ /* latin */
218
+ @font-face {
219
+ font-family: 'Roboto';
220
+ font-style: normal;
221
+ font-weight: 500;
222
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fBBc4.woff2) format('woff2');
223
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
224
+ }
225
+ /* cyrillic-ext */
226
+ @font-face {
227
+ font-family: 'Roboto';
228
+ font-style: normal;
229
+ font-weight: 700;
230
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2) format('woff2');
231
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
232
+ }
233
+ /* cyrillic */
234
+ @font-face {
235
+ font-family: 'Roboto';
236
+ font-style: normal;
237
+ font-weight: 700;
238
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2) format('woff2');
239
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
240
+ }
241
+ /* greek-ext */
242
+ @font-face {
243
+ font-family: 'Roboto';
244
+ font-style: normal;
245
+ font-weight: 700;
246
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2) format('woff2');
247
+ unicode-range: U+1F00-1FFF;
248
+ }
249
+ /* greek */
250
+ @font-face {
251
+ font-family: 'Roboto';
252
+ font-style: normal;
253
+ font-weight: 700;
254
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2) format('woff2');
255
+ unicode-range: U+0370-03FF;
256
+ }
257
+ /* vietnamese */
258
+ @font-face {
259
+ font-family: 'Roboto';
260
+ font-style: normal;
261
+ font-weight: 700;
262
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2) format('woff2');
263
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
264
+ }
265
+ /* latin-ext */
266
+ @font-face {
267
+ font-family: 'Roboto';
268
+ font-style: normal;
269
+ font-weight: 700;
270
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2) format('woff2');
271
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
272
+ }
273
+ /* latin */
274
+ @font-face {
275
+ font-family: 'Roboto';
276
+ font-style: normal;
277
+ font-weight: 700;
278
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format('woff2');
279
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
280
+ }
281
+ /* cyrillic-ext */
282
+ @font-face {
283
+ font-family: 'Roboto';
284
+ font-style: normal;
285
+ font-weight: 900;
286
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfCRc4EsA.woff2) format('woff2');
287
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
288
+ }
289
+ /* cyrillic */
290
+ @font-face {
291
+ font-family: 'Roboto';
292
+ font-style: normal;
293
+ font-weight: 900;
294
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfABc4EsA.woff2) format('woff2');
295
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
296
+ }
297
+ /* greek-ext */
298
+ @font-face {
299
+ font-family: 'Roboto';
300
+ font-style: normal;
301
+ font-weight: 900;
302
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfCBc4EsA.woff2) format('woff2');
303
+ unicode-range: U+1F00-1FFF;
304
+ }
305
+ /* greek */
306
+ @font-face {
307
+ font-family: 'Roboto';
308
+ font-style: normal;
309
+ font-weight: 900;
310
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfBxc4EsA.woff2) format('woff2');
311
+ unicode-range: U+0370-03FF;
312
+ }
313
+ /* vietnamese */
314
+ @font-face {
315
+ font-family: 'Roboto';
316
+ font-style: normal;
317
+ font-weight: 900;
318
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfCxc4EsA.woff2) format('woff2');
319
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
320
+ }
321
+ /* latin-ext */
322
+ @font-face {
323
+ font-family: 'Roboto';
324
+ font-style: normal;
325
+ font-weight: 900;
326
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfChc4EsA.woff2) format('woff2');
327
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
328
+ }
329
+ /* latin */
330
+ @font-face {
331
+ font-family: 'Roboto';
332
+ font-style: normal;
333
+ font-weight: 900;
334
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfBBc4.woff2) format('woff2');
335
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
336
+ }
lyric-generator-ja/frontend/dist/index.html ADDED
@@ -0,0 +1 @@
 
 
1
+ <!DOCTYPE html><html lang="en" style="overflow-y: auto"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>日语歌词生成器</title><link rel="stylesheet" href="font/roboto.css"><link rel="stylesheet" href="font/materialdesignicons.min.css"><script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.1/iframeResizer.contentWindow.min.js" integrity="sha512-qw2bX9KUhi7HLuUloyRsvxRlWJvj0u0JWVegc5tf7qsw47T0pwXZIk1Kyc0utTH3NlrpHtLa4HYTVUyHBr9Ufg==" crossorigin="anonymous"></script><link href="css/chunk-vendors.db3e6b3f.css" rel="preload" as="style"><link href="js/app.413041e4.js" rel="preload" as="script"><link href="js/chunk-vendors.f5ab6a81.js" rel="preload" as="script"><link href="css/chunk-vendors.db3e6b3f.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but lyric-generator doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.f5ab6a81.js"></script><script src="js/app.413041e4.js"></script></body></html>
lyric-generator-ja/frontend/dist/js/app.413041e4.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (function(t){function e(e){for(var r,o,i=e[0],l=e[1],c=e[2],p=0,_=[];p<i.length;p++)o=i[p],Object.prototype.hasOwnProperty.call(n,o)&&n[o]&&_.push(n[o][0]),n[o]=0;for(r in l)Object.prototype.hasOwnProperty.call(l,r)&&(t[r]=l[r]);u&&u(e);while(_.length)_.shift()();return s.push.apply(s,c||[]),a()}function a(){for(var t,e=0;e<s.length;e++){for(var a=s[e],r=!0,i=1;i<a.length;i++){var l=a[i];0!==n[l]&&(r=!1)}r&&(s.splice(e--,1),t=o(o.s=a[0]))}return t}var r={},n={app:0},s=[];function o(e){if(r[e])return r[e].exports;var a=r[e]={i:e,l:!1,exports:{}};return t[e].call(a.exports,a,a.exports,o),a.l=!0,a.exports}o.m=t,o.c=r,o.d=function(t,e,a){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},o.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(o.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)o.d(a,r,function(e){return t[e]}.bind(null,r));return a},o.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="";var i=window["webpackJsonp"]=window["webpackJsonp"]||[],l=i.push.bind(i);i.push=e,i=i.slice();for(var c=0;c<i.length;c++)e(i[c]);var u=l;s.push([0,"chunk-vendors"]),a()})({0:function(t,e,a){t.exports=a("56d7")},"56d7":function(t,e,a){"use strict";a.r(e);a("e260"),a("e6cf"),a("cca6"),a("a79d");var r=a("2b0e"),n=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("v-app",[a("v-app-bar",{attrs:{app:"",dark:"",color:"primary"}},[a("v-toolbar-title",[t._v(t._s(t.i18n.title))]),a("v-spacer"),a("v-select",{staticStyle:{"max-width":"10rem"},attrs:{items:["English","Chinese"],"prepend-icon":"mdi-web","hide-details":""},on:{change:function(e){return t.set_locale(t.locale_name)}},model:{value:t.locale_name,callback:function(e){t.locale_name=e},expression:"locale_name"}})],1),a("v-main",[a("v-row",{staticClass:"mx-3"},[a("div",{staticClass:"col-12 offset-0 col-sm-8 offset-sm-2 col-md-8 offset-md-2 col-lg-6 offset-lg-3 col-xl-6 offset-xl-3 mt-8"},[a("v-textarea",{attrs:{label:t.i18n.input_title_label,disabled:t.loading,rows:"1","prepend-icon":"mdi-comment",hint:t.i18n.input_title_hint,"no-resize":""},model:{value:t.prompt_title,callback:function(e){t.prompt_title=e},expression:"prompt_title"}}),a("v-textarea",{attrs:{label:t.i18n.input_text_label,disabled:t.loading,rows:"2","prepend-icon":"mdi-comment",hint:t.i18n.input_text_hint,"no-resize":""},model:{value:t.prompt_text,callback:function(e){t.prompt_text=e},expression:"prompt_text"}}),a("v-row",[a("v-checkbox",{staticClass:"col-6",attrs:{disabled:t.loading,label:t.i18n.show_romaji},on:{change:function(e){t.show_type=t.show_romaji?0:1}},model:{value:t.show_romaji,callback:function(e){t.show_romaji=e},expression:"show_romaji"}}),a("v-scroll-x-transition",[t.show_romaji?a("v-select",{staticClass:"col-6",attrs:{disabled:t.loading,items:t.romaji_systems,hint:t.i18n.romaji_system},model:{value:t.romaji_system,callback:function(e){t.romaji_system=e},expression:"romaji_system"}}):t._e()],1)],1),a("v-row",{staticClass:"mt-n8"},[a("v-checkbox",{staticClass:"col-6",attrs:{disabled:t.loading,label:t.i18n.use_translate},on:{change:function(e){t.show_type=t.use_trans?1:0}},model:{value:t.use_trans,callback:function(e){t.use_trans=e},expression:"use_trans"}}),a("v-scroll-x-transition",[t.use_trans?a("v-select",{staticClass:"col-6",attrs:{disabled:t.loading,items:t.google_supported_languages,hint:t.i18n.target_lang},model:{value:t.trans_target_lang,callback:function(e){t.trans_target_lang=e},expression:"trans_target_lang"}}):t._e()],1)],1),a("v-btn",{staticClass:"mb-10",attrs:{color:"primary",elevation:"5",loading:t.loading,text:"",block:"",large:"",tile:""},on:{click:function(e){return t.do_gen()}}},[t._v(t._s(t.i18n.generate))]),a("v-expand-transition",[0!==t.lyric.length?a("v-simple-table",{staticClass:"py-5",attrs:{dense:""},scopedSlots:t._u([{key:"default",fn:function(){return[a("thead",[a("tr",[a("th",[t._v(t._s(t.i18n.lyric)),a("v-btn",{staticClass:"ml-2",attrs:{elevation:"0",fab:"","x-small":""},on:{click:function(e){return t.copy_lyric("s")}}},[a("v-icon",[t._v("mdi-content-copy")])],1)],1),a("v-scroll-x-transition",[t.use_trans||t.show_romaji?a("th",[t.show_romaji&&!t.use_trans?a("span",[t._v(t._s(t.i18n.romaji))]):t._e(),!t.show_romaji&&t.use_trans?a("span",[t._v(t._s(t.i18n.translation))]):t._e(),t.use_trans&&t.show_romaji?a("v-btn",{staticClass:"mr-n2",attrs:{elevation:"0",text:"",small:""},on:{click:function(e){t.show_type=0===t.show_type?1:0}}},[t.show_romaji?a("span",{class:{"grey--text":1===t.show_type}},[t._v(t._s(t.i18n.romaji_s))]):t._e(),t._v("/"),t.use_trans?a("span",{class:{"grey--text":0===t.show_type}},[t._v(t._s(t.i18n.translation_s))]):t._e()]):t._e(),a("v-btn",{staticClass:"ml-2",attrs:{elevation:"0",fab:"","x-small":""},on:{click:function(e){return t.copy_lyric(0===t.show_type?"r":"t")}}},[a("v-icon",[t._v("mdi-content-copy")])],1)],1):t._e()])],1)]),a("tbody",{staticStyle:{"word-break":"break-word","word-wrap":"break-word"}},t._l(t.lyric,(function(e,r){return a("tr",{key:r,on:{mouseenter:function(e){t.hover=r},mouseleave:function(e){t.hover=-1}}},[a("td",{class:{"text-h6":0===r,"text-center":!e.is_lyric}},[t._v(" "+t._s(e.s)+" "),t.tts_support?a("v-scroll-x-transition",[t.tts_loading||""===e.s||t.speaking!==r&&(-1!==t.speaking||t.hover!==r)?t._e():a("v-btn",{class:{"mr-n9":!0,"blue--text":t.speaking===r},attrs:{icon:"",small:""},on:{click:function(e){return t.ja_tts(r)}}},[a("v-icon",[t._v("mdi-volume-high")])],1)],1):t._e(),t.tts_support&&t.speaking===r&&t.tts_loading?a("v-progress-circular",{staticClass:"mr-n9",attrs:{indeterminate:"",size:"20",width:"2",color:"primary"}}):t._e()],1),a("v-scroll-x-transition",[t.use_trans||t.show_romaji?a("td",{class:{"text-center":!e.is_lyric}},[t._v(t._s(0===t.show_type?e.r:e.t))]):t._e()])],1)})),0)]},proxy:!0}],null,!1,3397400449)}):t._e()],1)],1)]),a("v-snackbar",{attrs:{dark:"",timeout:2e3},scopedSlots:t._u([{key:"action",fn:function(e){var r=e.attrs;return[a("v-btn",t._b({attrs:{color:"blue",text:""},on:{click:function(e){t.snackbar=!1}}},"v-btn",r,!1),[t._v(" Close ")])]}}]),model:{value:t.snackbar,callback:function(e){t.snackbar=e},expression:"snackbar"}},[t._v(" "+t._s(t.snackbar_msg)+" ")])],1),a("v-footer",[a("v-row",{staticClass:"ma-0"},[a("div",{staticClass:"text-center caption col-12 pa-0"},[t._v(t._s(t.i18n.footer))]),a("div",{staticClass:"text-center caption col-12 pa-0"},[t._v("© 2022 SkyTNT")])])],1)],1)},s=[],o=a("1da1"),i=(a("96cf"),a("498a"),a("ac1f"),a("5319"),a("00b4"),a("99af"),a("1276"),a("d3b7"),a("bc3a")),l=a.n(i);function c(){return/(iPhone|iPad|iPod|iOS|Android|Windows Phone)/i.test(navigator.userAgent)}String.prototype.trim||(String.prototype.trim=function(){return this.triml().trimr()},String.prototype.triml=function(){return this.replace(/^[\s\n\t]+/g,"")},String.prototype.trimr=function(){return this.replace(/[\s\n\t]+$/g,"")});var u={name:"App",data:function(){return{locale_name:"English",i18n:{},use_trans:!1,google_supported_languages:["af","sq","am","ar","hy","az","eu","be","bn","bs","bg","my","ca","ca","ceb","co","cs","da","nl","nl","en","eo","et","fi","fr","fy","ka","de","gd","gd","ga","gl","el","gu","ht","ht","ha","haw","he","hi","hr","hu","ig","is","id","it","jw","ja","kn","kk","km","ky","ky","ko","ku","lo","la","lv","lt","lb","lb","mk","ml","mi","mr","ms","mg","mt","mn","ne","no","ny","ny","ny","or","pa","pa","fa","pl","pt","ps","ps","ro","ro","ro","ru","si","si","sk","sl","sm","sn","sd","so","st","es","es","sr","su","sw","sv","ta","te","tg","tl","th","tr","ug","ug","uk","ur","uz","vi","cy","xh","yi","yo","zu","zh-CN","zh-TW"],trans_target_lang:"zh-CN",show_romaji:!1,show_type:0,romaji_systems:["hepburn","kunrei","nippon"],romaji_system:"hepburn",prompt_title:"桜",prompt_text:"",loading:!1,lyric:[],tts_cache:{},tts_loading:!1,tts_support:!1,speaking:-1,hover:-1,snackbar:!1,snackbar_msg:""}},mounted:function(){this.locale_name="zh-CN"===(navigator.language||navigator.userLanguage)?"Chinese":"English","English"===this.locale_name&&(this.trans_target_lang="en"),this.set_locale(this.locale_name),this.loads()},methods:{set_locale:function(t){var e="English"===t?"en":"zh",a={en:{title:"Japanese Lyric Generator",loading:"Loading",input_title_label:"Title (can be empty)",input_text_label:"Beginning (can be empty)",input_title_hint:"Generate lyric for a given title",input_text_hint:"The generator continues with this text",show_romaji:"Show romaji",romaji_system:"Romaji system",use_translate:"Translate",target_lang:"Target language",generate:"Generate!",lyric:"Lyric",romaji:"Romaji",romaji_s:"R",translation:"Translation",translation_s:"T",footer:"The generated content can be used as you like, please share this site if you like.",copy_successful:"Copy successful",error:"Error",error_network:"Network error",error_failed_load_kuromoji:"Failed to load romaji converter",error_failed_covert_romaji:"Failed to convert lyric to romaji",error_failed_translate:"Failed to translate lyric",error_copy:"Copy failed, browser does not support"},zh:{title:"日语歌词生成器",loading:"加载中",input_title_label:"歌词标题(可不填)",input_text_label:"歌词开头(可不填)",input_title_hint:"给定标题生成歌词",input_text_hint:"生成器以这段文本进行续写",show_romaji:"显示罗马音",romaji_system:"罗马音系统",use_translate:"是否进行翻译",target_lang:"目标语言",generate:"生成!",lyric:"歌词",romaji:"罗马音",romaji_s:"音",translation:"翻译",translation_s:"译",footer:"生成的内容可以随意使用,喜欢的话就请分享本网站",copy_successful:"复制成功",error:"错误",error_network:"网络错误",error_failed_load_kuromoji:"罗马音转换器加载失败",error_failed_covert_romaji:"转换罗马音错误",error_failed_translate:"翻译出错",error_copy:"复制失败,浏览器不支持"}};this.i18n=a[e]},loads:function(){return Object(o["a"])(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:if(c()){t.next=6;break}return t.t0=eval,t.next=4,l.a.get("https://l2d.fab.moe/js/autoload.js");case 4:t.t1=t.sent.data,(0,t.t0)(t.t1);case 6:case"end":return t.stop()}}),t)})))()},do_gen:function(){var t=this;return Object(o["a"])(regeneratorRuntime.mark((function e(){var a,r,n,s,o,i,c,u,p,_,m;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return a=t.prompt_title.trim(),r=t.prompt_text.trim(),t.loading=!0,t.lyric=[],t.tts_cache={},e.prev=5,e.next=8,l.a.post("gen",{title:a,text:r});case 8:for(i in n=e.sent,s="".concat(n.data.title,"\n\n").concat(n.data.lyric),o=s.split("\n"),o)c=o[i].trim().replace(/ /g," "),t.lyric.push({s:c,r:"",t:"",is_lyric:"---end---"!==c});return t.lyric[0].is_lyric=!1,e.prev=13,e.next=16,l.a.post("romaji",{system:t.romaji_system,text:s});case 16:for(p in u=e.sent.data.romaji,u=u.split("\n"),u)t.lyric[p].r=u[p];e.next=24;break;case 21:e.prev=21,e.t0=e["catch"](13),t.show_snackbar(t.i18n.error_failed_covert_romaji+":"+e.t0.message);case 24:if(!t.use_trans){e.next=29;break}return e.next=27,t.google_translate(s);case 27:if(_=e.sent,""!==_)for(m in _=_.split("\n"),_)t.lyric[m].t=_[m].trim().replace(/ /g," ");case 29:t.loading=!1,e.next=37;break;case 32:e.prev=32,e.t1=e["catch"](5),console.log(e.t1),t.show_snackbar(t.i18n.error+":"+e.t1.message),t.loading=!1;case 37:case"end":return e.stop()}}),e,null,[[5,32],[13,21]])})))()},google_translate:function(t){var e=this;return Object(o["a"])(regeneratorRuntime.mark((function a(){var r,n,s,o,i;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return r={client:"gtx",dt:"t",sl:"ja",tl:e.trans_target_lang,q:t},a.prev=1,a.next=4,l.a.get("https://translate.googleapis.com/translate_a/single",{params:r});case 4:for(i in n=a.sent,s="",o=n.data[0],o)s+=o[i][0];return a.abrupt("return",s);case 11:a.prev=11,a.t0=a["catch"](1),e.show_snackbar(e.i18n.error_failed_translate+":"+a.t0.message);case 14:return a.abrupt("return","");case 15:case"end":return a.stop()}}),a,null,[[1,11]])})))()},ja_tts:function(t){var e=this;return Object(o["a"])(regeneratorRuntime.mark((function a(){var r,n,s,o,i,c;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:if(r=e.lyric[t].s,-1===e.speaking&&""!==r){a.next=3;break}return a.abrupt("return");case 3:if(e.speaking=t,a.prev=4,n=new AudioContext,s=n.createGain(),s.gain.value=2,void 0!==e.tts_cache[r]){a.next=20;break}return e.tts_loading=!0,a.next=12,l.a.post("https://voicevox-skytnt.cloud.okteto.net/audio_query",null,{params:{speaker:4,text:r}});case 12:return o=a.sent.data,a.next=15,l.a.post("https://voicevox-skytnt.cloud.okteto.net/synthesis",o,{params:{speaker:4},responseType:"arraybuffer"});case 15:return i=a.sent.data,e.tts_loading=!1,a.next=19,n.decodeAudioData(i);case 19:e.tts_cache[r]=a.sent;case 20:return c=n.createBufferSource(),c.buffer=e.tts_cache[r],c.loop=!1,c.connect(s),s.connect(n.destination),a.next=27,new Promise((function(t){c.onended=function(){t()},c.start(0)}));case 27:a.next=32;break;case 29:a.prev=29,a.t0=a["catch"](4),e.show_snackbar(e.i18n.error+":"+a.t0.message);case 32:e.speaking=-1,e.tts_loading=!1;case 34:case"end":return a.stop()}}),a,null,[[4,29]])})))()},copy_lyric:function(t){var e="";for(var a in this.lyric)e+=this.lyric[a][t]+"\n";e=e.trim(),this.copy(e)},copy:function(t){var e=this;return Object(o["a"])(regeneratorRuntime.mark((function a(){var r,n;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return a.prev=0,a.next=3,navigator.clipboard.writeText(t);case 3:e.show_snackbar(e.i18n.copy_successful),a.next=18;break;case 6:a.prev=6,a.t0=a["catch"](0),r=document.createElement("textarea"),r.style.position="fixed",r.style.top="-10000px",r.style.zIndex="-999",document.body.appendChild(r),console.log("input",r),r.value=t,r.focus(),r.select();try{n=document.execCommand("copy"),n&&"unsuccessful"!==n?e.show_snackbar(e.i18n.copy_successful):e.show_snackbar(e.i18n.error_copy)}catch(s){e.show_snackbar(e.i18n.error_copy)}finally{document.body.removeChild(r)}case 18:case"end":return a.stop()}}),a,null,[[0,6]])})))()},show_snackbar:function(t){this.snackbar=!0,this.snackbar_msg=t}}},p=u,_=a("2877"),m=a("6544"),d=a.n(m),h=a("7496"),f=a("40dc"),g=a("8336"),v=a("ac7c"),b=a("0789"),y=a("553a"),k=a("132d"),x=a("f6c4"),w=a("490a"),j=a("0fd9"),C=a("b974"),S=a("1f4f"),T=a("2db4"),O=a("2fa4"),V=a("a844"),R=a("2a7f"),z=Object(_["a"])(p,n,s,!1,null,null,null),P=z.exports;d()(z,{VApp:h["a"],VAppBar:f["a"],VBtn:g["a"],VCheckbox:v["a"],VExpandTransition:b["a"],VFooter:y["a"],VIcon:k["a"],VMain:x["a"],VProgressCircular:w["a"],VRow:j["a"],VScrollXTransition:b["d"],VSelect:C["a"],VSimpleTable:S["a"],VSnackbar:T["a"],VSpacer:O["a"],VTextarea:V["a"],VToolbarTitle:R["a"]});var E=a("f309");r["a"].use(E["a"]);var A=new E["a"]({}),M=a("8c4f");r["a"].use(M["a"]);var N=[],B=new M["a"]({routes:N}),F=B;r["a"].config.productionTip=!1,new r["a"]({vuetify:A,router:F,render:function(t){return t(P)}}).$mount("#app")}});
lyric-generator-ja/frontend/dist/js/chunk-vendors.f5ab6a81.js ADDED
The diff for this file is too large to render. See raw diff
 
lyric-generator-ja/frontend/package.json ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "lyric-generator",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "serve": "vue-cli-service serve",
7
+ "build": "vue-cli-service build",
8
+ "lint": "vue-cli-service lint"
9
+ },
10
+ "dependencies": {
11
+ "core-js": "^3.6.5",
12
+ "vue": "^2.6.11",
13
+ "vue-router": "^3.2.0",
14
+ "vuetify": "^2.6.0"
15
+ },
16
+ "devDependencies": {
17
+ "@vue/cli-plugin-babel": "~4.5.9",
18
+ "@vue/cli-plugin-eslint": "~4.5.9",
19
+ "@vue/cli-plugin-router": "~4.5.9",
20
+ "@vue/cli-service": "~4.5.9",
21
+ "axios": "^0.18.0",
22
+ "babel-eslint": "^10.1.0",
23
+ "eslint": "^6.7.2",
24
+ "eslint-plugin-vue": "^6.2.2",
25
+ "sass": "~1.32.0",
26
+ "sass-loader": "^10.0.0",
27
+ "vue-cli-plugin-axios": "~0.0.4",
28
+ "vue-cli-plugin-vuetify": "~2.4.8",
29
+ "vue-template-compiler": "^2.6.11",
30
+ "vuetify-loader": "^1.7.0"
31
+ },
32
+ "eslintConfig": {
33
+ "root": true,
34
+ "env": {
35
+ "node": true
36
+ },
37
+ "extends": [
38
+ "plugin:vue/essential",
39
+ "eslint:recommended"
40
+ ],
41
+ "parserOptions": {
42
+ "parser": "babel-eslint"
43
+ },
44
+ "rules": {}
45
+ },
46
+ "browserslist": [
47
+ "> 1%",
48
+ "last 2 versions",
49
+ "not dead"
50
+ ]
51
+ }
lyric-generator-ja/frontend/public/favicon.ico ADDED
lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.eot ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:55c35c20bedf831352d92854c2c41863b5736eecb1bcec91c965713388d0c14b
3
+ size 1187136
lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.ttf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5e9b23f9dacd79641485a9a3e9d07035b8b22f13e8a15b25544ca9debf618f0f
3
+ size 1186916
lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.woff ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d87b64d83211b941a1e104b2a245b31cc96a9454532335dc8d637a41efcae505
3
+ size 538776
lyric-generator-ja/frontend/public/font/materialdesignicons-webfont.woff2 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:12845dec7187730a27e1fd1e6ef53d92602730f83483af55895beeb9667c9333
3
+ size 372752
lyric-generator-ja/frontend/public/font/materialdesignicons-webfont_ie.eot ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:55c35c20bedf831352d92854c2c41863b5736eecb1bcec91c965713388d0c14b
3
+ size 1187136
lyric-generator-ja/frontend/public/font/materialdesignicons.min.css ADDED
The diff for this file is too large to render. See raw diff
 
lyric-generator-ja/frontend/public/font/roboto.css ADDED
@@ -0,0 +1,336 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* cyrillic-ext */
2
+ @font-face {
3
+ font-family: 'Roboto';
4
+ font-style: normal;
5
+ font-weight: 100;
6
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxFIzIFKw.woff2) format('woff2');
7
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
8
+ }
9
+ /* cyrillic */
10
+ @font-face {
11
+ font-family: 'Roboto';
12
+ font-style: normal;
13
+ font-weight: 100;
14
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxMIzIFKw.woff2) format('woff2');
15
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
16
+ }
17
+ /* greek-ext */
18
+ @font-face {
19
+ font-family: 'Roboto';
20
+ font-style: normal;
21
+ font-weight: 100;
22
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxEIzIFKw.woff2) format('woff2');
23
+ unicode-range: U+1F00-1FFF;
24
+ }
25
+ /* greek */
26
+ @font-face {
27
+ font-family: 'Roboto';
28
+ font-style: normal;
29
+ font-weight: 100;
30
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxLIzIFKw.woff2) format('woff2');
31
+ unicode-range: U+0370-03FF;
32
+ }
33
+ /* vietnamese */
34
+ @font-face {
35
+ font-family: 'Roboto';
36
+ font-style: normal;
37
+ font-weight: 100;
38
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxHIzIFKw.woff2) format('woff2');
39
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
40
+ }
41
+ /* latin-ext */
42
+ @font-face {
43
+ font-family: 'Roboto';
44
+ font-style: normal;
45
+ font-weight: 100;
46
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxGIzIFKw.woff2) format('woff2');
47
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
48
+ }
49
+ /* latin */
50
+ @font-face {
51
+ font-family: 'Roboto';
52
+ font-style: normal;
53
+ font-weight: 100;
54
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxIIzI.woff2) format('woff2');
55
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
56
+ }
57
+ /* cyrillic-ext */
58
+ @font-face {
59
+ font-family: 'Roboto';
60
+ font-style: normal;
61
+ font-weight: 300;
62
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2) format('woff2');
63
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
64
+ }
65
+ /* cyrillic */
66
+ @font-face {
67
+ font-family: 'Roboto';
68
+ font-style: normal;
69
+ font-weight: 300;
70
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2) format('woff2');
71
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
72
+ }
73
+ /* greek-ext */
74
+ @font-face {
75
+ font-family: 'Roboto';
76
+ font-style: normal;
77
+ font-weight: 300;
78
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2) format('woff2');
79
+ unicode-range: U+1F00-1FFF;
80
+ }
81
+ /* greek */
82
+ @font-face {
83
+ font-family: 'Roboto';
84
+ font-style: normal;
85
+ font-weight: 300;
86
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2) format('woff2');
87
+ unicode-range: U+0370-03FF;
88
+ }
89
+ /* vietnamese */
90
+ @font-face {
91
+ font-family: 'Roboto';
92
+ font-style: normal;
93
+ font-weight: 300;
94
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2) format('woff2');
95
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
96
+ }
97
+ /* latin-ext */
98
+ @font-face {
99
+ font-family: 'Roboto';
100
+ font-style: normal;
101
+ font-weight: 300;
102
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2');
103
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
104
+ }
105
+ /* latin */
106
+ @font-face {
107
+ font-family: 'Roboto';
108
+ font-style: normal;
109
+ font-weight: 300;
110
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2');
111
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
112
+ }
113
+ /* cyrillic-ext */
114
+ @font-face {
115
+ font-family: 'Roboto';
116
+ font-style: normal;
117
+ font-weight: 400;
118
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2');
119
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
120
+ }
121
+ /* cyrillic */
122
+ @font-face {
123
+ font-family: 'Roboto';
124
+ font-style: normal;
125
+ font-weight: 400;
126
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2');
127
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
128
+ }
129
+ /* greek-ext */
130
+ @font-face {
131
+ font-family: 'Roboto';
132
+ font-style: normal;
133
+ font-weight: 400;
134
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2');
135
+ unicode-range: U+1F00-1FFF;
136
+ }
137
+ /* greek */
138
+ @font-face {
139
+ font-family: 'Roboto';
140
+ font-style: normal;
141
+ font-weight: 400;
142
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2');
143
+ unicode-range: U+0370-03FF;
144
+ }
145
+ /* vietnamese */
146
+ @font-face {
147
+ font-family: 'Roboto';
148
+ font-style: normal;
149
+ font-weight: 400;
150
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2');
151
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
152
+ }
153
+ /* latin-ext */
154
+ @font-face {
155
+ font-family: 'Roboto';
156
+ font-style: normal;
157
+ font-weight: 400;
158
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2');
159
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
160
+ }
161
+ /* latin */
162
+ @font-face {
163
+ font-family: 'Roboto';
164
+ font-style: normal;
165
+ font-weight: 400;
166
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2');
167
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
168
+ }
169
+ /* cyrillic-ext */
170
+ @font-face {
171
+ font-family: 'Roboto';
172
+ font-style: normal;
173
+ font-weight: 500;
174
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2) format('woff2');
175
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
176
+ }
177
+ /* cyrillic */
178
+ @font-face {
179
+ font-family: 'Roboto';
180
+ font-style: normal;
181
+ font-weight: 500;
182
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2) format('woff2');
183
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
184
+ }
185
+ /* greek-ext */
186
+ @font-face {
187
+ font-family: 'Roboto';
188
+ font-style: normal;
189
+ font-weight: 500;
190
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2) format('woff2');
191
+ unicode-range: U+1F00-1FFF;
192
+ }
193
+ /* greek */
194
+ @font-face {
195
+ font-family: 'Roboto';
196
+ font-style: normal;
197
+ font-weight: 500;
198
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2) format('woff2');
199
+ unicode-range: U+0370-03FF;
200
+ }
201
+ /* vietnamese */
202
+ @font-face {
203
+ font-family: 'Roboto';
204
+ font-style: normal;
205
+ font-weight: 500;
206
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2) format('woff2');
207
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
208
+ }
209
+ /* latin-ext */
210
+ @font-face {
211
+ font-family: 'Roboto';
212
+ font-style: normal;
213
+ font-weight: 500;
214
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2) format('woff2');
215
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
216
+ }
217
+ /* latin */
218
+ @font-face {
219
+ font-family: 'Roboto';
220
+ font-style: normal;
221
+ font-weight: 500;
222
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fBBc4.woff2) format('woff2');
223
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
224
+ }
225
+ /* cyrillic-ext */
226
+ @font-face {
227
+ font-family: 'Roboto';
228
+ font-style: normal;
229
+ font-weight: 700;
230
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2) format('woff2');
231
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
232
+ }
233
+ /* cyrillic */
234
+ @font-face {
235
+ font-family: 'Roboto';
236
+ font-style: normal;
237
+ font-weight: 700;
238
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2) format('woff2');
239
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
240
+ }
241
+ /* greek-ext */
242
+ @font-face {
243
+ font-family: 'Roboto';
244
+ font-style: normal;
245
+ font-weight: 700;
246
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2) format('woff2');
247
+ unicode-range: U+1F00-1FFF;
248
+ }
249
+ /* greek */
250
+ @font-face {
251
+ font-family: 'Roboto';
252
+ font-style: normal;
253
+ font-weight: 700;
254
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2) format('woff2');
255
+ unicode-range: U+0370-03FF;
256
+ }
257
+ /* vietnamese */
258
+ @font-face {
259
+ font-family: 'Roboto';
260
+ font-style: normal;
261
+ font-weight: 700;
262
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2) format('woff2');
263
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
264
+ }
265
+ /* latin-ext */
266
+ @font-face {
267
+ font-family: 'Roboto';
268
+ font-style: normal;
269
+ font-weight: 700;
270
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2) format('woff2');
271
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
272
+ }
273
+ /* latin */
274
+ @font-face {
275
+ font-family: 'Roboto';
276
+ font-style: normal;
277
+ font-weight: 700;
278
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format('woff2');
279
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
280
+ }
281
+ /* cyrillic-ext */
282
+ @font-face {
283
+ font-family: 'Roboto';
284
+ font-style: normal;
285
+ font-weight: 900;
286
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfCRc4EsA.woff2) format('woff2');
287
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
288
+ }
289
+ /* cyrillic */
290
+ @font-face {
291
+ font-family: 'Roboto';
292
+ font-style: normal;
293
+ font-weight: 900;
294
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfABc4EsA.woff2) format('woff2');
295
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
296
+ }
297
+ /* greek-ext */
298
+ @font-face {
299
+ font-family: 'Roboto';
300
+ font-style: normal;
301
+ font-weight: 900;
302
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfCBc4EsA.woff2) format('woff2');
303
+ unicode-range: U+1F00-1FFF;
304
+ }
305
+ /* greek */
306
+ @font-face {
307
+ font-family: 'Roboto';
308
+ font-style: normal;
309
+ font-weight: 900;
310
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfBxc4EsA.woff2) format('woff2');
311
+ unicode-range: U+0370-03FF;
312
+ }
313
+ /* vietnamese */
314
+ @font-face {
315
+ font-family: 'Roboto';
316
+ font-style: normal;
317
+ font-weight: 900;
318
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfCxc4EsA.woff2) format('woff2');
319
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
320
+ }
321
+ /* latin-ext */
322
+ @font-face {
323
+ font-family: 'Roboto';
324
+ font-style: normal;
325
+ font-weight: 900;
326
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfChc4EsA.woff2) format('woff2');
327
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
328
+ }
329
+ /* latin */
330
+ @font-face {
331
+ font-family: 'Roboto';
332
+ font-style: normal;
333
+ font-weight: 900;
334
+ src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmYUtfBBc4.woff2) format('woff2');
335
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
336
+ }
lyric-generator-ja/frontend/public/index.html ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en" style="overflow-y: auto">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width,initial-scale=1.0">
7
+ <link rel="icon" href="<%= BASE_URL %>favicon.ico">
8
+ <title>日语歌词生成器</title>
9
+ <link rel="stylesheet" href="font/roboto.css">
10
+ <link rel="stylesheet" href="font/materialdesignicons.min.css">
11
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.1/iframeResizer.contentWindow.min.js" integrity="sha512-qw2bX9KUhi7HLuUloyRsvxRlWJvj0u0JWVegc5tf7qsw47T0pwXZIk1Kyc0utTH3NlrpHtLa4HYTVUyHBr9Ufg==" crossorigin="anonymous"></script>
12
+ </head>
13
+ <body>
14
+ <noscript>
15
+ <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
16
+ </noscript>
17
+ <div id="app"></div>
18
+ <!-- built files will be auto injected -->
19
+ </body>
20
+ </html>
lyric-generator-ja/frontend/src/App.vue ADDED
@@ -0,0 +1,355 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <template>
2
+ <v-app>
3
+ <v-app-bar app dark color="primary">
4
+ <v-toolbar-title>{{i18n.title}}</v-toolbar-title>
5
+ <v-spacer></v-spacer>
6
+ <v-select style="max-width: 10rem" v-model="locale_name" @change="set_locale(locale_name)" :items="['English','Chinese']" prepend-icon="mdi-web" hide-details></v-select>
7
+ </v-app-bar>
8
+ <v-main>
9
+ <v-row class="mx-3">
10
+ <div class="col-12 offset-0 col-sm-8 offset-sm-2 col-md-8 offset-md-2 col-lg-6 offset-lg-3 col-xl-6 offset-xl-3 mt-8">
11
+ <v-textarea
12
+ v-model="prompt_title"
13
+ :label="i18n.input_title_label"
14
+ :disabled="loading"
15
+ rows="1"
16
+ prepend-icon="mdi-comment"
17
+ :hint="i18n.input_title_hint"
18
+ no-resize
19
+ ></v-textarea>
20
+ <v-textarea
21
+ v-model="prompt_text"
22
+ :label="i18n.input_text_label"
23
+ :disabled="loading"
24
+ rows="2"
25
+ prepend-icon="mdi-comment"
26
+ :hint="i18n.input_text_hint"
27
+ no-resize
28
+ ></v-textarea>
29
+ <v-row>
30
+ <v-checkbox class="col-6" v-model="show_romaji" :disabled="loading" @change="show_type=show_romaji?0:1" :label="i18n.show_romaji"></v-checkbox>
31
+ <v-scroll-x-transition>
32
+ <v-select class="col-6" v-if="show_romaji" v-model="romaji_system" :disabled="loading" :items="romaji_systems" :hint="i18n.romaji_system"></v-select>
33
+ </v-scroll-x-transition>
34
+ </v-row>
35
+ <v-row class="mt-n8">
36
+ <v-checkbox class="col-6" v-model="use_trans" :disabled="loading" @change="show_type=use_trans?1:0" :label="i18n.use_translate"></v-checkbox>
37
+ <v-scroll-x-transition>
38
+ <v-select class="col-6" v-if="use_trans" v-model="trans_target_lang" :disabled="loading" :items="google_supported_languages" :hint="i18n.target_lang"></v-select>
39
+ </v-scroll-x-transition>
40
+ </v-row>
41
+ <v-btn color="primary" class="mb-10" elevation="5" @click="do_gen()" :loading="loading" text block large tile>{{i18n.generate}}</v-btn>
42
+ <v-expand-transition>
43
+ <v-simple-table v-if="lyric.length !== 0" class="py-5" dense>
44
+ <template v-slot:default>
45
+ <thead>
46
+ <tr>
47
+ <th>{{i18n.lyric}}<v-btn class="ml-2" elevation="0" @click="copy_lyric('s')" fab x-small><v-icon>mdi-content-copy</v-icon></v-btn></th>
48
+ <v-scroll-x-transition>
49
+ <th v-if="use_trans||show_romaji">
50
+ <span v-if="show_romaji&&!use_trans">{{i18n.romaji}}</span>
51
+ <span v-if="!show_romaji&&use_trans">{{i18n.translation}}</span>
52
+ <v-btn v-if="use_trans&&show_romaji" class="mr-n2" elevation="0" @click="show_type=show_type===0?1:0" text small>
53
+ <span v-if="show_romaji" :class="{'grey--text':show_type===1}">{{i18n.romaji_s}}</span>/<span v-if="use_trans" :class="{'grey--text':show_type===0}">{{i18n.translation_s}}</span>
54
+ </v-btn>
55
+ <v-btn class="ml-2" elevation="0" @click="copy_lyric(show_type===0?'r':'t')" fab x-small><v-icon>mdi-content-copy</v-icon></v-btn>
56
+ </th>
57
+ </v-scroll-x-transition>
58
+ </tr>
59
+ </thead>
60
+ <tbody style="word-break: break-word; word-wrap:break-word;">
61
+ <tr v-for="(item, idx) in lyric" :key="idx" @mouseenter="hover=idx" @mouseleave="hover=-1">
62
+ <td :class="{'text-h6': idx===0, 'text-center': !item.is_lyric}">
63
+ {{item.s}}
64
+ <v-scroll-x-transition v-if="tts_support">
65
+ <v-btn v-if="!tts_loading&&item.s!==''&&(speaking===idx||(speaking===-1&&hover===idx))" :class="{'mr-n9':true,'blue--text':speaking===idx}" icon small @click="ja_tts(idx)">
66
+ <v-icon>mdi-volume-high</v-icon>
67
+ </v-btn>
68
+ </v-scroll-x-transition >
69
+ <v-progress-circular v-if="tts_support&&speaking===idx&&tts_loading" class="mr-n9" indeterminate size="20" width="2" color="primary"></v-progress-circular>
70
+ </td>
71
+ <v-scroll-x-transition>
72
+ <td v-if="use_trans||show_romaji" :class="{'text-center': !item.is_lyric}">{{show_type===0?item.r:item.t}}</td>
73
+ </v-scroll-x-transition>
74
+ </tr>
75
+ </tbody>
76
+ </template>
77
+ </v-simple-table>
78
+ </v-expand-transition>
79
+ </div>
80
+ </v-row>
81
+ <v-snackbar dark v-model="snackbar" :timeout="2000">
82
+ {{ snackbar_msg }}
83
+ <template v-slot:action="{ attrs }">
84
+ <v-btn color="blue" text v-bind="attrs" @click="snackbar = false">
85
+ Close
86
+ </v-btn>
87
+ </template>
88
+ </v-snackbar>
89
+ </v-main>
90
+ <v-footer>
91
+ <v-row class="ma-0">
92
+ <div class="text-center caption col-12 pa-0">{{i18n.footer}}</div>
93
+ <div class="text-center caption col-12 pa-0">© 2022 SkyTNT</div>
94
+ </v-row>
95
+ </v-footer>
96
+ </v-app>
97
+ </template>
98
+
99
+ <style lang="scss">
100
+ </style>
101
+ <script>
102
+ import axios from 'axios'
103
+
104
+ if (!String.prototype.trim) {
105
+ String.prototype.trim = function () {
106
+ return this.triml().trimr();
107
+ }
108
+ String.prototype.triml = function () {
109
+ return this.replace(/^[\s\n\t]+/g, "");
110
+ }
111
+ String.prototype.trimr = function () {
112
+ return this.replace(/[\s\n\t]+$/g, "");
113
+ }
114
+ }
115
+
116
+ function isMobile(){
117
+ return /(iPhone|iPad|iPod|iOS|Android|Windows Phone)/i.test(navigator.userAgent);
118
+ }
119
+
120
+ export default {
121
+ name: "App",
122
+ data:()=>({
123
+ locale_name: "English",
124
+ i18n:{},
125
+ use_trans: false,
126
+ google_supported_languages:['af', 'sq', 'am', 'ar', 'hy', 'az', 'eu', 'be', 'bn', 'bs', 'bg', 'my', 'ca', 'ca', 'ceb', 'co', 'cs', 'da', 'nl', 'nl', 'en', 'eo', 'et', 'fi', 'fr', 'fy', 'ka', 'de', 'gd', 'gd', 'ga', 'gl', 'el', 'gu', 'ht', 'ht', 'ha', 'haw', 'he', 'hi', 'hr', 'hu', 'ig', 'is', 'id', 'it', 'jw', 'ja', 'kn', 'kk', 'km', 'ky', 'ky', 'ko', 'ku', 'lo', 'la', 'lv', 'lt', 'lb', 'lb', 'mk', 'ml', 'mi', 'mr', 'ms', 'mg', 'mt', 'mn', 'ne', 'no', 'ny', 'ny', 'ny', 'or', 'pa', 'pa', 'fa', 'pl', 'pt', 'ps', 'ps', 'ro', 'ro', 'ro', 'ru', 'si', 'si', 'sk', 'sl', 'sm', 'sn', 'sd', 'so', 'st', 'es', 'es', 'sr', 'su', 'sw', 'sv', 'ta', 'te', 'tg', 'tl', 'th', 'tr', 'ug', 'ug', 'uk', 'ur', 'uz', 'vi', 'cy', 'xh', 'yi', 'yo', 'zu', 'zh-CN', 'zh-TW'],
127
+ trans_target_lang:"zh-CN",
128
+ show_romaji:false,
129
+ show_type:0,
130
+ romaji_systems:["hepburn", "kunrei", "nippon"],
131
+ romaji_system:"hepburn",
132
+ prompt_title:"桜",
133
+ prompt_text:"",
134
+ loading:false,
135
+ lyric:[],
136
+ tts_cache:{},//tts缓存
137
+ tts_loading:false,
138
+ tts_support:false,
139
+ speaking:-1,//正在tts的行数
140
+ hover:-1,//鼠标悬停的行数
141
+ snackbar:false,
142
+ snackbar_msg:""
143
+ }),
144
+ mounted() {
145
+ this.locale_name = (navigator.language ||navigator.userLanguage)==="zh-CN"?"Chinese":"English"
146
+ if(this.locale_name==="English")
147
+ this.trans_target_lang="en";
148
+ this.set_locale(this.locale_name);
149
+ this.loads();
150
+ },
151
+ methods:{
152
+ set_locale(name){
153
+ let locale = name==="English"?"en":"zh";
154
+ let langs={
155
+ en:{
156
+ title:"Japanese Lyric Generator",
157
+ loading:"Loading",
158
+ input_title_label:"Title (can be empty)",
159
+ input_text_label:"Beginning (can be empty)",
160
+ input_title_hint:"Generate lyric for a given title",
161
+ input_text_hint:"The generator continues with this text",
162
+ show_romaji:"Show romaji",
163
+ romaji_system:"Romaji system",
164
+ use_translate:"Translate",
165
+ target_lang:"Target language",
166
+ generate:"Generate!",
167
+ lyric:"Lyric",
168
+ romaji:"Romaji",
169
+ romaji_s:"R",
170
+ translation:"Translation",
171
+ translation_s:"T",
172
+ footer:"The generated content can be used as you like, please share this site if you like.",
173
+ copy_successful:"Copy successful",
174
+ error:"Error",
175
+ error_network:"Network error",
176
+ error_failed_load_kuromoji:"Failed to load romaji converter",
177
+ error_failed_covert_romaji:"Failed to convert lyric to romaji",
178
+ error_failed_translate:"Failed to translate lyric",
179
+ error_copy:"Copy failed, browser does not support"
180
+ },
181
+ zh:{
182
+ title:"日语歌词生成器",
183
+ loading:"加载中",
184
+ input_title_label:"歌词标题(可不填)",
185
+ input_text_label:"歌词开头(可不填)",
186
+ input_title_hint:"给定标题生成歌词",
187
+ input_text_hint:"生成器以这段文本进行续写",
188
+ show_romaji:"显示罗马音",
189
+ romaji_system:"罗马音系统",
190
+ use_translate:"是否进行翻译",
191
+ target_lang:"目标语言",
192
+ generate:"生成!",
193
+ lyric:"歌词",
194
+ romaji:"罗马音",
195
+ romaji_s:"音",
196
+ translation:"翻译",
197
+ translation_s:"译",
198
+ footer:"生成的内容可以随意使用,喜欢的话就请分享本网站",
199
+ copy_successful:"复制成功",
200
+ error:"错误",
201
+ error_network:"网络错误",
202
+ error_failed_load_kuromoji:"罗马音转换器加载失败",
203
+ error_failed_covert_romaji:"转换罗马音错误",
204
+ error_failed_translate:"翻译出错",
205
+ error_copy:"复制失败,浏览器不支持"
206
+ }
207
+ };
208
+ this.i18n = langs[locale];
209
+ },
210
+ async loads(){
211
+ if(!isMobile()){
212
+ eval((await axios.get('https://l2d.fab.moe/js/autoload.js')).data);
213
+ }
214
+ },
215
+ async do_gen(){
216
+ let prompt_title = this.prompt_title.trim();
217
+ let prompt_text = this.prompt_text.trim();
218
+ this.loading = true;
219
+ this.lyric = [];
220
+ this.tts_cache = {};
221
+
222
+ try {
223
+ let result = await axios.post("gen",
224
+ {title:prompt_title, text:prompt_text})
225
+ let gen_text = `${result.data.title}\n\n${result.data.lyric}`
226
+ let lines = gen_text.split('\n')
227
+ for (let i in lines) {
228
+ let line = lines[i].trim().replace(/ /g, "\u3000")
229
+ this.lyric.push({s: line, r: "", t: "", is_lyric: line!=="---end---"})
230
+ }
231
+ this.lyric[0].is_lyric = false; //title
232
+
233
+ try {
234
+ let romajis = (await axios.post("romaji",{system:this.romaji_system, text:gen_text})).data.romaji
235
+ romajis = romajis.split('\n')
236
+ for (let i in romajis) {
237
+ this.lyric[i].r = romajis[i]
238
+ }
239
+ }catch (e) {
240
+ this.show_snackbar(this.i18n.error_failed_covert_romaji+":" + e.message)
241
+ }
242
+
243
+ if (this.use_trans) {
244
+ let trans = await this.google_translate(gen_text);
245
+ if (trans !== "") {
246
+ trans = trans.split("\n")
247
+ for (let i in trans) {
248
+ this.lyric[i].t = trans[i].trim().replace(/ /g, "\u3000")
249
+ }
250
+ }
251
+ }
252
+ this.loading = false;
253
+
254
+ } catch (e) {
255
+ console.log(e)
256
+ this.show_snackbar(this.i18n.error+":" + e.message)
257
+ this.loading = false;
258
+ }
259
+
260
+ },
261
+ async google_translate(text){
262
+ let params = {client: "gtx", dt: "t", sl: "ja", tl: this.trans_target_lang, q: text};
263
+ try {
264
+ let result = await axios.get("https://translate.googleapis.com/translate_a/single",{
265
+ params:params
266
+ });
267
+ let out = "";
268
+ let lines = result.data[0];
269
+ for(let i in lines)
270
+ out += lines[i][0];
271
+ return out;
272
+ }catch(e){
273
+ this.show_snackbar(this.i18n.error_failed_translate+":"+e.message);
274
+ }
275
+ return "";
276
+ },
277
+ async ja_tts(line){
278
+ let text = this.lyric[line].s;
279
+ if(this.speaking !== -1||text === ""){
280
+ return;
281
+ }
282
+
283
+ this.speaking = line;
284
+ try{
285
+ let context = new AudioContext();
286
+ let gain = context.createGain();
287
+ gain.gain.value=2;
288
+ if(this.tts_cache[text] === undefined){
289
+ this.tts_loading=true;
290
+ let audio_query = (await axios.post("https://voicevox-skytnt.cloud.okteto.net/audio_query",null,
291
+ {params:{speaker:4,text:text}})).data;
292
+ let wave = (await axios.post("https://voicevox-skytnt.cloud.okteto.net/synthesis",audio_query,
293
+ {params:{speaker:4},responseType:"arraybuffer"})).data;
294
+ this.tts_loading=false;
295
+ this.tts_cache[text] = await context.decodeAudioData(wave);
296
+ }
297
+ let source = context.createBufferSource();
298
+ source.buffer = this.tts_cache[text];
299
+ source.loop = false;
300
+ source.connect(gain);
301
+ gain.connect(context.destination);
302
+ await new Promise((resolve) => {
303
+ source.onended = () => {resolve()}
304
+ source.start(0);//立即播放
305
+ });
306
+ }catch (e) {
307
+ this.show_snackbar(this.i18n.error+":"+e.message)
308
+ }
309
+ this.speaking = -1;
310
+ this.tts_loading=false;//防止网络出错导致tts_loading为true
311
+ },
312
+ copy_lyric(attr_name){
313
+ let text = ""
314
+ for(let i in this.lyric){
315
+ text += this.lyric[i][attr_name] + "\n"
316
+ }
317
+ text = text.trim()
318
+ this.copy(text)
319
+ },
320
+ async copy(text){
321
+ try {
322
+ await navigator.clipboard.writeText(text)
323
+ this.show_snackbar(this.i18n.copy_successful)
324
+ }catch (e) {
325
+ let input = document.createElement('textarea')
326
+ input.style.position = 'fixed'
327
+ input.style.top = '-10000px'
328
+ input.style.zIndex = '-999'
329
+ document.body.appendChild(input)
330
+ console.log('input', input)
331
+ input.value = text
332
+ input.focus()
333
+ input.select()
334
+ try {
335
+ let result = document.execCommand('copy')
336
+ if (!result || result === 'unsuccessful') {
337
+ this.show_snackbar(this.i18n.error_copy)
338
+ } else {
339
+ this.show_snackbar(this.i18n.copy_successful)
340
+ }
341
+ } catch (e) {
342
+ this.show_snackbar(this.i18n.error_copy)
343
+ }finally {
344
+ document.body.removeChild(input)
345
+ }
346
+ }
347
+ },
348
+ show_snackbar(msg){
349
+ this.snackbar=true;
350
+ this.snackbar_msg=msg;
351
+ }
352
+ }
353
+ }
354
+
355
+ </script>
lyric-generator-ja/frontend/src/main.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import Vue from 'vue'
2
+ import App from './App.vue'
3
+ import vuetify from './plugins/vuetify'
4
+ import router from './router'
5
+
6
+ Vue.config.productionTip = false
7
+
8
+ new Vue({
9
+ vuetify,
10
+ router,
11
+ render: h => h(App)
12
+ }).$mount('#app')
lyric-generator-ja/frontend/src/plugins/vuetify.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import Vue from 'vue';
2
+ import Vuetify from 'vuetify/lib/framework';
3
+
4
+ Vue.use(Vuetify);
5
+
6
+ export default new Vuetify({
7
+ });
lyric-generator-ja/frontend/src/router/index.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import Vue from 'vue'
2
+ import VueRouter from 'vue-router'
3
+
4
+ Vue.use(VueRouter)
5
+
6
+ const routes = [
7
+ // {
8
+ // path: '/',
9
+ // name: 'Home',
10
+ // component: Home
11
+ // }
12
+ ]
13
+
14
+ const router = new VueRouter({
15
+ routes
16
+ })
17
+
18
+ export default router
lyric-generator-ja/frontend/vue.config.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ transpileDependencies: [
3
+ 'vuetify'
4
+ ],
5
+ publicPath: '',
6
+ productionSourceMap: false
7
+ }
lyric-generator-ja/frontend/yarn.lock ADDED
The diff for this file is too large to render. See raw diff
 
lyric-generator-ja/requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ flask
2
+ torch
3
+ transformers
4
+ sentencepiece
5
+ unidic-lite
6
+ cutlet