File size: 5,815 Bytes
b74ced7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# Importing important libraries
from fastapi import FastAPI, Query,HTTPException          
from fastapi.responses import JSONResponse, FileResponse, StreamingResponse          
from google.cloud import texttospeech         
from google.oauth2.service_account import Credentials   
from langchain.schema import HumanMessage   
from langchain_groq import ChatGroq  
import json   
from dotenv import load_dotenv   
import os   

# Importing utility functions for processing news articles
from utils import (  
    extract_titles_and_summaries,
    perform_sentiment_analysis,
    extract_topics_with_hf,
    compare_articles
)

load_dotenv()  # Loading environment variables from .env file
GROQ_API_KEY = os.getenv('GROQ_API_KEY')  
PRIVATE_KEY = os.getenv('PRIVATE_KEY').replace("\\n", "\n")  
CLIENT_EMAIL = os.getenv('CLIENT_EMAIL')  

app = FastAPI(title="Company Sentiment API", description="Get company news summaries with sentiment analysis")  

llm=ChatGroq(api_key=GROQ_API_KEY, model="llama-3.1-8b-instant")  

JSON_FILE_PATH = "final_summary.json"  
AUDIO_FILE_PATH = "hindi_summary.mp3"  

def get_tts_client():  # Function to create a Text-to-Speech client
    # Setting up Google Cloud credentials
    credentials = Credentials.from_service_account_info({  
        "type": "service_account",
        "private_key": PRIVATE_KEY,
        "client_email": CLIENT_EMAIL,
        "token_uri": "https://oauth2.googleapis.com/token"
    })
    return texttospeech.TextToSpeechClient(credentials=credentials)  

# Creating main function to create final summarized report 
def generate_summary(company_name):  
    news_articles = extract_titles_and_summaries(company_name)  
    news_articles, sentiment_counts = perform_sentiment_analysis(news_articles)  
    news_articles = extract_topics_with_hf(news_articles) 
    final_summary = compare_articles(news_articles, sentiment_counts)  
    hindi_text = ""  
    if PRIVATE_KEY and CLIENT_EMAIL: 
        hindi_prompt = f"Just Translate this text into Hindi: {final_summary['Final Sentiment Analysis']}"  # Creating a prompt for Hindi translation
        hindi_response = llm.invoke([HumanMessage(content=hindi_prompt)]).content  
        hindi_text = hindi_response.strip() if hindi_response else "Translation not available."  
        if hindi_text: 
            print(f"Generated Hindi Text: {hindi_text}")  
        else:
            print("Hindi Text not generated")  

        try:
            client = get_tts_client()  # Getting the Text-to-Speech client
            input_text = texttospeech.SynthesisInput(text=hindi_text)  # Creating TTS input from Hindi text
            voice = texttospeech.VoiceSelectionParams(  
                language_code="hi-IN",
                name="hi-IN-Chirp3-HD-Kore"
            )
            audio_config = texttospeech.AudioConfig(audio_encoding=texttospeech.AudioEncoding.MP3)  # Configuring MP3 audio output
            response = client.synthesize_speech(input=input_text, voice=voice, audio_config=audio_config)  # Synthesizing speech from text
            with open(AUDIO_FILE_PATH, "wb") as out:  # Writing the audio content to a file
                out.write(response.audio_content)
                print(f"Audio content written to file: {AUDIO_FILE_PATH}")  

        except Exception as e:  
            print(f"Error generating audio: {e}")  
        if not os.path.exists(AUDIO_FILE_PATH):  
            print(f"Audio file could not be found at {AUDIO_FILE_PATH}.")  

    final_summary["Audio"] = AUDIO_FILE_PATH  

    with open(JSON_FILE_PATH,"w",encoding="utf-8") as f:  
        json.dump(final_summary,f,ensure_ascii=False, indent=4)  
    
    # Returning a structured summary response
    return {  
        'Company': final_summary["Company"],
        'Articles': [
            {
                'Title': article.get('Title', 'No Title'),  
                'Summary': article.get('Summary', 'No Summary'), 
                'Sentiment': article.get('Sentiment', 'Unknown'),  
                'Score': article.get('Score', 0.0),  
                'Topics': article.get('Topics', [])  
            }
            for article in final_summary["Articles"]  
        ],
        'Comparative Sentiment Score': {  # Structuring sentiment analysis comparison
            'Sentiment Distribution': sentiment_counts,  
            'Coverage Differences': final_summary["Comparative Sentiment Score"].get("Coverage Differences", []),  
            'Topic Overlap': { 
                'Common Topics': final_summary["Comparative Sentiment Score"].get("Topic Overlap", {}).get("Common Topics", []),
                'Unique Topics': final_summary["Comparative Sentiment Score"].get("Topic Overlap", {}).get("Unique Topics", {})
            }
        },
        'Final Sentiment Analysis': final_summary["Final Sentiment Analysis"],  
        'Audio': AUDIO_FILE_PATH  
    }

@app.get("/")  # Defining a GET route for the home endpoint
def home():
    return {"message": "Welcome to the Company Sentiment API"} 

@app.post("/generateSummary")  # Defining a POST route to generate a summary
def get_summary(company_name: str = Query(..., description="Enter company name")):  
    structured_summary = generate_summary(company_name)  
    return structured_summary 

@app.get("/downloadJson")  # Defining a GET route to download the JSON summary
def download_json():
    return FileResponse(JSON_FILE_PATH, media_type="application/json", filename="final_summary.json")  

@app.get("/downloadHindiAudio")  # Defining a GET route to download Hindi audio
def download_audio():
    return FileResponse(AUDIO_FILE_PATH, media_type="audio/mp3", filename="hindi_summary.mp3") 

if __name__ == "__main__":  # Main execution block for running the app
    import uvicorn 
    uvicorn.run(app, host="0.0.0.0", port=8000)