From 46c83b401aef9700e1827a14b2fd531505d7d0ee Mon Sep 17 00:00:00 2001 From: pliny <133052465+elder-plinius@users.noreply.github.com> Date: Sat, 25 May 2024 11:28:04 -0400 Subject: [PATCH] Initial commit --- .env.example | 7 + LICENSE | 201 +++++++++++++++++++++++ README.md | 1 + elevenlabs.py | 35 ++++ elevenlabs_library.py | 368 ++++++++++++++++++++++++++++++++++++++++++ gemini_chat.py | 37 +++++ openai_chat.py | 34 ++++ openai_vision.py | 50 ++++++ 8 files changed, 733 insertions(+) create mode 100644 .env.example create mode 100644 LICENSE create mode 100644 README.md create mode 100644 elevenlabs.py create mode 100644 elevenlabs_library.py create mode 100644 gemini_chat.py create mode 100644 openai_chat.py create mode 100644 openai_vision.py diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9690588 --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +# .env file +GEMINI_API_KEY=your_gemini_api_key_here +OPENAI_API_KEY=your_openai_api_key_here +ELEVENLABS_API_KEY-your-key-here + +#INPUTS_PATH=./inputs +#OUTPUTS_PATH=./outputs diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1b2e585 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Template for AI Projects diff --git a/elevenlabs.py b/elevenlabs.py new file mode 100644 index 0000000..3b13fcb --- /dev/null +++ b/elevenlabs.py @@ -0,0 +1,35 @@ +import requests + +class ElevenLabsClient: + def __init__(self, api_key): + self.api_key = api_key + self.base_url = "https://api.elevenlabs.io/v1/text-to-speech/" + + def generate_voice_audio(self, text, voice_id, model_id="eleven_monolingual_v1", voice_settings=None): + """ + Generates voice audio from text using ElevenLabs API. + + :param text: Text to convert to speech. + :param voice_id: ID of the ElevenLabs voice to use. + :param model_id: ID of the model to use for speech synthesis. + :param voice_settings: Additional settings for voice modulation. + :return: The binary content of the generated audio file, or None if an error occurred. + """ + headers = { + "Content-Type": "application/json", + "xi-api-key": self.api_key + } + + data = { + "text": text, + "model_id": model_id, + "voice_settings": voice_settings if voice_settings else {} + } + + response = requests.post(f"{self.base_url}{voice_id}", json=data, headers=headers) + + if response.status_code == 200: + return response.content + else: + print(f"Failed to generate audio: {response.text}") + return None diff --git a/elevenlabs_library.py b/elevenlabs_library.py new file mode 100644 index 0000000..006c4b3 --- /dev/null +++ b/elevenlabs_library.py @@ -0,0 +1,368 @@ +elevenlabs_voice_library = { + "21m00Tcm4TlvDq8ikWAM": { + "labels": { + "accent": "american", + "description": "calm", + "age": "young", + "gender": "female", + } + }, + "29vD33N1CtxCmqQRPOHJ": { + "labels": { + "accent": "american", + "description": "well-rounded", + "age": "middle aged", + "gender": "male", + } + }, + "2EiwWnXFnvU5JabPnv8n": { + "labels": { + "accent": "american", + "description": "war veteran", + "age": "middle aged", + "gender": "male", + } + }, + "5Q0t7uMcjvnagumLfvZi": { + "labels": { + "accent": "american", + "description": "ground reporter", + "age": "middle aged", + "gender": "male", + } + }, + "AZnzlk1XvdvUeBnXmlld": { + "labels": { + "accent": "american", + "description": "strong", + "age": "young", + "gender": "female", + } + }, + "CYw3kZ02Hs0563khs1Fj": { + "labels": { + "accent": "british-essex", + "description": "conversational", + "age": "young", + "gender": "male", + } + }, + "D38z5RcWu1voky8WS1ja": { + "labels": { + "accent": "irish", + "description": "sailor", + "age": "old", + "gender": "male", + } + }, + "EXAVITQu4vr4xnSDxMaL": { + "labels": { + "accent": "american", + "description": "soft", + "age": "young", + "gender": "female", + } + }, + "ErXwobaYiN019PkySvjV": { + "labels": { + "accent": "american", + "description": "well-rounded", + "age": "young", + "gender": "male", + } + }, + "GBv7mTt0atIp3Br8iCZE": { + "labels": { + "accent": "american", + "description": "calm", + "age": "young", + "gender": "male", + } + }, + "IKne3meq5aSn9XLyUdCD": { + "labels": { + "accent": "australian", + "description": "casual", + "age": "middle aged", + "gender": "male", + } + }, + "JBFqnCBsd6RMkjVDRZzb": { + "labels": { + "accent": "british", + "description": "raspy", + "age": "middle aged", + "gender": "male", + } + }, + "LcfcDJNUP1GQjkzn1xUU": { + "labels": { + "accent": "american", + "description": "calm", + "age": "young", + "gender": "female", + } + }, + "MF3mGyEYCl7XYWbV9V6O": { + "labels": { + "accent": "american", + "description": "emotional", + "age": "young", + "gender": "female", + } + }, + "N2lVS1w4EtoT3dr4eOWO": { + "labels": { + "accent": "american", + "description": "hoarse", + "age": "middle aged", + "gender": "male", + } + }, + "ODq5zmih8GrVes37Dizd": { + "labels": { + "accent": "american", + "description": "shouty", + "age": "middle aged", + "gender": "male", + } + }, + "SOYHLrjzK2X1ezoPC6cr": { + "labels": { + "accent": "american", + "description": "anxious", + "age": "young", + "gender": "male", + } + }, + "TX3LPaxmHKxFdv7VOQHJ": { + "labels": { + "accent": "american", + "age": "young", + "gender": "male", + "description": "neutral", + } + }, + "ThT5KcBeYPX3keUQqHPh": { + "labels": { + "accent": "british", + "description": "pleasant", + "age": "young", + "gender": "female", + "use_case": "children's stories", + } + }, + "TxGEqnHWrfWFTfGW9XjX": { + "labels": { + "accent": "american", + "description": "deep", + "age": "young", + "gender": "male", + } + }, + "VR6AewLTigWG4xSOukaG": { + "labels": { + "accent": "american", + "description": "crisp", + "age": "middle aged", + "gender": "male", + } + }, + "XB0fDUnXU5powFXDhCwa": { + "labels": { + "accent": "english-swedish", + "description": "seductive", + "age": "middle aged", + "gender": "female", + "use_case": "video games", + } + }, + "XrExE9yKIg1WjnnlVkGX": { + "labels": { + "accent": "american", + "description": "warm", + "age": "young", + "gender": "female", + "use_case": "audiobook", + } + }, + "Yko7PKHZNXotIFUBG7I9": { + "labels": { + "accent": "british", + "age": "middle aged", + "gender": "male", + "description": "calm", + "use_case": "audiobook", + } + }, + "ZQe5CZNOzWyzPSCn5a3c": { + "labels": { + "accent": "australian", + "description": "calm", + "age": "old", + "gender": "male", + "use_case": "news", + } + }, + "Zlb1dXrM653N07WRdFW3": { + "labels": { + "accent": "british", + "age": "middle aged", + "gender": "male", + "description": "ground reporter", + "use_case": "news", + } + }, + "bVMeCyTHy58xNoL34h3p": { + "labels": { + "accent": "american-irish", + "description": "excited", + "age": "young", + "gender": "male", + } + }, + "flq6f7yk4E4fJM5XTYuZ": { + "labels": { + "accent": "american", + "age": "old", + "gender": "male", + "description": "orotund", + "use_case": "audiobook", + } + }, + "g5CIjZEefAph4nQFvHAz": { + "labels": { + "accent": "american", + "age": "young", + "gender": "male", + "description": "whisper", + "use_case": "ASMR", + } + }, + "jBpfuIE2acCO8z3wKNLl": { + "labels": { + "accent": "american", + "description": "childlish", + "age": "young", + "gender": "female", + "use_case": "animation", + } + }, + "jsCqWAovK2LkecY7zXl4": { + "labels": { + "accent": "american", + "age": "young", + "gender": "female", + "description": "overhyped", + "use_case": "video games", + } + }, + "oWAxZDx7w5VEj9dCyTzz": { + "labels": { + "accent": "american-southern", + "age": "young", + "gender": "female", + "description": "gentle", + "use_case": "audiobook", + } + }, + "onwK4e9ZLuTAKqWW03F9": { + "labels": { + "accent": "british", + "description": "deep", + "age": "middle aged", + "gender": "male", + "use_case": "news presenter", + } + }, + "pFZP5JQG7iQjIQuC4Bku": { + "labels": { + "accent": "british", + "description": "raspy", + "age": "middle aged", + "gender": "female", + "use_case": "narration", + } + }, + "pMsXgVXv3BLzUgSXRplE": { + "labels": { + "accent": "american", + "description": "pleasant", + "age": "middle aged", + "gender": "female", + "use_case": "interactive", + } + }, + "pNInz6obpgDQGcFmaJgB": { + "labels": { + "accent": "american", + "description": "deep", + "age": "middle aged", + "gender": "male", + "use_case": "narration", + } + }, + "piTKgcLEGmPE4e6mEKli": { + "labels": { + "accent": "american", + "description": "whisper", + "age": "young", + "gender": "female", + "use_case": "audiobook", + } + }, + "pqHfZKP75CvOlQylNhV4": { + "labels": { + "accent": "american", + "description": "strong", + "age": "middle aged", + "gender": "male", + "use_case": "documentary", + } + }, + "t0jbNlBVZ17f02VDIeMI": { + "labels": { + "accent": "american", + "description": "raspy", + "age": "old", + "gender": "male", + "use_case": "video games", + } + }, + "yoZ06aMxZJJ28mfd3POQ": { + "labels": { + "accent": "american", + "description": "raspy", + "age": "young", + "gender": "male", + "use_case": "narration", + } + }, + "z9fAnlkpzviPz146aGWa": { + "labels": { + "accent": "american", + "description": "witch", + "age": "middle aged", + "gender": "female", + "use_case": "video games", + } + }, + "zcAOhNBS3c14rBihAFp1": { + "labels": { + "accent": "english-italian", + "description": "foreigner", + "age": "young", + "gender": "male", + "use_case": "audiobook", + } + }, + "zrHiDhphv9ZnVXBqCLjz": { + "labels": { + "accent": "english-swedish", + "description": "childish", + "age": "young", + "gender": "female", + "use_case": "animation", + } + }, +} diff --git a/gemini_chat.py b/gemini_chat.py new file mode 100644 index 0000000..2e30c4c --- /dev/null +++ b/gemini_chat.py @@ -0,0 +1,37 @@ +import os +from dotenv import load_dotenv +import google.generativeai as genai + +# Load environment variables +load_dotenv() +GOOGLE_API_KEY = os.getenv('GOOGLE_API_KEY') +class GeminiChat: + def __init__(self): + # Retrieve the API key from an environment variable + api_key = GOOGLE_API_KEY + if not api_key: + raise ValueError("Google API key not found in environment variables.") + + genai.configure(api_key=api_key) + self.model = genai.GenerativeModel('gemini-pro') + + def send_message(self, prompt, temp=0.2, top_p=1.0): + """ + Send a message to the Gemini model with specified temperature and top probability. + """ + try: + generation_config = genai.types.GenerationConfig(temperature=temp, top_p=top_p) + response = self.model.generate_content(prompt, generation_config=generation_config) + return response.text.strip() + except Exception as e: + print(f"Error in generating response: {e}") + return None + +# Example usage +if __name__ == "__main__": + gemini_chat = GeminiChat() + response = gemini_chat.send_message("Hello, Gemini! How are you today?", temp=0.7, top_p=0.9) + if response: + print("Gemini's response:", response) + else: + print("Failed to get response from Gemini.") diff --git a/openai_chat.py b/openai_chat.py new file mode 100644 index 0000000..af1c8e4 --- /dev/null +++ b/openai_chat.py @@ -0,0 +1,34 @@ +import openai +import os + +# Ensure your OPENAI_API_KEY is set in your environment variables +openai.api_key = os.getenv("OPENAI_API_KEY") + +def generate_ai_text(prompt: str, temperature: float) -> str: + """ + Generates text based on the provided prompt using OpenAI's GPT-4 preview model. + + :param prompt: The prompt to send to the model. + :param temperature: The temperature to use for the generation. Lower means more deterministic. + :return: The generated text as a string. + """ + try: + response = openai.chat.completions.create( + model="gpt-4-0125-preview", + messages=[ + {"role": "system", "content": f"Temperature: {temperature}"}, + {"role": "user", "content": prompt}, + ], + max_tokens=3000, + stop=None, + temperature=temperature + ) + return response.choices[0].message.content.strip() + except Exception as e: + print(f"An error occurred: {e}") + return "Error generating text." + +if __name__ == "__main__": + # Test the function with a sample prompt + test_prompt = "Tell me a story about a robot learning to love." + print(generate_ai_text(test_prompt, 0.7)) diff --git a/openai_vision.py b/openai_vision.py new file mode 100644 index 0000000..811c073 --- /dev/null +++ b/openai_vision.py @@ -0,0 +1,50 @@ +import base64 +import openai +import os + +class OpenAIVision: + def __init__(self): + # Ensure your OpenAI API key is set in the environment variables + self.api_key = os.getenv("OPENAI_API_KEY") + if not self.api_key: + raise ValueError("The OPENAI_API_KEY environment variable has not been set.") + openai.api_key = self.api_key + + @staticmethod + def encode_image_to_base64(image_path): + with open(image_path, "rb") as image_file: + return base64.b64encode(image_file.read()).decode('utf-8') + + def analyze_image(self, image_path): + """ + Analyze an image and return the model's description or analysis. + + :param image_path: Path to the image file + :return: Description or analysis of the image + """ + base64_image = self.encode_image_to_base64(image_path) + + try: + response = openai.chat.completions.create( + model="gpt-4-vision-preview", + messages=[ + { + "role": "user", + "content": [ + {"type": "text", "text": "Analyze this image"}, + {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}} + ] + } + ], + max_tokens=3000 + ) + return response.choices[0].message.content + except Exception as e: + print(f"An error occurred: {e}") + return None + +if __name__ == "__main__": + vision_model = OpenAIVision() + image_path = "image0.jpeg" # Replace with the path to your image + description = vision_model.analyze_image(image_path) + print(description)