From 4736625e43e4ef5fd180da3f8341d02db33fe02d Mon Sep 17 00:00:00 2001 From: Maryam Mouzarani Date: Sun, 11 May 2025 10:31:32 +0200 Subject: [PATCH] Added my contributions to community-contributions-RAG --- .../tourist-guide/README.md | 67 +++++++++++++ .../tourist-guide/requirements.txt | 11 +++ .../tourist-guide/style.css | 92 ++++++++++++++++++ .../tourist-guide/travel.jpg | Bin 0 -> 37460 bytes 4 files changed, 170 insertions(+) create mode 100644 week5/community-contributions/tourist-guide/README.md create mode 100644 week5/community-contributions/tourist-guide/requirements.txt create mode 100644 week5/community-contributions/tourist-guide/style.css create mode 100644 week5/community-contributions/tourist-guide/travel.jpg diff --git a/week5/community-contributions/tourist-guide/README.md b/week5/community-contributions/tourist-guide/README.md new file mode 100644 index 0000000..d97ac42 --- /dev/null +++ b/week5/community-contributions/tourist-guide/README.md @@ -0,0 +1,67 @@ +# Tourist Assistant + +An interactive voice-enabled tourist guide that provides information about cities, landmarks, and destinations worldwide. This application uses OpenAI's GPT models for text generation and speech features for a natural conversation experience, along with RAG capabilities and Google Places API integration for real-time attraction information. + +![Tourist Assistant Screenshot](travel.jpg) + +## Features + +- Text-based chat interface for asking questions about tourist destinations +- Voice input capability through microphone recording +- Audio responses using OpenAI's text-to-speech technology +- Clean, responsive user interface with Gradio +- RAG (Retrieval-Augmented Generation) system using PDF knowledge base +- Google Places API integration for real-time information about attractions +- Set current location for contextual queries +- Quick access to nearby attractions information + +## Requirements + +- Python 3.9+ +- OpenAI API key +- Google Places API key (optional, for location search features) + +## Installation + +1. Clone this repository +2. Install the required dependencies: + ``` + pip install -r requirements.txt + ``` +3. Create a `.env` file in the project directory with your API keys: + ``` + OPENAI_API_KEY=your_openai_api_key_here + GOOGLE_PLACES_API_KEY=your_google_places_api_key_here + ``` +4. (Optional) Add PDF files to the `knowledge-base/` directory to enhance the assistant's knowledge about specific locations + +## Running the Application + +Start the application by running: + +```bash +python tourist-assistant.py +``` + +The interface will automatically open in your default web browser. If it doesn't, navigate to the URL shown in the terminal (typically http://127.0.0.1:7860/). + +## Usage + +1. Type your question about any tourist destination in the text box +2. Or click the microphone button and speak your question +3. The assistant will respond with text and spoken audio +4. Set your current location using the "Set Location" feature +5. Click "Nearby Attractions" to get information about attractions near your current location +6. Use the "Refresh Knowledge Base" button to reload PDFs in the knowledge-base directory +7. Use the "Clear" button to start a new conversation + +## Technologies Used + +- OpenAI GPT-4o Mini for chat completions +- OpenAI Whisper for speech-to-text +- OpenAI TTS for text-to-speech +- Langchain for RAG implementation +- FAISS for vector storage +- Google Places API for location-based attraction information +- Gradio for the web interface +- pydub for audio processing \ No newline at end of file diff --git a/week5/community-contributions/tourist-guide/requirements.txt b/week5/community-contributions/tourist-guide/requirements.txt new file mode 100644 index 0000000..5661e4d --- /dev/null +++ b/week5/community-contributions/tourist-guide/requirements.txt @@ -0,0 +1,11 @@ +openai>=1.0.0 +gradio>=4.0.0 +python-dotenv>=1.0.0 +pydub>=0.25.1 +pypdf>=4.0.0 +langchain>=0.1.0 +langchain-openai>=0.0.5 +langchain-community>=0.0.13 +faiss-cpu>=1.7.4 +tiktoken>=0.5.2 +requests>=2.31.0 \ No newline at end of file diff --git a/week5/community-contributions/tourist-guide/style.css b/week5/community-contributions/tourist-guide/style.css new file mode 100644 index 0000000..a841490 --- /dev/null +++ b/week5/community-contributions/tourist-guide/style.css @@ -0,0 +1,92 @@ +/* Styling for Tourist Assistant */ + +.container { + max-width: 850px; + margin: auto; + background-color: rgba(255, 255, 255, 0.95); + padding: 20px; + border-radius: 15px; + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2); +} + +.title { + text-align: center; + font-size: 2.5rem !important; + margin-bottom: 0.5rem; + color: #2563EB; + font-weight: 600; +} + +.subtitle { + text-align: center; + font-size: 1.1rem !important; + margin-bottom: 1.5rem; + color: #4B5563; +} + +.footer { + text-align: center; + margin-top: 1rem; + color: #6B7280; + font-size: 0.9rem !important; +} + +.mic-container { + text-align: center; + margin: 1rem auto; +} + +.clear-button { + max-width: 120px; + margin-left: auto; +} + +.chatbot-container { + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + background-color: white; +} + +/* Styling for the microphone button */ +#mic-btn { + width: 150px !important; + margin: 0 auto !important; +} + +#mic-btn .wrap { + display: flex; + justify-content: center; +} + +/* Make the mic button more prominent and attractive */ +#mic-btn button.record-button { + width: 60px !important; + height: 60px !important; + border-radius: 50% !important; + background-color: #3B82F6 !important; + color: white !important; + font-size: 24px !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + margin: 0 auto !important; + border: none !important; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1) !important; + transition: all 0.2s ease !important; + margin-bottom: 10px !important; +} + +#mic-btn button.record-button:hover { + transform: scale(1.05) !important; + box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15) !important; +} + +/* Hide the audio controls */ +#mic-btn .audio-controls { + display: none !important; +} + +/* Hide the audio playback */ +#mic-btn audio { + display: none !important; +} \ No newline at end of file diff --git a/week5/community-contributions/tourist-guide/travel.jpg b/week5/community-contributions/tourist-guide/travel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..85bdf5678e4019bce1ebea19592b352a32527ff7 GIT binary patch literal 37460 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