import gradio as gr from optimum.pipelines import pipeline # モデルのロード MODEL_NAME = "p1atdev/zenz-v1-onnx" pipe = pipeline("text-generation", MODEL_NAME) # ひらがなをカタカナに変換する関数 def hiragana_to_katakana(hiragana: str): katakana = "" for char in hiragana: # ひらがなの文字コードの範囲はU+3041からU+309F if 0x3041 <= ord(char) <= 0x309F: katakana += chr(ord(char) + 0x60) else: katakana += char return katakana # 入力を調整する関数 def preprocess_input(user_input: str): prefix = "\uEE00" # 前に付与する文字列 suffix = "\uEE01" # 後ろに付与する文字列 processed_input = prefix + hiragana_to_katakana(user_input) + suffix return processed_input # 出力を生成する関数 def generate_output(input_text: str, num_beams: int = 4): generated_outputs = pipe( input_text, max_new_tokens=len(input_text) * 2, num_beams=num_beams, num_return_sequences=num_beams, ) generated_texts = [output["generated_text"] for output in generated_outputs] # type: ignore return generated_texts # 出力を調整する関数 def postprocess_output(model_outputs: list[str]): suffix = "\uEE01" # \uEE01の後の部分を抽出 for i, model_output in enumerate(model_outputs): if suffix in model_output: model_outputs[i] = model_output.split(suffix)[1] return "\n".join( [f"{i+1}: {model_output}" for i, model_output in enumerate(model_outputs)] ) # 変換処理をまとめる関数 def process_conversion(user_input: str, num_beams: int = 4): processed_input = preprocess_input(user_input) generated_outputs = generate_output(processed_input, num_beams) postprocessed_output = postprocess_output(generated_outputs) return postprocessed_output # インターフェースを定義 def interface(): with gr.Blocks() as ui: gr.Markdown( """## ニューラルかな漢字変換モデルzenz-v1のデモ (ONNX版) 変換したい文字列をひらがな・カタカナを入力してください""" ) with gr.Row(): with gr.Column(): input_text = gr.TextArea( label="変換する文字列(ひらがな・カタカナ)", info="変換したいテキストをひらがなかカタカナで入力します。入力すると右に反映されます。", ) num_beams = gr.Slider( label="候補数", info="多くするとより変換に時間がかかります", minimum=1, maximum=20, step=1, value=4, ) with gr.Column(): output_text = gr.TextArea( label="変換結果 (リアルタイム反映)", info="変換候補が出力されます。上の候補ほど確信度が高いです。", ) gr.Examples( examples=[ ["きめつのえいがをみました"], ["はがいたいのでしかいにみてもらった"], ["くつろぐにふといでかんたといいます"], ["けんかをかった"], ["けんかにかった"], ["こうえんをおねがいする"], ["こうえんでおねがいする"], ["つきむらてまり"], ], inputs=[input_text], ) gr.Markdown( """\ - 使用しているモデル (ONNX): [p1atdev/zenz-v1-onnx](https://huggingface.co/p1atdev/zenz-v1-onnx) - オリジナル(変換元)のモデル: [Miwa-Keita/zenz-v1-checkpoints](https://huggingface.co/Miwa-Keita/zenz-v1-checkpoints) """ ) input_text.change( fn=process_conversion, inputs=[input_text, num_beams], outputs=output_text, ) num_beams.change( fn=process_conversion, inputs=[input_text, num_beams], outputs=output_text, ) ui.launch() # ローンチ if __name__ == "__main__": interface()