File size: 5,818 Bytes
657a977
 
 
 
 
 
 
 
 
 
 
 
 
0021684
 
 
 
 
 
657a977
 
 
 
f5dd236
657a977
485e12a
657a977
94c21a4
657a977
 
f5dd236
657a977
 
 
2199ce9
 
 
 
 
657a977
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0021684
657a977
f5dd236
 
657a977
 
 
2199ce9
 
f5dd236
657a977
 
 
2199ce9
657a977
f5dd236
657a977
 
 
 
2199ce9
657a977
f5dd236
657a977
 
 
 
 
f5dd236
 
 
657a977
 
 
 
 
f5dd236
657a977
f5dd236
657a977
 
 
 
f5dd236
 
 
 
657a977
 
f5dd236
 
657a977
f5dd236
657a977
f5dd236
657a977
 
 
 
f5dd236
657a977
f5dd236
657a977
f5dd236
657a977
f5dd236
657a977
 
 
 
 
 
627e458
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
126
127
128
# 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)