├── Procfile ├── README.md ├── conversor ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-36.pyc │ ├── admin.cpython-36.pyc │ ├── forms.cpython-36.pyc │ ├── models.cpython-36.pyc │ ├── serializers.cpython-36.pyc │ ├── urls.cpython-36.pyc │ └── views.cpython-36.pyc ├── admin.py ├── apps.py ├── forms.py ├── media │ └── asdsa.mp3 ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20190705_1406.py │ ├── 0003_auto_20190705_1416.py │ ├── 0004_audio_idioma_do_texto.py │ ├── 0005_auto_20190705_1447.py │ ├── 0006_auto_20190705_1454.py │ ├── 0007_auto_20190705_1502.py │ ├── 0008_auto_20190705_1514.py │ ├── 0009_auto_20190707_2127.py │ ├── 0010_auto_20190708_0022.py │ ├── 0011_auto_20190708_0042.py │ ├── 0012_auto_20190708_0932.py │ ├── 0013_auto_20190708_2113.py │ ├── 0014_auto_20190716_2110.py │ ├── 0015_auto_20190716_2117.py │ ├── __init__.py │ └── __pycache__ │ │ ├── 0001_initial.cpython-36.pyc │ │ ├── 0002_auto_20190705_1406.cpython-36.pyc │ │ ├── 0003_auto_20190705_1416.cpython-36.pyc │ │ ├── 0004_audio_idioma_do_texto.cpython-36.pyc │ │ ├── 0005_auto_20190705_1447.cpython-36.pyc │ │ ├── 0006_auto_20190705_1454.cpython-36.pyc │ │ ├── 0007_auto_20190705_1502.cpython-36.pyc │ │ ├── 0008_auto_20190705_1514.cpython-36.pyc │ │ ├── 0009_auto_20190707_2127.cpython-36.pyc │ │ ├── 0010_auto_20190708_0022.cpython-36.pyc │ │ ├── 0011_auto_20190708_0042.cpython-36.pyc │ │ ├── 0012_auto_20190708_0932.cpython-36.pyc │ │ ├── 0013_auto_20190708_2113.cpython-36.pyc │ │ ├── 0014_auto_20190716_2110.cpython-36.pyc │ │ ├── 0015_auto_20190716_2117.cpython-36.pyc │ │ └── __init__.cpython-36.pyc ├── models.py ├── serializers.py ├── static │ ├── css │ │ └── style.css │ └── icone.png ├── templates │ ├── base.html │ └── conversor │ │ ├── audio.html │ │ └── index.html ├── tests.py ├── urls.py └── views.py ├── conversortts ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-36.pyc │ ├── settings.cpython-36.pyc │ ├── urls.cpython-36.pyc │ └── wsgi.cpython-36.pyc ├── settings.py ├── urls.py └── wsgi.py ├── db.sqlite3 ├── debug.log ├── manage.py └── requirements.txt /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn conversortts.wsgi 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Conversor TTS 2 | 3 | # Projeto em fase inicial. 4 | 5 | Uma aplicação web feita em Django que gera arquivos de áudio baseados no texto digitado. 6 | 7 | Tome cuidado ao escolher o nome do arquivo, pois o nome deve respeitar as regras do sistema operacional. Caso contrário resultará em erro. 8 | 9 | Biblioteca utilizada para gerar os áudios: https://github.com/pndurette/gTTS 10 | -------------------------------------------------------------------------------- /conversor/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/__init__.py -------------------------------------------------------------------------------- /conversor/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/__pycache__/admin.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/__pycache__/admin.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/__pycache__/forms.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/__pycache__/forms.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/__pycache__/models.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/__pycache__/models.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/__pycache__/serializers.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/__pycache__/serializers.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/__pycache__/urls.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/__pycache__/urls.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/__pycache__/views.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/__pycache__/views.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /conversor/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ConversorConfig(AppConfig): 5 | name = 'conversor' 6 | -------------------------------------------------------------------------------- /conversor/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from .models import Audio 3 | 4 | class AudioForm(forms.ModelForm): 5 | 6 | class Meta: 7 | model = Audio 8 | fields = '__all__' 9 | -------------------------------------------------------------------------------- /conversor/media/asdsa.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/media/asdsa.mp3 -------------------------------------------------------------------------------- /conversor/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.2 on 2019-07-02 00:18 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Audio', 16 | fields=[ 17 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('nome', models.CharField(max_length=255)), 19 | ('texto', models.TextField()), 20 | ], 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /conversor/migrations/0002_auto_20190705_1406.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-05 17:06 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='audio', 15 | old_name='nome', 16 | new_name='nome_do_arquivo', 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0003_auto_20190705_1416.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-05 17:16 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0002_auto_20190705_1406'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='audio', 15 | name='nome_do_arquivo', 16 | field=models.CharField(help_text='.mp3', max_length=255), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0004_audio_idioma_do_texto.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-05 17:28 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0003_auto_20190705_1416'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='audio', 15 | name='idioma_do_texto', 16 | field=models.CharField(choices=[('1', 'Português'), ('2', 'English')], default=('1', 'Português'), max_length=15), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0005_auto_20190705_1447.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-05 17:47 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0004_audio_idioma_do_texto'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='audio', 15 | name='idioma_do_texto', 16 | field=models.CharField(choices=[('pt-br', 'Português'), ('en-us', 'English')], default=('pt-br', 'Português'), max_length=15), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0006_auto_20190705_1454.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-05 17:54 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0005_auto_20190705_1447'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='audio', 15 | name='idioma_do_texto', 16 | field=models.CharField(choices=[('pt-br', 'Português'), ('en-us', 'English'), ('es', 'Espanol')], default=('pt-br', 'Português'), max_length=15), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0007_auto_20190705_1502.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-05 18:02 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0006_auto_20190705_1454'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='audio', 15 | name='idioma_do_texto', 16 | field=models.CharField(choices=[('pt-br', 'Português (BR)'), ('pt-pt', 'Português (PT)'), ('en-us', 'Inglês (EUA)'), ('es', 'Espanhol')], default=('pt-br', 'Português'), max_length=15), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0008_auto_20190705_1514.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-05 18:14 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0007_auto_20190705_1502'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='audio', 15 | name='nome_do_arquivo', 16 | field=models.CharField(max_length=255), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0009_auto_20190707_2127.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-08 00:27 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0008_auto_20190705_1514'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='audio', 15 | name='idioma_do_texto', 16 | field=models.CharField(choices=[('de', 'Alemão'), ('ca', 'Catalão'), ('zn-cn', 'Chinês'), ('ko', 'Coreano'), ('es-es', 'Espanhol'), ('fr-fr', 'Francês'), ('en-ca', 'Inglês (Canadá)'), ('en-us', 'Inglês (EUA)'), ('en-uk', 'Inglês (Reino Unido)'), ('ja', 'Japonês'), ('la', 'Latim'), ('pt-br', 'Português (BR)'), ('pt-pt', 'Português (PT)'), ('ru', 'Russo')], default=('pt-br', 'Português'), max_length=20), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0010_auto_20190708_0022.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-08 03:22 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0009_auto_20190707_2127'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='audio', 15 | name='idioma_do_texto', 16 | field=models.CharField(choices=[('de', 'Alemão'), ('ca', 'Catalão'), ('zn-cn', 'Chinês'), ('ko', 'Coreano'), ('es-es', 'Espanhol'), ('fr-fr', 'Francês'), ('en-ca', 'Inglês (Canadá)'), ('en-us', 'Inglês (EUA)'), ('en-uk', 'Inglês (Reino Unido)'), ('ja', 'Japonês'), ('la', 'Latim'), ('pt-br', 'Português (BR)'), ('pt-pt', 'Português (PT)'), ('ru', 'Russo')], default=('pt-br', 'Português'), max_length=15), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0011_auto_20190708_0042.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-08 03:42 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0010_auto_20190708_0022'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='audio', 15 | name='idioma_do_texto', 16 | field=models.CharField(choices=[('de', 'Alemão'), ('ca', 'Catalão'), ('zn-cn', 'Chinês'), ('ko', 'Coreano'), ('es-es', 'Espanhol'), ('fr-fr', 'Francês'), ('en-ca', 'Inglês (CAN)'), ('en-us', 'Inglês (EUA)'), ('en-uk', 'Inglês (UK)'), ('ja', 'Japonês'), ('la', 'Latim'), ('pt-br', 'Português (BR)'), ('pt-pt', 'Português (PT)'), ('ru', 'Russo')], default=('pt-br', 'Português'), max_length=255), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0012_auto_20190708_0932.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-08 12:32 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0011_auto_20190708_0042'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='audio', 15 | name='idioma_do_texto', 16 | field=models.CharField(choices=[('de', 'Alemão'), ('ca', 'Catalão'), ('zn-cn', 'Chinês'), ('ko', 'Coreano'), ('es-es', 'Espanhol'), ('fr-fr', 'Francês'), ('en-ca', 'Inglês (Canadá)'), ('en-us', 'Inglês (EUA)'), ('en-uk', 'Inglês (Reino Unido)'), ('ja', 'Japonês'), ('la', 'Latim'), ('pt-br', 'Português (BR)'), ('pt-pt', 'Português (PT)'), ('ru', 'Russo')], default=('pt-br', 'Português'), max_length=255), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0013_auto_20190708_2113.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-09 00:13 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0012_auto_20190708_0932'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='audio', 15 | old_name='idioma_do_texto', 16 | new_name='idioma', 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /conversor/migrations/0014_auto_20190716_2110.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-17 00:10 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0013_auto_20190708_2113'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='audio', 15 | name='nome_do_arquivo', 16 | ), 17 | migrations.AddField( 18 | model_name='audio', 19 | name='nome', 20 | field=models.CharField(db_column='Nome do arquivo', default='', help_text='Não utilize acento no nome do arquivo.', max_length=255), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /conversor/migrations/0015_auto_20190716_2117.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-07-17 00:17 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('conversor', '0014_auto_20190716_2110'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='audio', 15 | name='nome', 16 | ), 17 | migrations.AddField( 18 | model_name='audio', 19 | name='nome_do_arquivo', 20 | field=models.CharField(default='', help_text='Não utilize acento no nome do arquivo.', max_length=255), 21 | preserve_default=False, 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /conversor/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__init__.py -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0001_initial.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0001_initial.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0002_auto_20190705_1406.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0002_auto_20190705_1406.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0003_auto_20190705_1416.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0003_auto_20190705_1416.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0004_audio_idioma_do_texto.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0004_audio_idioma_do_texto.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0005_auto_20190705_1447.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0005_auto_20190705_1447.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0006_auto_20190705_1454.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0006_auto_20190705_1454.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0007_auto_20190705_1502.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0007_auto_20190705_1502.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0008_auto_20190705_1514.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0008_auto_20190705_1514.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0009_auto_20190707_2127.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0009_auto_20190707_2127.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0010_auto_20190708_0022.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0010_auto_20190708_0022.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0011_auto_20190708_0042.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0011_auto_20190708_0042.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0012_auto_20190708_0932.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0012_auto_20190708_0932.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0013_auto_20190708_2113.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0013_auto_20190708_2113.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0014_auto_20190716_2110.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0014_auto_20190716_2110.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/0015_auto_20190716_2117.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/0015_auto_20190716_2117.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/migrations/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/migrations/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /conversor/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | class Audio(models.Model): 4 | 5 | idiomas = [('de', 'Alemão'), 6 | ('ca', 'Catalão'), 7 | ('zn-cn', 'Chinês'), 8 | ('ko', 'Coreano'), 9 | ('es-es', 'Espanhol'), 10 | ('fr-fr', 'Francês'), 11 | ('en-ca', 'Inglês (Canadá)'), 12 | ('en-us', 'Inglês (EUA)'), 13 | ('en-uk', 'Inglês (Reino Unido)'), 14 | ('ja', 'Japonês'), 15 | ('la', 'Latim'), 16 | ('pt-br', 'Português (BR)'), 17 | ('pt-pt', 'Português (PT)'), 18 | ('ru', 'Russo')] 19 | 20 | nome_do_arquivo = models.CharField(max_length = 255, 21 | help_text = 'Não utilize acento no nome do arquivo.') 22 | 23 | texto = models.TextField() 24 | 25 | idioma = models.CharField( 26 | max_length = 255, 27 | choices = idiomas, 28 | default = ('pt-br', 'Português') 29 | ) 30 | 31 | def __str__(self): 32 | return self.nome_do_arquivo 33 | 34 | -------------------------------------------------------------------------------- /conversor/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import Audio 3 | 4 | class AudioSerializer(serializers.ModelSerializer): 5 | 6 | class Meta: 7 | 8 | model = Audio 9 | fields = '__all__' -------------------------------------------------------------------------------- /conversor/static/css/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | } 5 | 6 | html, body{ 7 | height: 100%; 8 | } 9 | 10 | /* Cabeçalho */ 11 | 12 | .topo{ 13 | width: 100%; 14 | background-color: rgb(50, 50, 50); 15 | padding: 20px; 16 | border-bottom: 4px solid rgb(50, 255, 50); 17 | } 18 | 19 | .topo a:hover{ 20 | text-decoration: none; 21 | } 22 | 23 | .nome{ 24 | box-sizing: border-box; 25 | border: 5px outset; 26 | padding: 1%; 27 | margin: 0 auto; 28 | width: 60%; 29 | font-size: 30px; 30 | font-weight: bold; 31 | font-style: italic; 32 | color: rgb(50, 255, 50); 33 | text-align: center; 34 | letter-spacing: 15px; 35 | } 36 | 37 | .nome:hover{ 38 | border: 5px inset; 39 | } 40 | 41 | 42 | /* Página inicial */ 43 | 44 | .explicacao{ 45 | margin-top: 2.5%; 46 | margin-right: 50%; 47 | margin-bottom: 2.5%; 48 | margin-left: 7.5%; 49 | font-size: 20px; 50 | 51 | } 52 | 53 | /* Formulário principal */ 54 | 55 | div.col-xs-4{ 56 | display: inline-table; 57 | width: 30vw; 58 | } 59 | 60 | /* Botão que gera o áudio */ 61 | 62 | .gerar{ 63 | background-color: rgb(50, 50, 50); 64 | color: rgb(50, 255, 50); 65 | border: 2px solid; 66 | border-radius: 20px; 67 | padding: 8px; 68 | cursor: pointer; 69 | } 70 | 71 | .gerar:hover{ 72 | border: 4px solid;; 73 | } 74 | 75 | .visualizacao{ 76 | margin-left: 4%; 77 | margin-top: 2.5%; 78 | margin-bottom: 2.5%; 79 | } 80 | 81 | .visualizacao p{ 82 | margin-top: 1%; 83 | margin-right: 55%; 84 | margin-bottom: 1.5%; 85 | margin-left: 1.5%; 86 | padding: 5px; 87 | border-left: 3px solid rgb(50, 255, 50); 88 | border-bottom: 2px solid rgb(50, 255, 50); 89 | text-align: left; 90 | font-size: 18px; 91 | } 92 | 93 | .visualizacao a:hover{ 94 | text-decoration: none; 95 | } 96 | 97 | audio { 98 | margin-left: 1%; 99 | } 100 | 101 | #download{ 102 | border: none; 103 | margin-left: 1%; 104 | font-size: 16px; 105 | } 106 | 107 | span.botao{ 108 | margin-top: 2%; 109 | margin-bottom: 2%; 110 | margin-left: 1%; 111 | font-size: 16px; 112 | background-color: rgb(50, 50, 50); 113 | color: rgb(50, 255, 50); 114 | border: 2px solid; 115 | border-radius: 20px; 116 | padding: 8px; 117 | text-align: center; 118 | } 119 | 120 | span.botao:hover{ 121 | border: 4px solid; 122 | } 123 | 124 | 125 | /* Rodapé */ 126 | 127 | footer{ 128 | box-sizing: border-box; 129 | background-color: black; 130 | position: relative; 131 | margin: 5% auto; 132 | padding: 7% 35%; 133 | text-align: center; 134 | margin-bottom: 0px; 135 | } 136 | 137 | footer p{ 138 | line-height: 15px; 139 | color: gray; 140 | } 141 | 142 | footer h2{ 143 | color: gray; 144 | } -------------------------------------------------------------------------------- /conversor/static/icone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversor/static/icone.png -------------------------------------------------------------------------------- /conversor/templates/base.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | {% block title %}{% endblock %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 |
20 | 21 |

Conversor Text-To-Speech

22 |
23 |
24 | 25 | {% block content %}{% endblock %} 26 |
27 | 28 | 29 | 30 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /conversor/templates/conversor/audio.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block title %} Conversor TTS {% endblock %} 4 | 5 | {% block content %} 6 | 7 |
8 | {% for audio in audios %} 9 | 10 |

Nome do arquivo:

11 | 12 |

   {{audio.nome_do_arquivo}}.mp3

13 | 14 |

Texto convertido em áudio ({{audio.get_idioma_display}}):

15 | 16 |

   {{audio.texto}}

17 | 18 | 22 | 23 |

Para baixar o áudio, clique nos 3 pontos do player de áudio e em seguida clique em "Fazer o download".

24 | 25 |
26 | 27 | Gerar novo áudio 28 | 29 |
30 | 31 | {% endfor %} 32 |
33 | 34 | {% endblock %} -------------------------------------------------------------------------------- /conversor/templates/conversor/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load crispy_forms_tags %} 3 | 4 | {% block title %} Conversor TTS {% endblock %} 5 | 6 | {% block content %} 7 | 8 |

Este conversor de texto para áudio gera um arquivo de áudio baseado no texto digitado e o disponibiliza para download no formato MP3.

9 | 10 |
11 |
12 |
13 |
14 |

Texto a ser convertido:

15 |
16 | {% csrf_token %} 17 | {{form|crispy}} 18 | 19 |
20 |
21 |
22 |
23 | 24 |
25 | 26 | {% endblock %} -------------------------------------------------------------------------------- /conversor/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /conversor/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from django.conf.urls import url 3 | from . import views 4 | app_name = 'conversor' 5 | 6 | urlpatterns = [ 7 | path('', views.home, name = 'homepage'), 8 | url('audio/', views.ttsapi.as_view(), name='audio'), 9 | ] 10 | -------------------------------------------------------------------------------- /conversor/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, get_object_or_404, redirect 2 | from django.http import HttpResponse 3 | 4 | from .models import Audio 5 | from .forms import AudioForm 6 | 7 | import os 8 | from gtts import gTTS 9 | 10 | from rest_framework import generics 11 | from .serializers import AudioSerializer 12 | 13 | def home(request): 14 | if request.method == 'POST': 15 | form = AudioForm(request.POST) 16 | if form.is_valid(): 17 | form.save() 18 | audios = Audio.objects.all() 19 | for audio in audios: 20 | arquivo = gTTS(audio.texto, lang = audio.idioma) 21 | arquivo.save('conversor/media/{}.mp3'.format(audio.nome_do_arquivo)) 22 | return render(request, 'conversor/audio.html', {'audios': audios}) 23 | else: 24 | for file in os.listdir('conversor/media'): 25 | if file[-1:-4:-1] == '3pm': 26 | os.remove('conversor/media/{}'.format(file)) 27 | 28 | audios = Audio.objects.all() 29 | for audio in audios: 30 | audio.delete() 31 | 32 | form = AudioForm() 33 | return render(request, 'conversor/index.html', {'form': form}) 34 | 35 | class ttsapi(generics.ListCreateAPIView): 36 | queryset = Audio.objects.all() 37 | serializer_class = AudioSerializer 38 | 39 | 40 | '''def download(request, id): 41 | audio = get_object_or_404(Audio, pk = id) 42 | myfile = open('media/{}.mp3'.format(audio.nome_do_arquivo), 'rb') 43 | response = HttpResponse(myfile, content_type = 'audio/mpeg3') 44 | response['Content-Disposition'] = u"attachment; filename = %s.mp3" % audio.nome_do_arquivo 45 | return response''' 46 | -------------------------------------------------------------------------------- /conversortts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversortts/__init__.py -------------------------------------------------------------------------------- /conversortts/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversortts/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /conversortts/__pycache__/settings.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversortts/__pycache__/settings.cpython-36.pyc -------------------------------------------------------------------------------- /conversortts/__pycache__/urls.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversortts/__pycache__/urls.cpython-36.pyc -------------------------------------------------------------------------------- /conversortts/__pycache__/wsgi.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/conversortts/__pycache__/wsgi.cpython-36.pyc -------------------------------------------------------------------------------- /conversortts/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for conversortts project. 3 | 4 | Generated by 'django-admin startproject' using Django 2.2.2. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.2/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/2.2/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'vmn1i*atat7*e5zm+@kb^efmow^%!&^0&qkqs5p&3hqikyf%n7' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | 'conversor', 41 | 'crispy_forms', 42 | 'rest_framework', 43 | ] 44 | 45 | MIDDLEWARE = [ 46 | 'django.middleware.security.SecurityMiddleware', 47 | 'django.contrib.sessions.middleware.SessionMiddleware', 48 | 'django.middleware.common.CommonMiddleware', 49 | 'django.middleware.csrf.CsrfViewMiddleware', 50 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 51 | 'django.contrib.messages.middleware.MessageMiddleware', 52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 53 | ] 54 | 55 | ROOT_URLCONF = 'conversortts.urls' 56 | 57 | TEMPLATES = [ 58 | { 59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 60 | 'DIRS': [], 61 | 'APP_DIRS': True, 62 | 'OPTIONS': { 63 | 'context_processors': [ 64 | 'django.template.context_processors.debug', 65 | 'django.template.context_processors.request', 66 | 'django.contrib.auth.context_processors.auth', 67 | 'django.contrib.messages.context_processors.messages', 68 | 'django.template.context_processors.media', 69 | ], 70 | }, 71 | }, 72 | ] 73 | 74 | WSGI_APPLICATION = 'conversortts.wsgi.application' 75 | 76 | 77 | # Database 78 | # https://docs.djangoproject.com/en/2.2/ref/settings/#databases 79 | 80 | DATABASES = { 81 | 'default': { 82 | 'ENGINE': 'django.db.backends.sqlite3', 83 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 84 | } 85 | } 86 | 87 | 88 | # Password validation 89 | # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators 90 | 91 | AUTH_PASSWORD_VALIDATORS = [ 92 | { 93 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 94 | }, 95 | { 96 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 97 | }, 98 | { 99 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 100 | }, 101 | { 102 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 103 | }, 104 | ] 105 | 106 | 107 | # Internationalization 108 | # https://docs.djangoproject.com/en/2.2/topics/i18n/ 109 | 110 | LANGUAGE_CODE = 'en-us' 111 | 112 | TIME_ZONE = 'UTC' 113 | 114 | USE_I18N = True 115 | 116 | USE_L10N = True 117 | 118 | USE_TZ = True 119 | 120 | 121 | # Static files (CSS, JavaScript, Images) 122 | # https://docs.djangoproject.com/en/2.2/howto/static-files/ 123 | 124 | STATIC_URL = '/static/' 125 | STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles") 126 | 127 | MEDIA_URL = '/media/' 128 | MEDIA_ROOT = os.path.join(BASE_DIR,"conversor/media") 129 | 130 | CRISPY_TEMPLATE_PACK = 'bootstrap4' 131 | 132 | # Configure Django App for Heroku. 133 | import django_heroku 134 | django_heroku.settings(locals()) -------------------------------------------------------------------------------- /conversortts/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | from django.conf import settings 4 | from django.conf.urls.static import static 5 | 6 | urlpatterns = [ 7 | path('admin/', admin.site.urls), 8 | path('', include('conversor.urls', namespace = 'conversor')) 9 | ] 10 | 11 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 12 | -------------------------------------------------------------------------------- /conversortts/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for conversortts project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'conversortts.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raphaelgibson/conversortts/ec6799d33f60235ecb5298408735264e5344b2b8/db.sqlite3 -------------------------------------------------------------------------------- /debug.log: -------------------------------------------------------------------------------- 1 | [0717/192250.560:ERROR:crash_report_database_win.cc(469)] failed to stat report 2 | [0717/192250.575:ERROR:crash_report_database_win.cc(469)] failed to stat report 3 | [0717/192250.576:ERROR:crash_report_database_win.cc(469)] failed to stat report 4 | [0717/192250.576:ERROR:crash_report_database_win.cc(469)] failed to stat report 5 | [0717/192250.576:ERROR:crash_report_database_win.cc(469)] failed to stat report 6 | [0717/192250.576:ERROR:crash_report_database_win.cc(469)] failed to stat report 7 | [0717/192250.576:ERROR:crash_report_database_win.cc(469)] failed to stat report 8 | [0717/192250.576:ERROR:crash_report_database_win.cc(469)] failed to stat report 9 | [0717/192250.576:ERROR:crash_report_database_win.cc(469)] failed to stat report 10 | [0717/192250.577:ERROR:crash_report_database_win.cc(469)] failed to stat report 11 | [0717/192250.578:ERROR:crash_report_database_win.cc(469)] failed to stat report 12 | [0717/192250.578:ERROR:crash_report_database_win.cc(469)] failed to stat report 13 | [0717/192250.578:ERROR:crash_report_database_win.cc(469)] failed to stat report 14 | [0717/192250.578:ERROR:crash_report_database_win.cc(469)] failed to stat report 15 | [0717/192250.578:ERROR:crash_report_database_win.cc(469)] failed to stat report 16 | [0717/192250.579:ERROR:crash_report_database_win.cc(469)] failed to stat report 17 | [0717/192250.579:ERROR:crash_report_database_win.cc(469)] failed to stat report 18 | [0717/192250.579:ERROR:crash_report_database_win.cc(469)] failed to stat report 19 | [0717/192250.579:ERROR:crash_report_database_win.cc(469)] failed to stat report 20 | [0717/192250.579:ERROR:crash_report_database_win.cc(469)] failed to stat report 21 | [0717/192250.579:ERROR:crash_report_database_win.cc(469)] failed to stat report 22 | [0717/192250.579:ERROR:crash_report_database_win.cc(469)] failed to stat report 23 | [0717/192250.579:ERROR:crash_report_database_win.cc(469)] failed to stat report 24 | [0717/192250.580:ERROR:crash_report_database_win.cc(469)] failed to stat report 25 | [0717/192250.580:ERROR:crash_report_database_win.cc(469)] failed to stat report 26 | [0717/192250.580:ERROR:crash_report_database_win.cc(469)] failed to stat report 27 | [0717/192250.580:ERROR:crash_report_database_win.cc(469)] failed to stat report 28 | [0717/192250.580:ERROR:crash_report_database_win.cc(469)] failed to stat report 29 | [0717/192250.580:ERROR:crash_report_database_win.cc(469)] failed to stat report 30 | [0717/192250.580:ERROR:crash_report_database_win.cc(469)] failed to stat report 31 | [0717/192250.580:ERROR:crash_report_database_win.cc(469)] failed to stat report 32 | [0717/192250.580:ERROR:crash_report_database_win.cc(469)] failed to stat report 33 | [0717/192250.581:ERROR:crash_report_database_win.cc(469)] failed to stat report 34 | [0717/192250.581:ERROR:crash_report_database_win.cc(469)] failed to stat report 35 | [0717/192250.581:ERROR:crash_report_database_win.cc(469)] failed to stat report 36 | [0717/192250.581:ERROR:crash_report_database_win.cc(469)] failed to stat report 37 | [0717/192250.581:ERROR:crash_report_database_win.cc(469)] failed to stat report 38 | [0717/192250.581:ERROR:crash_report_database_win.cc(469)] failed to stat report 39 | [0717/192250.581:ERROR:crash_report_database_win.cc(469)] failed to stat report 40 | [0717/192250.581:ERROR:crash_report_database_win.cc(469)] failed to stat report 41 | [0717/192250.581:ERROR:crash_report_database_win.cc(469)] failed to stat report 42 | [0717/192250.582:ERROR:crash_report_database_win.cc(469)] failed to stat report 43 | [0717/192250.582:ERROR:crash_report_database_win.cc(469)] failed to stat report 44 | [0717/192250.582:ERROR:crash_report_database_win.cc(469)] failed to stat report 45 | [0717/192250.582:ERROR:crash_report_database_win.cc(469)] failed to stat report 46 | [0717/192250.582:ERROR:crash_report_database_win.cc(469)] failed to stat report 47 | [0717/192250.582:ERROR:crash_report_database_win.cc(469)] failed to stat report 48 | [0717/192250.582:ERROR:crash_report_database_win.cc(469)] failed to stat report 49 | [0717/192250.582:ERROR:crash_report_database_win.cc(469)] failed to stat report 50 | [0717/192250.583:ERROR:crash_report_database_win.cc(469)] failed to stat report 51 | [0717/192250.583:ERROR:crash_report_database_win.cc(469)] failed to stat report 52 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'conversortts.settings') 9 | try: 10 | from django.core.management import execute_from_command_line 11 | except ImportError as exc: 12 | raise ImportError( 13 | "Couldn't import Django. Are you sure it's installed and " 14 | "available on your PYTHONPATH environment variable? Did you " 15 | "forget to activate a virtual environment?" 16 | ) from exc 17 | execute_from_command_line(sys.argv) 18 | 19 | 20 | if __name__ == '__main__': 21 | main() 22 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | beautifulsoup4==4.7.1 2 | bs4==0.0.1 3 | certifi==2019.6.16 4 | chardet==3.0.4 5 | Click==7.0 6 | dj-database-url==0.5.0 7 | Django==2.2.13 8 | django-crispy-forms==1.7.2 9 | django-heroku==0.3.1 10 | djangorestframework==3.10.1 11 | gTTS==2.0.3 12 | gTTS-token==1.1.3 13 | gunicorn==19.9.0 14 | idna==2.8 15 | psycopg2==2.8.3 16 | pytz==2019.1 17 | requests==2.22.0 18 | six==1.12.0 19 | soupsieve==1.9.2 20 | sqlparse==0.3.0 21 | style==1.1.0 22 | update==0.0.1 23 | urllib3==1.25.3 24 | whitenoise==4.1.2 25 | --------------------------------------------------------------------------------