diff --git a/companion.py b/companion.py index 88e96d4..7c35af1 100644 --- a/companion.py +++ b/companion.py @@ -23,7 +23,7 @@ memory: Optional[Memory] = None chatbot: Optional[Chatbot] = None app_cache = AppCache() -voices_by_features = dict() +voices_by_features = {} @app.route('/') def home(): @@ -63,44 +63,42 @@ def setup(): """ Web page, setup page """ - if request.method == 'POST': - filename = request.form.get('filename') - data = { - "model": { - "name": request.form.get('model-name'), - "temperature": float(request.form.get('temperature')) - }, - "user": { - "name": request.form.get('user-name'), - "image": request.form.get('profile-img-url'), - "gender": request.form.get('gender') - }, - "bot": { - "name": request.form.get('tutor').split("-")[0], - "image": f"/static/bots_profile/{request.form.get('tutor').split('-')[0].lower()}.png", - "gender": request.form.get('tutor').split("-")[1].lower(), - "voice": request.form.get('voices-dropdown') - }, - "language": { - "native": request.form.get('user-lang-dropdown').lower(), - "learning": request.form.get('tutor-lang-dropdown').split("-")[0].lower(), - "level": request.form.get('lang-level') - }, - "behavior": { - "auto_send_recording": bool(request.form.get('auto-send-switch')) - } - } - with open(os.path.join(os.getcwd(), filename), 'w') as outfile: - yaml.dump(data, outfile, allow_unicode=True) - return jsonify({'status': 'success'}) - - else: + if request.method != 'POST': return render_template('setup.html', males=MALE_TUTORS, females=FEMALE_TUTORS, input_languages_codes_and_names=[[language.language_name_to_iso6391(lang), lang] for lang in INPUT_LANGUAGES], output_languages_locales_and_names=[[k, language.locale_code_to_language(k, name_in_same_language=True)] for k in voices_by_features.keys()] ) + filename = request.form.get('filename') + data = { + "model": { + "name": request.form.get('model-name'), + "temperature": float(request.form.get('temperature')) + }, + "user": { + "name": request.form.get('user-name'), + "image": request.form.get('profile-img-url'), + "gender": request.form.get('gender') + }, + "bot": { + "name": request.form.get('tutor').split("-")[0], + "image": f"/static/bots_profile/{request.form.get('tutor').split('-')[0].lower()}.png", + "gender": request.form.get('tutor').split("-")[1].lower(), + "voice": request.form.get('voices-dropdown') + }, + "language": { + "native": request.form.get('user-lang-dropdown').lower(), + "learning": request.form.get('tutor-lang-dropdown').split("-")[0].lower(), + "level": request.form.get('lang-level') + }, + "behavior": { + "auto_send_recording": bool(request.form.get('auto-send-switch')) + } + } + with open(os.path.join(os.getcwd(), filename), 'w') as outfile: + yaml.dump(data, outfile, allow_unicode=True) + return jsonify({'status': 'success'}) @app.route('/get_language_voices', methods=['POST']) @@ -140,7 +138,7 @@ def get_response(): app_cache.message_generator = chatbot.get_response(is_initial_message) app_cache.last_sentence = '' app_cache.sentences_counter = 0 - app_cache.bot_recordings = list() + app_cache.bot_recordings = [] first_message = next(app_cache.message_generator) app_cache.generated_message = first_message except Exception as e: @@ -269,8 +267,7 @@ def play_user_message(): Play user recording if exists """ message_id = int(request.form['message_id'].split('_')[1]) - user_recording = memory[message_id]['user_recording'] - if user_recording: + if user_recording := memory[message_id]['user_recording']: app_cache.play_recordings_queue.put(user_recording) return jsonify({'message': 'User message played successfully'}) @@ -308,10 +305,10 @@ def save_session(): """ Save current session as file """ - data = list() - for m in memory.get_chat_history()[1:]: - data.append({"role": m["role"], "content": m["content"]}) - + data = [ + {"role": m["role"], "content": m["content"]} + for m in memory.get_chat_history()[1:] + ] json_data = json.dumps(data, indent=4) # Convert the list of dictionaries to JSON format with open(SAVED_SESSION_FILE, "w") as f: diff --git a/python/app_cache.py b/python/app_cache.py index 332ed96..a782766 100644 --- a/python/app_cache.py +++ b/python/app_cache.py @@ -3,6 +3,8 @@ from typing import Generator, List, Optional + + class AppCache: """ Used to save data which needs to transfer between different threads and endpoints @@ -10,8 +12,8 @@ class AppCache: message_generator: Optional[Generator] = None language: Optional[str] = None user_recording: Optional[str] = None - bot_recordings: List[str] = list() - server_errors: List[str] = list() + bot_recordings: List[str] = [] + server_errors: List[str] = [] sentences_counter: int = 0 generated_message: str = '' last_sentence: str = '' diff --git a/python/memory.py b/python/memory.py index 24f1613..1af0d7e 100644 --- a/python/memory.py +++ b/python/memory.py @@ -7,8 +7,8 @@ class Memory: This class is used to remember all messages sent and received, along with metadata such as recording files, etc. """ def __init__(self): - self._memory: List[dict] = list() - self._updates: List[dict] = list() + self._memory: List[dict] = [] + self._updates: List[dict] = [] def __getitem__(self, index): return self._memory[index] @@ -33,13 +33,18 @@ def add(self, role, message, recording=None, user_recording=None) -> None: :param user_recording: a file name of the user's recording """ message = re.sub(r'[^\S\n]+', ' ', message) - mem = {"role": role, "content": message, "recording": recording or list(), "user_recording": user_recording} + mem = { + "role": role, + "content": message, + "recording": recording or [], + "user_recording": user_recording, + } updates = [u.copy() for u in self._updates] updates = [u for u in updates if u["index"] == len(self._memory)] [u.pop("index") for u in updates] for u in updates: u["recording"] = u["recording"] or [] - mem.update(u) + mem |= u self._memory.append(mem) def update(self, index, **kwargs) -> None: diff --git a/python/speech.py b/python/speech.py index e37110e..78bfe3f 100644 --- a/python/speech.py +++ b/python/speech.py @@ -143,7 +143,7 @@ def voices_by_features() -> Dict[str, Dict[str, List[str]]]: :return: Dict: {lang: {gender: [list of voices]}} """ - voices_dict = dict() + voices_dict = {} voices = t2s_client.list_voices().voices for voice in voices: @@ -153,11 +153,11 @@ def voices_by_features() -> Dict[str, Dict[str, List[str]]]: for language_code in language_codes: if language_code not in voices_dict: - voices_dict[language_code] = dict() + voices_dict[language_code] = {} lang_dict = voices_dict[language_code] if gender not in lang_dict: - lang_dict[gender] = list() + lang_dict[gender] = [] lang_dict[gender].append(name) diff --git a/python/utils.py b/python/utils.py index 5bab5b1..2eed2aa 100644 --- a/python/utils.py +++ b/python/utils.py @@ -19,24 +19,20 @@ def split_to_sentences(text: str) -> List[str]: :param text: the text to split """ - characters = [c+' ' for c in ['.', '!', "?", ":", ";"]] + characters = [f'{c} ' for c in ['.', '!', "?", ":", ";"]] escaped_characters = [re.escape(c) for c in characters] - if any([c in text for c in characters]): + if any(c in text for c in characters): pattern = '|'.join(escaped_characters) - split_list = re.split(pattern, text) + return re.split(pattern, text) elif '\n' in text: lst = text.split('\n') lst = [s for s in lst if len(s.strip()) > 0] - if len(lst) > 1: - split_list = [lst[0], "\n".join(lst[1:])] - else: - split_list = lst + return [lst[0], "\n".join(lst[1:])] if len(lst) > 1 else lst elif ', ' in text and len(text) > 100: lst = re.split(re.escape(',') + r'\s', text) - split_list = [lst[0], ", ".join(lst[1:])] + return [lst[0], ", ".join(lst[1:])] else: - split_list = [text] - return split_list + return [text] def bot_text_to_speech(text: str, message_index: int, counter: int) -> str: @@ -72,12 +68,11 @@ def get_gcs_credentials(config: Config) -> Credentials: :param config: Config :return: Credentials """ - sa = config.get("google_sa", None) - if sa: - credentials = Credentials.from_service_account_info(sa) - else: - credentials = None - return credentials + return ( + Credentials.from_service_account_info(sa) + if (sa := config.get("google_sa", None)) + else None + ) def get_error_message_from_exception(e: Exception) -> str: