2024/09/16
前回に続いて、今回はClaude3.5(無償版)、Gemini(無償版)で生成されたプログラムを見て行こうと思います。
2. Claude3.5 前回のGPT4oと同じプロンプトを英語で与えました。以下、回答です。
Windowsフォームを使ってC#でPDF転記アプリケーションを作成したいとのことですね。このアプリケーションを実装するためのコード構造と主要コンポーネントの概要を説明します。ここでは、基本的な構造を説明します:
【プログラム】
このコードはシャレコ・アプリケーションの基本構造を提供する。以下にいくつかの重要なポイントを示します:
1. メインフォーム(Chareco)には、要件で説明した UI 要素が含まれています。
2. PDFファイルに対してドラッグ・アンド・ドロップ機能が実装されています。
3. PDFから画像への変換とOCRのためのプレースホルダーメソッドが含まれています。
4.OCRメソッドは、要求されたようにAzure OpenAIを使用しますが、プレースホルダを実際のAPI呼び出しに置き換える必要があります。
5. 認識されたテキストを保存するために、「結果保存」ボタン機能が実装されています。
アプリケーションを完成させるには、以下の作業が必要です:
1. 実際のPDFから画像への変換を `ConvertPdfToImage` メソッドで実装します。これにはiTextSharpのようなライブラリを使うとよいでしょう。
2. Azure OpenAIまたはOpenAIのGPT-4 Vision APIを使ってOCR実装を洗練させる。
3. Windows FormsデザイナーでUIをデザインする。
4. 潜在的なエラーやエッジケースを処理する。
5. 必要な追加機能を実装する。
Program.csファイルでは、最小限の実装を使用することができます:
```csharp
using System;
using System.Windows.Forms;
namespace Chareco
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Chareco());
}
}
}
```
PDF処理とAzure OpenAI統合に必要なNuGetパッケージを忘れずにインストールしてください。また、使用する特定のAPIとライブラリに基づいてコードを調整する必要があるかもしれません。
このコードのどの部分についても、説明したり詳しく説明したりする必要がありますか?
上記のプログラムは以下の通りです(注:生成AIが出力したものでそのままでは動きません)。プログラム中に記載されているiTextとAzureについて、このプログラムの中で動かそうとしましたが、うまく行かなかったので、関係している部分を一旦コメントアウトして、基本動作のみの確認を行いました。iTextとAzureについては、別の機会にお話しします。
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Listener;
using System.Drawing.Imaging;
using Azure;
using Azure.AI.OpenAI;
namespace Chareco
{
public partial class Chareco : Form
{
private string pdfFilePath;
private string imageFilePath;
public Chareco()
{
InitializeComponent();
SetupDragDrop();
}
private void SetupDragDrop()
{
dropPanel.AllowDrop = true;
dropPanel.DragEnter += new DragEventHandler(DropPanel_DragEnter);
dropPanel.DragDrop += new DragEventHandler(DropPanel_DragDrop);
}
private void DropPanel_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
}
private void DropPanel_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files.Length > 0 && Path.GetExtension(files[0]).ToLower() == ".pdf")
{
pdfFilePath = files[0];
fileNameTextBox.Text = pdfFilePath;
}
}
private void ImageConversionButton_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(pdfFilePath))
{
MessageBox.Show("Please load a PDF file first.");
return;
}
try
{
// Convert PDF to image (this is a placeholder - you'll need to implement the actual conversion)
imageFilePath = Path.ChangeExtension(pdfFilePath, ".png");
ConvertPdfToImage(pdfFilePath, imageFilePath);
MessageBox.Show("PDF converted to image successfully.");
}
catch (Exception ex)
{
MessageBox.Show($"Error converting PDF to image: {ex.Message}");
}
}
private void ConvertPdfToImage(string pdfPath, string outputPath)
{
// Placeholder for PDF to image conversion
// You'll need to implement this using a PDF rendering library
}
private async void CharacterRecognitionButton_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(imageFilePath))
{
MessageBox.Show("Please convert the PDF to an image first.");
return;
}
try
{
string recognizedText = await PerformOCR(imageFilePath);
outputTextBox.Text = recognizedText;
}
catch (Exception ex)
{
MessageBox.Show($"Error performing character recognition: {ex.Message}");
}
}
private async Task<string> PerformOCR(string imagePath)
{
// Placeholder for OCR using Azure OpenAI
// You'll need to implement this using the Azure OpenAI SDK
// This is a simplified example and may need adjustment based on the actual API
var client = new OpenAIClient(
new Uri("Your Azure OpenAI Endpoint"),
new AzureKeyCredential("Your Azure OpenAI Key")
);
var imageBytes = File.ReadAllBytes(imagePath);
var base64Image = Convert.ToBase64String(imageBytes);
var chatCompletionsOptions = new ChatCompletionsOptions()
{
Messages =
{
new ChatMessage(ChatRole.System, "You are an OCR system. Describe the text in the image."),
new ChatMessage(ChatRole.User, $"[A base64 encoded image: {base64Image}]")
},
MaxTokens = 500
};
Response<ChatCompletions> response = await client.GetChatCompletionsAsync(
"Your-Deployment-Name",
chatCompletionsOptions
);
return response.Value.Choices[0].Message.Content;
}
private void ResultSaveButton_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(outputTextBox.Text))
{
MessageBox.Show("No text to save.");
return;
}
SaveFileDialog saveFileDialog = new SaveFileDialog
{
Filter = "Text files (*.txt)|*.txt",
DefaultExt = "txt",
AddExtension = true
};
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
File.WriteAllText(saveFileDialog.FileName, outputTextBox.Text);
MessageBox.Show("Text saved successfully.");
}
}
}
}
GPT4oに比べClaude3.5の方が個人的にプログラムが洗練されているように思えました。
3. Gemini GPT4o、Claude3.5と同じプロンプトを英語で与えましたが、1回目の回答はプロンプトの内容を「鸚鵡返し」した形で、コードを出してくれませんでした。以下、回答です。
C#でPDFファイル転写アプリケーションを作成するお手伝いをさせていただければ幸いです。以下は、提供された回答の良い点を取り入れ、潜在的な問題に対処する包括的な概要です:
**1. アプリの目的
- PDF ファイルを読み取り、書かれたテキストをテキストとして出力する。
- ファイルの読み込み、書き起こし、結果の保存のためのユーザーフレンドリーなインターフェイスを提供する。
**2. UIの概要
- メインフォーム:***。
- ユーザーがPDFファイルをドラッグ&ドロップできるパネルです。
- ファイル名表示:** 読み込まれたPDFファイルの名前を表示するテキストボックス。
- 画像変換ボタン:** PDFを画像(PNGなど)に変換します。
- OpenAIまたはAzureOpenAIサービスを使用して、画像上でOCRを実行します。
- 転写出力ボックス:転写されたテキストを表示し、編集を可能にします。
- テキストファイルとして保存します。
**3. 具体的なアプリケーション操作の流れ
1. **ファイル読み込み:*** 1.
- PDFファイルを 「Drop File Area 」にドラッグ&ドロップします。
- ファイル名表示」テキストボックスにファイル名が表示されます。
2. **画像変換:**。
- 画像変換」ボタンをクリックします。
- PDFが画像(例:PNG)に変換され、一時的な場所に保存されます。
3. **文字認識:***。
- ユーザーは「文字認識」ボタンをクリックします。
- OCRエンジン(OpenAIまたはAzureOpenAI)が画像を処理し、転写されたテキストを返します。
- 転写されたテキストは、「転写出力ボックス 」に表示されます。
4. **編集と保存:***。
- ユーザーは、「Transcription Output Box 」で書き起こしたテキストを編集することができます。
- 結果保存」ボタンをクリックすると、編集したテキストがテキストファイルとして保存されます。
**4. ライブラリとツール
- Windows Forms: **ユーザーインターフェースの作成に使用します。
- OpenAIまたはAzureOpenAI:** 文字認識サービス用。
- PDF ライブラリ:** PDF ファイルの読み取りと変換に使用します (例: iTextSharp、Ghostscript)。
- 画像処理ライブラリ:** 画像変換処理用(例: System.Drawing)。
**5. 開発環境
- Visual Studio 2022:** C#開発用。
- .NET 6.0 または 8.0:** ターゲットフレームワーク。
**6. アプリケーションの出力形式
- ソリューション名:** Chareco
- フォーム名:** Chareco
- 出力ファイル:** Chareco.cs、Chareco.Designer.cs、Program.cs (最小)
追加考慮事項:*** エラー処理:*** 適切なエラー処理メカニズムを実装する。
- エラー処理:** 例外をキャッチし、ユーザーに有益なメッセージを提供するために、適切なエラー処理メカニズムを実装する。
- 進捗表示:** 画像変換中および文字認識中に進捗インジケータを表示し、ユーザーにフィードバックを提供することを考慮する。
- 設定:*** OCRエンジン、出力ファイル形式、言語などの設定をユーザーがカスタマイズできるようにします。
- パフォーマンスの最適化: **大きなPDFファイルや高解像度の画像を扱う場合は、パフォーマンスのためにコードを最適化する。
- アクセシビリティ:*** アクセシビリティ・ガイドラインに従うことで、障害を持つユーザーがアプリケーションにアクセスできるようにします。
これらのガイドラインに従って、提供された回答からのフィードバックを取り入れることにより、C#で堅牢でユーザーフリーなPDFファイル転記アプリケーションを作成できます。
2回目の質問は、端的に「実際のコードを書いてください。」とだけ言いました。回答内容は以下の通りです。
C#でPDFファイル転写アプリケーションを作成する
1. プロジェクトの作成とUIの設計
Visual Studioで新しいWindows Formsアプリケーションを作成し、「Chareco」と名付けます。フォームに以下のコントロールを配置します。
Drag and Drop Panel: Panelコントロールを配置し、AllowDropプロパティをtrueにします。
File Name Textbox: TextBoxコントロールを配置し、読み込んだPDFファイルのパスを表示します。
Image Conversion Button: Buttonコントロールを配置し、クリック時にPDFを画像に変換します。
Character Recognition Button: Buttonコントロールを配置し、クリック時に画像から文字認識を行います。
Transcription Output Textbox: TextBoxコントロールを配置し、転写結果を表示します。
Result Save Button: Buttonコントロールを配置し、クリック時に転写結果をテキストファイルに保存します。
2. コードの実装
【プログラム】
コードは注意してご使用ください。
3. 説明
iTextSharp: PDF操作に便利なライブラリです。NuGetでインストールできます。
OpenAI API: 画像からテキストを抽出するAPIです。事前にAPIキーを取得し、コードに設定してください。
Drag and Drop: DragEnterイベントとDragDropイベントを使用して、PDFファイルをドラッグアンドドロップで読み込みます。
画像変換: iTextSharpなどを使用してPDFを画像に変換します。
文字認識: OpenAI APIのImage.CreateCompletionAsyncメソッドを使用して、画像からテキストを抽出します。
転写結果の保存: System.IO名前空間のクラスを使用して、テキストファイルを保存します。
注意点
OpenAI APIの利用: OpenAI APIの利用には料金がかかる場合があります。
画像変換の品質: 画像の品質によって文字認識の精度が大きく変わる場合があります。
エラー処理: 例外処理などを適切に行い、プログラムが異常終了しないようにします。
UIの改善: より洗練されたUIにするために、様々なコントロールやレイアウトを検討してください。
このコードはあくまで基本的な実装であり、実際の開発では、より詳細なエラー処理やパフォーマンスチューニングが必要になります。
その他
OCRエンジンの選択: OpenAI以外にも、Google Cloud Vision APIなど、様々なOCRエンジンがあります。
PDFライブラリの選択: iTextSharp以外にも、PDFBoxなど、様々なPDFライブラリがあります。
UIデザイン: より使いやすく、視覚的に美しいUIにするために、デザインツールを活用することも検討してください。
参考資料
iTextSharp: [無効な URL を削除しました]
OpenAI API: [無効な URL を削除しました]
このコードをベースに、ご自身の要件に合わせてカスタマイズしてください。
**
※ このコードを実行する前に、必要なライブラリをNuGetでインストールし、OpenAIのAPIキーを設定してください。**
より詳細な説明やカスタマイズについては、お気軽にご質問ください。
補足:
画像変換: iTextSharpを用いたPDFから画像への変換の具体的なコードは、PDFの構造や必要な画像形式によって異なります。
エラー処理: 例外処理や、ファイルが存在しない場合の処理などを適切に行う必要があります。
UIデザイン: Windows Forms Designerを用いて、より直感的に操作できるUIを設計することができます。
パフォーマンス: 大量のPDFファイルを処理する場合、パフォーマンスチューニングが必要になる場合があります。
ご希望に応じて、これらの点についても詳しく説明できます。
また、具体的なエラーが発生した場合には、エラーメッセージやコードの該当部分を提示いただけると、より的確なアドバイスができます。
出力されたプログラムは以下の通りです。
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using iText.Kernel.Pdf; // PDF操作用ライブラリ
using OpenAI.API; // OpenAI API用ライブラリ
namespace Chareco
{
public partial class Chareco : Form
{
private string pdfFilePath;
private string imageFilePath;
public Chareco()
{
InitializeComponent();
dragAndDropPanel.AllowDrop = true;
dragAndDropPanel.DragEnter += DragEnter;
dragAndDropPanel.DragDrop += DragDrop;
}
private void DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
}
private void DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files.Length > 0 && Path.GetExtension(files[0]).Equals(".pdf", StringComparison.OrdinalIgnoreCase))
{
pdfFilePath = files[0];
fileNameTextBox.Text = pdfFilePath;
}
}
private async void imageConversionButton_Click(object sender, EventArgs e)
{
// PDFを画像に変換する処理(iTextSharpなどを使用)
// ...
imageFilePath = "converted.png"; // 仮のファイルパス
}
private async void characterRecognitionButton_Click(object sender, EventArgs e)
{
var openai = new OpenAIAPI("YOUR_API_KEY");
var response = await openai.Image.CreateCompletionAsync(new ImageRequest
{
Model = "gpt-4-vision",
Image = new ImageFile(imageFilePath),
Prompt = "What is written in this image?"
});
transcriptionOutputTextBox.Text = response.Choices[0].Text.Value;
}
private void resultSaveButton_Click(object sender, EventArgs e)
{
// 転写結果をテキストファイルに保存する処理
// ...
}
}
}
GPT4o、Claude3.5に比べ、中身が非常に薄い内容と個人的には思いました。
最後に、今回利用した3種類の生成AI(GPT4o、Claude3、Gemini)によるアプリ開発のまとめをします。
Visual Studioを起動させ、プロジェクトとフォームを作成する作業は自動化ができないと思いますので、自分で行いました。また、UI設計において、今回は各オブジェクトをフォーム上に個別に作成する必要がありましたが、スケッチ(配置図)があるので、適切なプロンプトを入力することで改善できるのではないかと思いました。
出力された「Chareco.cs」は、具体的な処理の中身は生成されておらず、メッセージボックスが表示されるだけのものでした。一度に全ての機能をプロンプトに盛り込むのは難しいので、機能を小分けにしてプロンプトを送り、個々に完成させていくスタイルが望ましいのではないかと思い直しました。
今回、自分の考えていなかったアイデア(ライブラリ)も提案してもらっているので、今後、確認して行こうと思います。