File size: 10,855 Bytes
5b07cee
 
 
 
 
 
 
 
 
 
 
 
5eccdd4
639b66c
 
 
5b07cee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5eccdd4
 
 
 
 
 
 
639b66c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5b07cee
 
 
 
 
 
 
 
 
 
 
 
639b66c
 
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
import gradio as gr
import pandas as pd
import tempfile
import os
import re
from chatgpt_api import get_chatgpt_response
from voice_create import text_to_speech
from select_question import create_choice_question
from manuscript_conversion import manuscript_conversion
from category import check
from kousei import kousei2
from convert_chukan_fmt_1 import convert_chukan_fmt_1
from convert_chukan_fmt_2 import convert_chukan_fmt_2
from convert_last_fmt import convert_last_fmt_question
from convert_last_fmt import convert_last_fmt_selection
from convert_last_fmt import convert_last_fmt_correct

def kousei(csv_file, input_text):
    prompt_text = input_text + "指摘は、全ての問題において問題がない場合も含めて、必ず全問題、[id]に続けて結果を書くフォーマットで返してください。[id]の後は改行しないで。[id]はリクエストと完全一致の形式で。(必ず[問題ID]が5つ表示されるはずです)指摘方法は、問題ない場合は「問題なし」、指摘がある場合は「問題あり」\n「問題あり」の場合、問題のある箇所を具体的に指摘してください。\n#リスト"
    
    # CSVファイルを読み込む
    df = pd.read_csv(csv_file)
    # 'id'列のデータ型を文字列に変換
    df['id'] = df['id'].astype(str)
    # DataFrameを5行ごとに処理するためのグループ化
    df['group_id'] = df.index // 5
    grouped = df.groupby('group_id')

    # 各グループに対してフォーマットされたプロンプトを作成
    def create_prompt(group, base_prompt):
        prompt = base_prompt
        for _, row in group.iterrows():
            prompt += f"\n[{row['id']}]\n{row['原稿']}"
            print(prompt)
        return prompt
    
    # 各グループごとのプロンプトを生成
    prompts = grouped.apply(lambda g: create_prompt(g, prompt_text))
    prompts = prompts.reset_index(name='prompt_after')
    
    # 各プロンプトをAPIに送信(この部分は実装に応じて修正が必要です)
    prompts['response'] = prompts['prompt_after'].apply(get_chatgpt_response)
    print(prompts['response'])

    # 各グループに対してフォーマットされたプロンプトを作成
    def create_prompt(group, base_prompt):
        prompt = base_prompt
        for _, row in group.iterrows():
            prompt += f"\n[{row['id']}]\n{row['原稿']}"
            print(prompt)
        return prompt
    
    # 各グループごとのプロンプトを生成
    prompts = grouped.apply(lambda g: create_prompt(g, prompt_text))
    prompts = prompts.reset_index(name='prompt_after')
    
    # 各プロンプトをAPIに送信(この部分は実装に応じて修正が必要です)
    prompts['response'] = prompts['prompt_after'].apply(get_chatgpt_response)
    print(prompts['response'])
    
    

    # 応答を分割して元のDataFrameにマッピングする関数
    def split_responses(grouped_df):
        rows = []
        for _, row in grouped_df.iterrows():
            response = row['response']
            split_response = re.split(r'\[([^\]]+)\]\s*', response)
            ids_texts = list(zip(split_response[1::2], split_response[2::2]))

            for id_text in ids_texts:
                problem_id, correction_result = id_text
                # フィルタリングされたDataFrameを安全に取得
                filtered_df = df[df['id'] == problem_id]
                original_content = filtered_df['原稿'].iloc[0] if not filtered_df.empty else "原稿が見つかりません"
                rows.append({
                    'id': problem_id,
                    'contents': original_content,
                    '校正結果': correction_result.strip()
                })

        return pd.DataFrame(rows)
    
    final_results = split_responses(prompts)
    
    # ファイル出力
    with tempfile.NamedTemporaryFile(delete=False, suffix='.csv') as tmp:
        final_results.to_csv(tmp.name, index=False, encoding='cp932', errors='ignore')
        output_path = tmp.name
    
    # ファイル名を変更
    new_path = os.path.join(os.path.dirname(output_path), "output.csv")
    os.rename(output_path, new_path)
    return new_path
    
title = "英語生成ツール"

with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown(
        f"""
         # {title}
        """
    )
    with gr.Tab("問題生成(選択肢)"):
        with gr.Column():
            gr.Markdown("""
        ## 利用手順
        1. こちらの[マスタ](https://drive.google.com/uc?export=download&id=1VyDBtVrnDUlddmITiXg7ybqyB0CTCPeu)を手元に置く
        2. シート「input」に、生成したい問題パターンを書いてください(赤字の要素は固定。選択肢は可変。適宜行追加OK)
        3. 完成したら、「ファイル>名前を付けて保存」から「CSV UTF-8(コンマ区切り)(*.csv)」形式で保存
        4. 3のCSVを本サイトにアップロード
        """)

            with gr.Row():
                inputs=gr.File(label="CSVファイルをアップロード")
                outputs=gr.File(label="ダウンロード", file_count="singular")
            gr.Button("問題生成").click(
                create_choice_question,
                inputs=[inputs],
                outputs=[outputs]
            )
    with gr.Tab("原稿変換"):
        with gr.Column():
            with gr.Row():
                inputs=gr.File(label="CSVファイルをアップロード")
                outputs=gr.File(label="ダウンロード", file_count="singular")
            gr.Button("変換").click(
                manuscript_conversion,
                inputs=[inputs],
                outputs=[outputs]
            )
    with gr.Tab("校正"):
        with gr.Column():
            input_text_kousei = gr.Textbox(label="校正観点を入力してください。",value="英単語習得を目的として、以下2種類の問題を用意しています。\n1.英語の正しい日本語訳を選択する4択問題\n2.日本語の正しい英語訳を選択する4択問題\n「#リスト」の誤答選択肢の中に、正解選択肢の別解になってしまっているもの、または別解とは言えないが紛らわしすぎるものがないか、探して指摘してください。")
            with gr.Row():
                inputs=gr.File(label="CSVファイルをアップロード")
                outputs=gr.File(label="ダウンロード", file_count="singular")
            gr.Button("校正スタート").click(
                kousei,
                inputs=[inputs,input_text_kousei],
                outputs=[outputs]
            )
    with gr.Tab("校正2"):
        with gr.Column():
            radio_options = ["英語", "日本語"]
            radio_button = gr.Radio(choices=radio_options, label="選択してください",value="英語")
            input_text_kousei = gr.Textbox(label="校正観点を入力してください。",value="If there are any typographical errors, omissions, missing or extra spaces and periods, or grammatical mistakes in the English text, please point them out.")
            with gr.Row():
                inputs=gr.File(label="CSVファイルをアップロード")
                outputs=gr.File(label="ダウンロード", file_count="singular")
            gr.Button("校正スタート").click(
                kousei2,
                inputs=[inputs,input_text_kousei,radio_button],
                outputs=[outputs]
            )
    with gr.Tab("音声生成"):
         with gr.Column():
             # GradioのUIコンポーネントを定義
             radio_options = ["ブレイクタイム有", "ブレイクタイム無"]
             radio_button = gr.Radio(choices=radio_options, label="選択してください",value="ブレイクタイム有")
             with gr.Row():
                 file_input = gr.File(label="CSVファイルをアップロード")
                 submit_button = gr.Button("音声ファイルを生成")
             file_output = gr.File(label="ダウンロード")
             submit_button.click(fn=text_to_speech, inputs=[file_input,radio_button], outputs=[file_output])
    with gr.Tab("中間マスタ生成(意味理解)"):
        with gr.Column():
            with gr.Row():
                file_input = gr.File(label="CSVアップロード")
                submit_button = gr.Button("ファイルコンバート")
            file_output = gr.File(label="ファイルをダウンロード")
            submit_button.click(fn=convert_chukan_fmt_1, inputs=[file_input], outputs=[file_output])
    with gr.Tab("中間マスタ生成(音声知覚)"):
        with gr.Column():
            with gr.Row():
                file_input = gr.File(label="CSVアップロード")
                submit_button = gr.Button("ファイルコンバート")
            file_output = gr.File(label="ファイルをダウンロード")
            submit_button.click(fn=convert_chukan_fmt_2, inputs=[file_input], outputs=[file_output])
    with gr.Tab("最終マスタ生成"):
        with gr.Column():
            file_input = gr.File(label="CSVアップロード")
            with gr.Row():
                submit_button_1 = gr.Button("問題マスタ生成")
                file_output_1 = gr.File(label="ファイルをダウンロード")
                submit_button_1.click(fn=convert_last_fmt_question, inputs=[file_input], outputs=[file_output_1])
            with gr.Row():
                submit_button_2 = gr.Button("選択肢マスタ生成")
                file_output_2 = gr.File(label="ファイルをダウンロード")
                submit_button_2.click(fn=convert_last_fmt_selection, inputs=[file_input], outputs=[file_output_2])
            with gr.Row():
                submit_button_3 = gr.Button("正解選択肢マスタ生成")
                file_output_3 = gr.File(label="ファイルをダウンロード")
                submit_button_3.click(fn=convert_last_fmt_correct, inputs=[file_input], outputs=[file_output_3])
    with gr.Tab("カテゴリ分類"):
        with gr.Column():
            input_text_kousei = gr.Textbox(label="分類観点を入力してください。",value="xxxxxxxに関する内容の場合は「該当あり」と書いてください。")
            with gr.Row():
                inputs=gr.File(label="CSVファイルをアップロード")
                outputs=gr.File(label="ダウンロード", file_count="singular")
            gr.Button("分類スタート").click(
                check,
                inputs=[inputs,input_text_kousei],
                outputs=[outputs]
            )
        
demo.launch(share=True)