Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from transformers import pipeline | |
| """ | |
| Psychotherapy Session Summarizer (Open-Source Implementation) | |
| This is a Hugging Face Spaces-compatible Gradio app that: | |
| - Takes psychotherapy session transcripts (as text input). | |
| - Summarizes key themes, emotional tones, and patterns. | |
| - Optionally allows custom instructions or focus areas (e.g., "Focus on client's progress since last session"). | |
| - Utilizes open-source models only. | |
| Modular: | |
| - Summarization model can be swapped easily. | |
| - Sentiment analysis model can be changed if desired. | |
| Scalable: | |
| - Can be extended to handle multiple transcripts and clustering by topic. | |
| Note: | |
| All used models are open-source and freely available on Hugging Face: | |
| - Summarization model: "google/flan-t5-small" (FLAN-T5 is open-sourced by Google) | |
| - Sentiment model: "cardiffnlp/twitter-roberta-base-sentiment-latest" (open-source sentiment analysis) | |
| You can adapt these to different models if needed, as long as they are open-source. | |
| Instructions: | |
| 1. Paste or upload a session transcript (preferably a few paragraphs of conversation). | |
| 2. (Optional) Provide a custom instruction or focus question, e.g., "Highlight moments of cognitive reframing." | |
| 3. Click "Summarize" to generate a concise summary with themes and emotional insights. | |
| """ | |
| # Initialize pipelines | |
| summarizer = pipeline("text2text-generation", model="google/flan-t5-small", tokenizer="google/flan-t5-small") | |
| # Note: "text2text-generation" pipeline for FLAN-T5 also works for summarization if we prompt it properly. | |
| sentiment_analyzer = pipeline("sentiment-analysis", model="cardiffnlp/twitter-roberta-base-sentiment-latest") | |
| def analyze_session(transcript, custom_instruction): | |
| # Basic input validation | |
| if not transcript.strip(): | |
| return "Please provide a transcript." | |
| # Construct a prompt for the summarization model | |
| # FLAN-T5 is instruction tuned, so we can give it instructions directly. | |
| # For example: | |
| prompt = "Summarize the following psychotherapy session transcript, focusing on key themes, emotional shifts, and patterns." | |
| if custom_instruction.strip(): | |
| prompt += " Additionally, " + custom_instruction.strip() | |
| prompt += "\n\nTranscript:\n" + transcript.strip() | |
| # Generate summary | |
| summary_output = summarizer(prompt, max_length=200, do_sample=False) | |
| summary = summary_output[0]['generated_text'].strip() | |
| # Sentiment analysis: We'll run it on the entire transcript to gauge the overall emotional tone. | |
| sentiment_results = sentiment_analyzer(transcript) | |
| # The sentiment model returns something like: [{'label': 'positive', 'score': ...}] | |
| # We'll aggregate the results (though it's a single input) and just pick the top. | |
| main_sentiment = sentiment_results[0]['label'] | |
| # Construct a more informative result | |
| # You could elaborate this logic: detect recurring concerns by simple keyword frequency analysis, etc. | |
| # For a simple first iteration, just provide summary and sentiment. | |
| # Optional: Identify recurring concerns (simple keyword extraction) | |
| # We'll do a naive keyword frequency approach just as a demonstration: | |
| words = transcript.lower().split() | |
| # Common therapy-related words (just a naive approach, could be replaced by a proper keyword extraction model) | |
| # This is a placeholder for demonstration | |
| keywords_of_interest = ["anxiety", "depression", "relationship", "stress", "fear", "goals", "progress", "cognitive", "behavior"] | |
| recurring_concerns = [word for word in words if word in keywords_of_interest] | |
| recurring_concerns = list(set(recurring_concerns)) # unique | |
| if not recurring_concerns: | |
| recurring_concerns_str = "No specific recurring concerns identified from the predefined list." | |
| else: | |
| recurring_concerns_str = "Recurring concerns include: " + ", ".join(recurring_concerns) | |
| # Recommended follow-up topics (just a heuristic based on summary) | |
| # If certain keywords appear in summary, we can suggest follow-up: | |
| follow_up_suggestions = [] | |
| if "progress" in summary.lower(): | |
| follow_up_suggestions.append("Explore client's perception of progress in more detail.") | |
| if "relationship" in summary.lower(): | |
| follow_up_suggestions.append("Discuss client's relationship dynamics further.") | |
| if not follow_up_suggestions: | |
| follow_up_suggestions.append("Consider following up on the emotional themes identified in the summary.") | |
| follow_up_suggestions_str = " ".join(follow_up_suggestions) | |
| # Combine results into a final output | |
| final_output = f"**Summary of Session:**\n{summary}\n\n**Overall Sentiment:** {main_sentiment}\n\n**{recurring_concerns_str}**\n\n**Suggested Follow-Up Topics:** {follow_up_suggestions_str}" | |
| return final_output | |
| # Build Gradio UI | |
| description = """# Psychotherapy Session Summarizer | |
| Upload or paste your psychotherapy session transcript and optionally provide a custom instruction (e.g., "Focus on anxiety and coping strategies."). | |
| Click 'Summarize' to generate a concise summary of key themes, emotional tones, recurring concerns, and suggested follow-up topics. | |
| """ | |
| with gr.Blocks() as demo: | |
| gr.Markdown(description) | |
| with gr.Row(): | |
| transcript_input = gr.Textbox(label="Session Transcript", lines=10, placeholder="Paste the session transcript here...") | |
| custom_instruction_input = gr.Textbox(label="Custom Instruction (Optional)", placeholder="e.g., Focus on how the client describes their feelings about progress.") | |
| summarize_button = gr.Button("Summarize") | |
| output_box = gr.Markdown() | |
| summarize_button.click(fn=analyze_session, inputs=[transcript_input, custom_instruction_input], outputs=output_box) | |
| if __name__ == "__main__": | |
| demo.launch() | |