joey1101 commited on
Commit
16d19c3
·
verified ·
1 Parent(s): fb3f6b2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -87
app.py CHANGED
@@ -1,111 +1,52 @@
1
- # 导入所需的包
2
  from transformers import pipeline
3
  from IPython.display import Audio, display
 
4
 
5
  ##########################################
6
- # Step 1:情感分类 —— 分析用户评论的情感倾向
7
  ##########################################
 
 
8
 
9
- # 在 Hugging Face 上,经过实践效果较好的情感分类模型推荐:
10
- # 1. "distilbert-base-uncased-finetuned-sst-2-english" —— 经典正负情感模型
11
- # 2. "cardiffnlp/twitter-roberta-base-sentiment" —— 针对社交媒体语境优化
12
- # 3. "nlptown/bert-base-multilingual-uncased-sentiment" —— 多语种情感分析模型
13
- # 4. "siebert/sentiment-roberta-large-english" —— Roberta 大模型版本
14
- sentiment_models = [
15
- "distilbert-base-uncased-finetuned-sst-2-english",
16
- "cardiffnlp/twitter-roberta-base-sentiment",
17
- "nlptown/bert-base-multilingual-uncased-sentiment",
18
- "siebert/sentiment-roberta-large-english"
19
- ]
20
-
21
- # 选取第一款模型作为示例(你可以修改索引以试用其他模型)
22
- selected_sentiment_model = sentiment_models[0]
23
-
24
- # 使用 transformers 的 pipeline 创建情感分析模块
25
- sentiment_classifier = pipeline("sentiment-analysis", model=selected_sentiment_model)
26
-
27
- # 示例用户评论(你可以将其替换为实际的用户输入)
28
  user_review = "I love the fast delivery, but the product quality could be better."
29
 
30
- # 运行情感分类
31
  sentiment_result = sentiment_classifier(user_review)[0]
32
  print("情感分析结果:", sentiment_result)
33
 
34
  ##########################################
35
- # Step 2:回复生成 —— 根据情感生成自动回复
36
  ##########################################
 
 
37
 
38
- # 针对文本生成任务,Hugging Face 上较好效果的模型有:
39
- # 1. "gpt2" —— 基础文本生成模型
40
- # 2. "microsoft/DialoGPT-medium" —— 针对对话回复优化
41
- # 3. "EleutherAI/gpt-neo-125M" —— GPT-Neo 系列小模型
42
- # 4. "facebook/blenderbot-400M-distill" —— BlenderBot 对话生成模型
43
- generation_models = [
44
- "gpt2",
45
- "microsoft/DialoGPT-medium",
46
- "EleutherAI/gpt-neo-125M",
47
- "facebook/blenderbot-400M-distill"
48
- ]
49
-
50
- # 此处选取 "microsoft/DialoGPT-medium" 作为生成回复的模型
51
- selected_generation_model = generation_models[1]
52
- reply_generator = pipeline("text-generation", model=selected_generation_model)
53
-
54
- # 根据情感结果构造生成回复用的 prompt
55
- # 注意不同模型返回的标签可能不同,有的直接写 "POSITIVE"/"NEGATIVE",有的可能返回 "LABEL_1"/"LABEL_0"
56
- label = sentiment_result['label'].upper() # 转为大写方便比较
57
-
58
  if "POSITIVE" in label or "LABEL_1" in label:
59
- # 正面评论的回复模板:表达感谢和认同(拟人化、贴心)
60
- prompt = f"用户评论表达了正面情感,评论内容: {user_review}\n系统回复(请用贴心温暖的语气,表达感谢和认可):"
61
  elif "NEGATIVE" in label or "LABEL_0" in label:
62
- # 负面评论的回复模板:使用温柔的安抚语气,表达歉意和关切
63
- prompt = f"用户评论表达了负面情感,评论内容: {user_review}\n系统回复(请用温柔体贴的话语进行安抚和道歉):"
64
  else:
65
- # 如果情感不明确,可使用中性模板
66
- prompt = f"用户评论: {user_review}\n系统回复:"
67
 
68
  print("\n生成回复的提示词 (Prompt):")
69
  print(prompt)
70
 
71
- # 生成回复文字
72
- # 设置 max_length: 最大生成长度;do_sample, top_p, temperature 控制生成风格和随机性
73
- generated = reply_generator(prompt, max_length=120, do_sample=True, top_p=0.9, temperature=0.8)
74
- generated_reply = generated[0]['generated_text']
75
- print("\n生成的回复文本:")
76
- print(generated_reply)
77
 
78
- ##########################################
79
- # Step 3:文本转语音(TTS) —— 将回复朗读出来
80
- ##########################################
81
-
82
- # Hugging Face 上几款 TTS 模型的候选:
83
- # 1. "microsoft/speecht5_tts" —— 微软的 SpeechT5 TTS 模型,支持情感化控制;
84
- # 2. "espnet/kan-bayashi_ljspeech_tts_fastspeech2" —— 基于 FastSpeech2 的模型;
85
- # 3. "espnet/kan-bayashi_ljspeech_tts_tacotron2" —— 基于 Tacotron2 的模型;
86
- # 4. “facebook/s2tts” —— 示例(如果可用,实际情况可选择其他推荐的 TTS 模型)
87
- tts_models = [
88
- "microsoft/speecht5_tts",
89
- "espnet/kan-bayashi_ljspeech_tts_fastspeech2",
90
- "espnet/kan-bayashi_ljspeech_tts_tacotron2",
91
- "facebook/s2tts"
92
- ]
93
-
94
- # 选取第一款作为示例
95
- selected_tts_model = tts_models[0]
96
- tts_pipeline = pipeline("text-to-speech", model=selected_tts_model)
97
-
98
- # 利用 TTS 模型将生成的回复文本转换为语音
99
- tts_output = tts_pipeline(generated_reply)
100
 
101
- # tts_output 通常返回一个字典,其中包含 "wav" (二进制音频数据) 和 "sample_rate"
102
- speech_wav = tts_output["wav"]
103
- sample_rate = tts_output["sample_rate"]
104
-
105
- # (可选)保存生成的语音文件到本地文件系统(Colab 中生成)
106
- with open("reply.wav", "wb") as f:
107
- f.write(speech_wav)
108
 
109
- # 在 Colab 中直接播放语音,可以用 IPython.display.Audio
110
- print("\n播放生成的回复语音:")
111
- display(Audio(data=speech_wav, rate=sample_rate))
 
1
+ # 导入必要的库
2
  from transformers import pipeline
3
  from IPython.display import Audio, display
4
+ import torch
5
 
6
  ##########################################
7
+ # Step 1:情感分析 - 分析用户评论的情感倾向
8
  ##########################################
9
+ # 本示例中选择 distilbert-base-uncased-finetuned-sst-2-english 模型用于英文情感分类
10
+ sentiment_classifier = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")
11
 
12
+ # 示例用户评论(可替换为实际评论)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  user_review = "I love the fast delivery, but the product quality could be better."
14
 
15
+ # 进行情感分析
16
  sentiment_result = sentiment_classifier(user_review)[0]
17
  print("情感分析结果:", sentiment_result)
18
 
19
  ##########################################
20
+ # Step 2:回复生成 - 根据情感生成自动回复
21
  ##########################################
22
+ # 使用 microsoft/DialoGPT-medium 模型生成回复
23
+ reply_generator = pipeline("text-generation", model="microsoft/DialoGPT-medium")
24
 
25
+ # 根据情感构造 Prompt,本次修改在 prompt 中加入明确的“回复:”提示,
26
+ # 以引导模型产生新内容而不是简单重复输入内容
27
+ label = sentiment_result['label'].upper()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  if "POSITIVE" in label or "LABEL_1" in label:
29
+ prompt = (f"用户评论表达了正面情感:\n评论内容: {user_review}\n"
30
+ f"请给出一段贴心温暖、表达感谢和认可,并让用户感到愉快的回复:\n回复:")
31
  elif "NEGATIVE" in label or "LABEL_0" in label:
32
+ prompt = (f"用户评论表达了负面情感:\n评论内容: {user_review}\n"
33
+ f"请给出一段温柔体贴、安抚用户并表示歉意的回复:\n回复:")
34
  else:
35
+ prompt = f"用户评论: {user_review}\n请给出一段中肯的回复:\n回复:"
 
36
 
37
  print("\n生成回复的提示词 (Prompt):")
38
  print(prompt)
39
 
40
+ # 生成回复文本,设置 truncation=True 避免长度问题,并适当提高采样温度与 top_p 值
41
+ generated = reply_generator(prompt, max_length=150, do_sample=True, top_p=0.95, temperature=0.9, truncation=True)
 
 
 
 
42
 
43
+ generated_text = generated[0]['generated_text']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
+ # 如果生成结果包含完整 prompt,则剔除
46
+ if generated_text.startswith(prompt):
47
+ final_reply = generated_text[len(prompt):].strip()
48
+ else:
49
+ final_reply = generated_text.strip()
 
 
50
 
51
+ print("\n生成的回复文本:")
52
+ print(final_reply)