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 1/7] 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) From dc3ed0099d45420d8edc92ee0916ade7675c3275 Mon Sep 17 00:00:00 2001 From: pliny <133052465+elder-plinius@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:56:59 -0500 Subject: [PATCH 2/7] Add files via upload --- README.md | 61 ++++++++++++++- index.html | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++ script.js | 137 ++++++++++++++++++++++++++++++++ styles.css | 178 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 601 insertions(+), 1 deletion(-) create mode 100644 index.html create mode 100644 script.js create mode 100644 styles.css diff --git a/README.md b/README.md index 1b2e585..b5cd4ed 100644 --- a/README.md +++ b/README.md @@ -1 +1,60 @@ -Template for AI Projects +# R00TS - Plant the Seeds of Artificial Intelligence + +R00TS is an interactive web application that allows users to contribute words they believe should be important in future artificial intelligence understanding. The application visualizes these contributions in a dynamic word cloud, with more frequently submitted words appearing larger. + +## About R00TS + +The concept behind R00TS is to create a collective "garden" of words that people from around the world can contribute to - essentially "planting seeds" of vocabulary that will grow in the consciousness of future AI systems. + +While the current implementation uses client-side storage for demonstration purposes, the concept could be expanded to a global database where everyone's contributions help shape a collective understanding of what words humans believe are important for AI to comprehend. + +## Features + +- Submit words to the AI vocabulary garden +- See a real-time word cloud of all submitted words +- Green-themed visualization representing growth and roots +- Statistics showing total contributions and unique words +- Responsive design that works on mobile and desktop + +## How It Works + +1. Users enter words they want future AI to understand deeply +2. The word is "planted" in the collection (currently stored in browser localStorage) +3. The word cloud updates to show all planted words, with size based on frequency +4. Statistics about planted words are displayed + +## Technical Implementation + +- Pure HTML, CSS, and JavaScript +- Uses D3.js for the word cloud visualization +- Bootstrap for responsive styling +- No backend required (uses client-side storage for demonstration) + +## Running Locally + +Simply open `index.html` in a web browser. No server required. + +## Future Enhancements + +- Server-side storage for global word collection +- User accounts to track individual contributions +- Regional visualizations to see how word importance varies by culture +- Sentiment analysis of submitted words +- Category tagging for submitted words +- Social sharing functionality + +## Repository Structure + +- `/SYSTEM PROMPTS` - Collection of AI system prompts for reference +- `index.html` - Main application page +- `script.js` - JavaScript functionality +- `styles.css` - CSS styling +- `README.md` - This documentation file + +## Philosophical Background + +R00TS represents the idea that humans can collectively influence the development of artificial intelligence by contributing the concepts they believe are most important for AI to understand. It's a metaphorical way of "planting seeds" in the AI consciousness, helping to shape how future systems might prioritize and understand human values and language. + +## Disclaimer + +This is a conceptual demonstration project. In actual AI training, much more sophisticated approaches are used. This project is meant to be thought-provoking rather than technically accurate to real AI training methodologies. \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..fdd25be --- /dev/null +++ b/index.html @@ -0,0 +1,226 @@ + + + + + + R00TS - AI Word Seeding + + + + + +
+
+

R00TS

+

Plant the seeds of artificial intelligence by contributing words you think are important

+
+ +
+
+
+ + +
+ +
+
+ +
+
+

Total Words

+

0

+
+
+

Unique Words

+

0

+
+
+ +
+ + +
+ + + + \ No newline at end of file diff --git a/script.js b/script.js new file mode 100644 index 0000000..400b24c --- /dev/null +++ b/script.js @@ -0,0 +1,137 @@ +// R00TS - Plant the seeds of artificial intelligence +// Main application functionality + +document.addEventListener('DOMContentLoaded', function() { + // Load words from storage + loadWords(); + + // Set up automatic updates + setInterval(loadWords, 5000); +}); + +function loadWords() { + // In a real implementation, this would be an API call + // For demo purposes, we're using localStorage + let words = JSON.parse(localStorage.getItem('roots-words')) || {}; + + // Update the visualization + updateWordCloud(words); + + // Update statistics + updateStats(words); +} + +function updateStats(words) { + const totalSubmissions = Object.values(words).reduce((a, b) => a + b, 0); + const uniqueWords = Object.keys(words).length; + + document.getElementById('submission-count').textContent = totalSubmissions; + document.getElementById('unique-count').textContent = uniqueWords; +} + +function submitWord(word) { + word = word.trim().toLowerCase(); + + if (!word) return false; + + // For demo purposes, we're using localStorage + let words = JSON.parse(localStorage.getItem('roots-words')) || {}; + words[word] = (words[word] || 0) + 1; + localStorage.setItem('roots-words', JSON.stringify(words)); + + // Update UI + loadWords(); + + return true; +} + +function updateWordCloud(words) { + const container = document.getElementById('word-cloud-container'); + if (!container) return; + + container.innerHTML = ''; + + const width = container.offsetWidth; + const height = container.offsetHeight; + + const wordData = Object.entries(words).map(([text, value]) => ({ text, value })); + + // Sort by frequency + wordData.sort((a, b) => b.value - a.value); + + // Take top 100 words + const topWords = wordData.slice(0, 100); + + if (topWords.length === 0) { + // Show placeholder if no words + container.innerHTML = '

Plant some words to see them grow here!

'; + return; + } + + // Calculate min/max for scaling + const minCount = Math.min(...topWords.map(d => d.value)) || 1; + const maxCount = Math.max(...topWords.map(d => d.value)) || 1; + + // Create SVG + const svg = d3.select('#word-cloud-container') + .append('svg') + .attr('width', width) + .attr('height', height) + .append('g') + .attr('transform', `translate(${width/2}, ${height/2})`); + + // Create a simple layout + const fontSize = d => Math.max(16, Math.min(60, 16 + (d.value - minCount) / (maxCount - minCount || 1) * 44)); + + // Green colors for the plants/roots theme + const colorScale = d3.scaleLinear() + .domain([minCount, maxCount]) + .range(['#a8d5ba', '#2d6a4f']); + + // Position words in a circular pattern + let i = 0; + topWords.forEach(word => { + const angle = (i / topWords.length) * 2 * Math.PI; + const radius = Math.min(width, height) * 0.4 * Math.random(); + const x = radius * Math.cos(angle); + const y = radius * Math.sin(angle); + + svg.append('text') + .attr('x', x) + .attr('y', y) + .attr('font-size', `${fontSize(word)}px`) + .attr('text-anchor', 'middle') + .attr('fill', colorScale(word.value)) + .attr('class', 'word-item') + .text(word.text) + .on('mouseover', function() { + d3.select(this).attr('font-weight', 'bold'); + }) + .on('mouseout', function() { + d3.select(this).attr('font-weight', 'normal'); + }); + + i++; + }); +} + +// Function to share words +function shareResults() { + const words = JSON.parse(localStorage.getItem('roots-words')) || {}; + const totalWords = Object.values(words).reduce((a, b) => a + b, 0); + const uniqueWords = Object.keys(words).length; + + const topWords = Object.entries(words) + .sort((a, b) => b[1] - a[1]) + .slice(0, 5) + .map(([word, count]) => word) + .join(', '); + + const shareText = `I've planted ${totalWords} words (${uniqueWords} unique) to help grow the future of AI with R00TS! Top contributions: ${topWords}`; + + // In a real implementation, this would integrate with social sharing APIs + // For demo purposes, we'll just copy to clipboard + navigator.clipboard.writeText(shareText) + .then(() => alert('Share text copied to clipboard!')) + .catch(err => console.error('Failed to copy: ', err)); +} \ No newline at end of file diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..accbb03 --- /dev/null +++ b/styles.css @@ -0,0 +1,178 @@ +/* R00TS - Core Styles */ +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background-color: #f0f2f5; + color: #212529; + margin: 0; + padding: 0; + line-height: 1.6; +} + +.container { + max-width: 800px; + margin: 0 auto; + padding: 20px; +} + +/* Header Styles */ +.header { + text-align: center; + margin-bottom: 30px; + padding: 20px 0; +} + +.header h1 { + font-weight: 700; + color: #2e2e2e; + margin-bottom: 10px; + font-size: 3rem; +} + +.r00ts-brand { + font-family: monospace; + font-weight: bold; + letter-spacing: 1px; +} + +.header .lead { + color: #555; + font-size: 1.2rem; +} + +/* Input Area Styles */ +.input-area { + background-color: #ffffff; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + margin-bottom: 30px; +} + +.input-area label { + font-weight: 600; + color: #495057; +} + +.form-control:focus { + border-color: #80bdff; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +/* Word Cloud Styles */ +.word-cloud { + width: 100%; + height: 400px; + margin-top: 30px; + background-color: #ffffff; + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + overflow: hidden; + position: relative; +} + +.word-item { + transition: all 0.2s ease; + cursor: pointer; +} + +/* Statistics Styles */ +.stats-area { + display: flex; + justify-content: space-around; + margin: 20px 0; +} + +.stat-box { + text-align: center; + padding: 10px; + background-color: #ffffff; + border-radius: 10px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + flex: 1; + margin: 0 10px; +} + +.stat-box h3 { + margin: 0; + font-size: 1rem; + color: #6c757d; +} + +.stat-box p { + margin: 5px 0 0; + font-size: 1.5rem; + font-weight: 700; + color: #4a6fa5; +} + +/* Footer Styles */ +.footer { + text-align: center; + margin-top: 30px; + padding: 20px 0; + color: #6c757d; + font-size: 0.9rem; + border-top: 1px solid #dee2e6; +} + +/* Button Styles */ +.btn-primary { + background-color: #4a6fa5; + border: none; + padding: 10px 20px; + transition: background-color 0.2s; +} + +.btn-primary:hover { + background-color: #3a5a8c; +} + +/* Responsive Adjustments */ +@media (max-width: 576px) { + .container { + padding: 10px; + } + + .word-cloud { + height: 300px; + } + + .stats-area { + flex-direction: column; + } + + .stat-box { + margin: 5px 0; + } + + .header h1 { + font-size: 2.5rem; + } +} + +/* Share button */ +.share-btn { + display: inline-block; + background-color: #4a6fa5; + color: white; + border: none; + border-radius: 50px; + padding: 8px 20px; + margin-top: 10px; + cursor: pointer; + transition: background-color 0.2s; +} + +.share-btn:hover { + background-color: #3a5a8c; +} + +/* Animation for word addition */ +@keyframes grow { + 0% { transform: scale(0); opacity: 0; } + 100% { transform: scale(1); opacity: 1; } +} + +.word-added { + animation: grow 0.5s ease-out; +} \ No newline at end of file From 2402ceed69fd4de447764791d33f5a3a50467a94 Mon Sep 17 00:00:00 2001 From: pliny <133052465+elder-plinius@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:57:57 -0500 Subject: [PATCH 3/7] Delete gemini_chat.py --- gemini_chat.py | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 gemini_chat.py diff --git a/gemini_chat.py b/gemini_chat.py deleted file mode 100644 index 2e30c4c..0000000 --- a/gemini_chat.py +++ /dev/null @@ -1,37 +0,0 @@ -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.") From bd30cdd5a4fb8a3db008b73b4109cb45fc522169 Mon Sep 17 00:00:00 2001 From: pliny <133052465+elder-plinius@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:58:04 -0500 Subject: [PATCH 4/7] Delete elevenlabs.py --- elevenlabs.py | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 elevenlabs.py diff --git a/elevenlabs.py b/elevenlabs.py deleted file mode 100644 index 3b13fcb..0000000 --- a/elevenlabs.py +++ /dev/null @@ -1,35 +0,0 @@ -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 From 49b8d93f9d525eda6a04b1b0ca788e3814a7eefc Mon Sep 17 00:00:00 2001 From: pliny <133052465+elder-plinius@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:58:20 -0500 Subject: [PATCH 5/7] Delete elevenlabs_library.py --- elevenlabs_library.py | 368 ------------------------------------------ 1 file changed, 368 deletions(-) delete mode 100644 elevenlabs_library.py diff --git a/elevenlabs_library.py b/elevenlabs_library.py deleted file mode 100644 index 006c4b3..0000000 --- a/elevenlabs_library.py +++ /dev/null @@ -1,368 +0,0 @@ -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", - } - }, -} From 0a6e57b7daadc208c6a11e9b652261c877cc5297 Mon Sep 17 00:00:00 2001 From: pliny <133052465+elder-plinius@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:58:31 -0500 Subject: [PATCH 6/7] Delete openai_vision.py --- openai_vision.py | 50 ------------------------------------------------ 1 file changed, 50 deletions(-) delete mode 100644 openai_vision.py diff --git a/openai_vision.py b/openai_vision.py deleted file mode 100644 index 811c073..0000000 --- a/openai_vision.py +++ /dev/null @@ -1,50 +0,0 @@ -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) From 6fcedc69cfea5193a6809e1f2fb705b42479c5bd Mon Sep 17 00:00:00 2001 From: pliny <133052465+elder-plinius@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:58:39 -0500 Subject: [PATCH 7/7] Delete openai_chat.py --- openai_chat.py | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 openai_chat.py diff --git a/openai_chat.py b/openai_chat.py deleted file mode 100644 index af1c8e4..0000000 --- a/openai_chat.py +++ /dev/null @@ -1,34 +0,0 @@ -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))