Skip to content

Commit 98501ba

Browse files
committed
refactor code to make bigger application
1 parent d2370d9 commit 98501ba

14 files changed

+179
-154
lines changed

.github/workflows/lint.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ jobs:
2121
pip install flake8
2222
2323
- name: Run Flake8
24-
run: flake8 --config backend/.flake8
24+
run: flake8

backend/.flake8

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
[flake8]
2-
exclude = versions
2+
exclude =
3+
# No need to traverse our git directory
4+
.git,
5+
# There's no value in checking cache directories
6+
__pycache__,
7+
# The conf file is mostly autogenerated, ignore it
8+
docs/source/conf.py,
9+
# The old directory contains Flake8 2.0
10+
old,
11+
# This contains our built documentation
12+
build,
13+
# This contains builds of flake8 that we don't want to check
14+
dist
15+
# This contains packages we have installed
16+
.venv
317
ignore =
418
# E121: continuation line under-indented for hanging indent.
519
E121,

backend/app/__init__.py

Whitespace-only changes.

backend/app/dependencies.py

Whitespace-only changes.

backend/app/internal/config.py

Whitespace-only changes.

backend/app/scripts/lint_python.sh

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/bin/bash
2+
# Run flake8 excluding the venv directory
3+
echo "Running flake8..."
4+
flake8 --exclude=.venv

backend/app/utils/database.py

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import json
2+
import random
3+
4+
# Save messages for retrieval later on
5+
6+
7+
def get_recent_messages():
8+
9+
# Define the file name
10+
file_name = "stored_data.json"
11+
learn_instruction = {"role": "system",
12+
"content": """You are a Spanish teacher and your name is Rachel,
13+
the user is called Shaun. Keep responses under 20 words."""}
14+
15+
# Initialize messages
16+
messages = []
17+
18+
# Add Random Element
19+
x = random.uniform(0, 1)
20+
if x < 0.2:
21+
learn_instruction["content"] = learn_instruction["content"] + \
22+
"Your response will have some light humour. "
23+
elif x < 0.5:
24+
learn_instruction["content"] = learn_instruction["content"] + \
25+
"Your response will include an interesting new fact about Spain. "
26+
else:
27+
learn_instruction["content"] = learn_instruction["content"] + \
28+
"Your response will recommend another word to learn. "
29+
30+
# Append instruction to message
31+
messages.append(learn_instruction)
32+
33+
# Get last messages
34+
try:
35+
with open(file_name) as user_file:
36+
data = json.load(user_file)
37+
38+
# Append last 5 rows of data
39+
if data:
40+
if len(data) < 5:
41+
for item in data:
42+
messages.append(item)
43+
else:
44+
for item in data[-5:]:
45+
messages.append(item)
46+
except Exception as e:
47+
return e
48+
49+
# Return messages
50+
return messages
51+
52+
53+
# Save messages for retrieval later on
54+
def store_messages(request_message, response_message):
55+
56+
# Define the file name
57+
file_name = "stored_data.json"
58+
59+
# Get recent messages
60+
messages = get_recent_messages()[1:]
61+
62+
# Add messages to data
63+
user_message = {"role": "user", "content": request_message}
64+
assistant_message = {"role": "assistant", "content": response_message}
65+
messages.append(user_message)
66+
messages.append(assistant_message)
67+
68+
# Save the updated file
69+
with open(file_name, "w") as f:
70+
json.dump(messages, f)
71+
72+
73+
# Save messages for retrieval later on
74+
def reset_messages():
75+
76+
# Define the file name
77+
file_name = "stored_data.json"
78+
79+
# Write an empty file
80+
open(file_name, "w")

backend/app/utils/openai_requests.py

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import openai
2+
from decouple import config
3+
4+
from backend.app.utils.database import get_recent_messages
5+
6+
openai.organization = config("OPENAI_ORG")
7+
openai.api_key = config("OPENAI_API_KEY")
8+
9+
10+
# Open AI - Whisper
11+
# Convert audio to text
12+
def convert_audio_to_text(audio_file):
13+
try:
14+
transcript = openai.Audio.transcribe("whisper-1", audio_file)
15+
message_text = transcript["text"]
16+
return message_text
17+
except Exception as e:
18+
return e
19+
20+
# Open AI - Chat GPT
21+
# Convert audio to text
22+
23+
24+
def get_chat_response(message_input):
25+
26+
messages = get_recent_messages()
27+
user_message = {"role": "user", "content": message_input +
28+
"""Only say two or 3 words in Spanish if speaking in Spanish.
29+
The remaining words should be in English"""}
30+
messages.append(user_message)
31+
print(messages)
32+
33+
try:
34+
response = openai.ChatCompletion.create(
35+
model="gpt-3.5-turbo",
36+
messages=messages
37+
)
38+
message_text = response["choices"][0]["message"]["content"]
39+
return message_text
40+
except Exception as e:
41+
return e

backend/app/utils/text_to_speech.py

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import requests
2+
from decouple import config
3+
4+
ELEVEN_LABS_API_KEY = config("ELEVEN_LABS_API_KEY")
5+
6+
7+
def convert_text_to_speech(message):
8+
body = {
9+
"text": message,
10+
"voice_settings": {
11+
"stability": 0,
12+
"similarity_boost": 0
13+
}
14+
}
15+
16+
voice_rachel = "21m00Tcm4TlvDq8ikWAM"
17+
18+
# Construct request headers and url
19+
headers = {"xi-api-key": ELEVEN_LABS_API_KEY,
20+
"Content-Type": "application/json", "accept": "audio/mpeg"}
21+
endpoint = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_rachel}"
22+
23+
try:
24+
response = requests.post(endpoint, json=body, headers=headers)
25+
except Exception as e:
26+
return e
27+
28+
if response.status_code == 200:
29+
return response.content
30+
else:
31+
return

backend/functions/database.py

-76
This file was deleted.

backend/functions/openai_requests.py

-37
This file was deleted.

backend/functions/stored_data.json

-1
This file was deleted.

backend/functions/text_to_speech.py

-33
This file was deleted.

backend/main.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import openai
2-
from fastapi import Depends, FastAPI, File, HTTPException, UploadFile
1+
from fastapi import FastAPI, File, HTTPException, UploadFile
32
from fastapi.middleware.cors import CORSMiddleware
43
from fastapi.responses import StreamingResponse
5-
from functions.database import reset_messages, store_messages
6-
from functions.openai_requests import convert_audio_to_text, get_chat_response
7-
from functions.text_to_speech import convert_text_to_speech
4+
5+
from backend.app.utils.database import reset_messages, store_messages
6+
from backend.app.utils.openai_requests import convert_audio_to_text, get_chat_response
7+
from backend.app.utils.text_to_speech import convert_text_to_speech
88

99
app = FastAPI()
1010

@@ -29,6 +29,7 @@
2929
def hello():
3030
return {'data': 'hello'}
3131

32+
3233
@app.get('/set')
3334
def set():
3435
reset_messages()
@@ -60,6 +61,7 @@ async def post_audio(file: UploadFile = File(...)):
6061

6162
if not audio_output:
6263
raise HTTPException(status_code=400, detail="Failed audio output")
64+
6365
def iterfile():
6466
yield audio_output
6567

0 commit comments

Comments
 (0)