54
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Roo-Clineを使ってみた

Last updated at Posted at 2025-01-06

image.png
作成日:2025年1月6日(月)

1.はじめに

本記事では、Visual Studio Code拡張機能「Cline」をベースにした自律型AIコーディングアシスタント「Roo-Cline」を紹介します。Roo-Clineは、高速かつ柔軟な機能と革新的な自律機能を備え、開発者コミュニティから注目を集めています。このパワフルなツールにより、開発作業の生産性を大きく向上させることができます。

以下では、Roo-Clineの概要と特徴を説明し、続いて主要機能や対応APIプロバイダーについて詳しく解説します。さらに、実際の開発現場での活用事例や、従来のコーディングアシスタントとの比較も紹介します。

2.Roo-Cline(ルー・クライン)とは

Roo-Cline(ルー・クライン)は、「Cline」を RooVetGit 氏が 2024年12月16日にフォーク(*1)したオープンソースソフトウェアです。元となる「Cline」は 2024年1月28日に Cline Bot Inc. によって開発されました。「Cline」という名称は「CLI aNd Editor」(*2)に由来しており、したがって Roo-Cline は「RooVetGit 氏がフォークした CLI aNd Editor」という意味合いを持っていると思われます。

Roo-Clineは、ユーザーからの簡潔な自然言語指示に基づいて開発を進める自律型AIエージェントです。プロジェクトフォルダーの作成、定義ファイルの自動生成、コードの実行とテスト、そしてGitでの保存まで、一連の作業を自動的に実施します。

Roo-Cline(Clineを含む)では、自律型AIエージェントが生成する初期コードには不具合が多く存在します。AIエージェントは自動テストでこれらの不具合を発見し、自動修復しながら開発を進めていくため、多くのトークンを消費します。そのため、APIプロバイダーの選択が非常に重要です。コード生成に優れた推論モデルを使用することで、このトライアンドエラーの回数を削減できます。

(*1)Comparing RooVetGit:main...cline:main · RooVetGit/Roo-Cline

(*2)cline/clineのReadme.mdより

Meet Cline, an AI assistant that can use your CLI aNd Editor.
Thanks to Claude 3.5 Sonnet's agentic coding capabilities, Cline can handle complex software development tasks
step-by-step. With tools that let him create & edit files, explore large projects, use the browser, and execute terminal
commands (after you grant permission), he can assist you in ways that go beyond code completion or tech support. 
Cline can even use the Model Context Protocol (MCP) to create new tools and extend his own capabilities. While
autonomous AI scripts traditionally run in sandboxed environments, this extension provides a human-in-the-loop GUI
 to approve every file change and terminal command, providing a safe and accessible way to explore the potential of
 agentic AI.

3.特徴

No 特徴 説明
1 オープンソース ソースコードが公開されており、コミュニティによる改善や拡張が可能
2 Visual Studio Code統合 VSCode拡張機能として動作し、開発環境に自然に統合される
3 自律的な動作 複雑なソフトウェア開発タスクを段階的に実行可能
4 プロジェクト探索 大規模プロジェクトのコードベースを理解・分析可能
プロジェクト内の複数ファイルの作成・編集が可能(ユーザーの承認必要)
5 ターミナル連携 vscodeのターミナルを利用して作成したコードの自動実行を行い、応答されたエラーメッセージを自動判定しコードの修正を提案します
ユーザーは提案を承認することで、ターミナルコマンドを実行可能
6 ブラウザ連携 Webアプリケーション開発ではチャットツール上でWebブラウザを起動して、自動的にウェブリソースにアクセスして自動テストを行います
7 MCP対応 Model Context Protocolを使用して新機能を追加・拡張可能
8 安全性重視 すべてのファイル変更とコマンド実行にユーザー承認が必要
9 ビジョン対応 チャット画面に画像を張付け、画像に基づくコード修正を指示することが可能
10 Git統合 Custom Instructuonを定義することでファイルの変更を自動的にコミットする提案をします。

4.機能

No カテゴリ 機能カテゴリ 詳細 Cline継承
1 コード開発 コード分析・理解 プロジェクトのコードベースを解析し、構造や依存関係を理解
2 コード生成 要件に基づいて新しいコードを生成し、既存コードの修正を提案
3 デバッグ支援 エラーの特定、原因分析、修正案の提示を行う
4 リファクタリング コードの品質向上のための改善案を提示し実装を支援
5 ドキュメント管理 ドキュメント生成 コードのドキュメント化、コメント追加、README作成を支援
6 品質管理 テスト支援 ユニットテストの生成、テストケースの提案と実装
7 プロジェクト管理 プロジェクト管理 タスクの分割、進捗管理、優先順位付けをサポート
8 プロジェクト固有設定 .clinerulesでプロジェクト毎にテストカバレージ、Gitコミット、ドキュメンテーション、構文チェック、プロジェクト固有の追加テストなどの要件を設定可能
本家のClineではv3.0.0で2024/12/19にサポートされた機能です
9 開発環境 環境設定 開発環境のセットアップ、設定ファイルの管理を支援
10 バージョン管理 バージョン管理 Gitコマンドの実行、コミットメッセージの生成を支援
11 ユーザーインターフェース チャット機能強化 画像のドラッグ&ドロップ、メッセージの削除、プロンプト強化機能を提供
12 UI/UX改善 フィードバック用サウンド効果、ブラウザサイズの調整、スクリーンショット品質の設定が可能
13 プロンプト管理 履歴からのクイックプロンプトコピー、OpenRouterの圧縮サポート
14 互換性 多言語対応 英語、日本語、スペイン語、フランス語、ドイツ語などでのコミュニケーションをサポート
15 モデル互換性 DeepSeek V3、Amazon Nova、Meta 3/3.1/3.2、その他OpenAI互換プロバイダーに対応
16 システム設定 MCP設定 ツールごとの自動承認、個別サーバーの有効/無効化、機能全体の制御が可能
17 診断・制御機能 自動書き込み後の診断遅延設定、ターミナル出力行数の制御、元のClineとの並行実行が可能

5.APIプロバイダー

Roo-Clineでを使用した開発では自律型AIエージェントが提案したコードが一発で動作することが少なく、トライアンドエラーで開発を進めていくのが特徴です。賢いAPIプロバイダー(正確な推論モデル)を使用することでこのトライアンドエラーを少なくすることが可能なため、APIプロバイダーの選択は重要です。

Roo-Clineは、OpenRouter、Anthropic、Google Gemini、DeepSeek、OpenAI、OpenAI Compatible、GCP Vertex AI、AWS Bedrock、LM Studio、Ollamaに対応しています。特にOpenRouter、OpenAI Compatible、GCP Vertex AI、AWS BedrockなどのAPIプロバイダーは、複数のLLM(Large Language Model:大規模言語モデル)をサポートしているため、幅広いLLMを活用できます。

Roo-Clineと一番相性がよさそうなLLMはclaude-3.5-sonnetですが、コスト面で課題があります。以下の表で主要なモデルのコストを比較してみましょう。

No モデル Input (1M tokens) Output (1M tokens) 特徴
1 OpenAI o1-preview $15.00 $60.00 最も高精度かつ高価なモデル
2 Claude 3.5 Sonnet $3.00 $15.00 高精度かつRoo-Clineと相性が良い高価なモデル
3 Google Gemini Flash 1.5(※1) $0.075 $0.30 最も経済的

コスト比較を見ると、OpenAI o1-previewが最も高価で、1Mトークンあたりの入力コストが15.00USD、出力コストが60.00USDとなっています。次いでClaude 3.5 Sonnetが入力3.00USD、出力15.00USDと続きます。一方、Google Gemini Flash 1.5は入力コストが0.075USD、出力コストが0.30USDと圧倒的に経済的で、他のモデルと比べて約1/200~1/40のコストで利用することができます。

ネットではDeepSeekがコスパが良いという話があるようですが、ここでは企業で利用することを前提に私が閉域化できることを知っているAzure OpenAI、GCP Vertex AI、AWS Bedrockで使用できそうなAPIプロバイダーを例に検討していきます。

それぞれのAIプロバーダー毎のモデルの単価を見てみましょう。

※朱書きは利用したいが高価なため使用に躊躇するもの(紫書きのLLMで問題が解決できないときに使用)
(※1)Google Gemini Flash 1.5には8bというサフィックスがある無料のモデルがありますが、こちらは軽量モデルなのでチャットや文字起こし、翻訳などには適していますが、複雑な推論には適していないようです。
 

有料のGoogle Gemini flash 1.5と無料のGoogle Gemini flash-1.5-8bの違いを教えてください。

5.1. OpenRouter

トークンの従量課金と手数料は発生しますが、Roo-Clineとの相性が最も良いclaude-3.5-sonnetと、回数制限付きながら無料で使えるgemini-flash-1.5を1つのAPIキーで利用できるため、最もお勧めのプロバイダーです。

今回は個人での評価となるため、OpenRouterを使用しますが、機密情報漏洩や輸出管理の外為法を気にする企業ではAWS Bedrockで利用した方が良いかもしれません。
OpenRouterはアカウントを作成するとクレジットカードの登録が必須化され、無料のgemini-2.0-flash-exp:freeでも手数料がかかるような気がします。(よく読んでなくてすみません)

私は10USD課金しました。
私のOpenRouterの設定は以下の通りです。

APIプロバイダー:OpenRouter
OpenRouter API KeyAPIキー
Modelanthropic/claude-3.5-sonnet

選択するとコストまで表示してくれます。

New Claude 3.5 Sonnet delivers better-than-Opus capabilities, faster-than-Sonnet speeds, at the same Sonnet prices. Sonnet is particularly good at:

Coding: Scores ~49% on SWE-Bench Verified, higher than the last best score, and without any fancy prompt scaffolding
Data science: Augments human data science expertise; navigates unstructured data while using multiple tools for insights
Visual processing: excelling at interpreting charts, graphs, and images, accurately transcribing text to derive insights beyond just the text alone
Agentic tasks: exceptional tool use, making it great at agentic tasks (i.e. complex, multi-step problem solving tasks that require engaging with other systems)
#multimodal

See more

Supports images
Supports computer use
Supports prompt caching
Max output: 8,192 tokens
Input price: $3.00/million tokens
Cache writes price: $3.75/million tokens
Cache reads price: $0.30/million tokens
Output price: $15.00/million tokens
No 言語モデル リリース日 Context Max Output Input Output 手数料
1 anthropic/claude-3.5-sonnet 2024-01-05 200K 8K $3 $15 5%
2 anthropic/claude-3.5-sonnet:beta 2024-01-05 200K 8K $3 $15 5%
3 anthropic/claude-3.5-sonnet-20240620 2024-06-20 200K 8K $3 $15 5%
4 anthropic/claude-3.5-sonnet-20240620:beta 2024-06-20 200K 8K $3 $15 5%
5 anthropic/claude-3.5-haiku 2024-03-07 200K 8K $0.8 $4 5%
6 anthropic/claude-3.5-haiku:beta 2024-10-22 200K 8K $0.8 $4 5%
7 anthropic/claude-3.5-haiku-20241022 2024-10-22 200K 8K $0.8 $4 5%
8 anthropic/claude-3.5-haiku-20241022:beta 2024-10-22 200K 8K $0.8 $4 5%
9 anthropic/claude-3-sonnet:beta 2024-02-29 200K 4K $3 $15 5%
10 anthropic/claude-3-opus:beta 2024-02-29 200K 4K $15 $75 5%
11 anthropic/claude-3-sonnet 2024-02-29 200K 4K $3 $15 5%
12 anthropic/claude-3-haiku:beta 2024-03-07 200K 4K $0.25 $1.25 5%
13 anthropic/claude-2.0:beta 2023-07-11 100K 4K $8 $24 5%
14 anthropic/claude-2.1:beta 2023-11-21 100K 4K $8 $24 5%
15 anthropic/claude-2:beta 2023-07-11 200K 4K $8 $24 5%
16 google/gemini-2.0-flash-exp:free 2024-12-19 1.05M 8K $0 $0 5%
17 google/gemini-2.0-flash-thinking-exp:free 2024-12-19 40K 8K $0 $0 5%
18 google/gemini-exp-1114:free 2023-11-14 41K 8K $0 $0 5%
19 google/gemini-exp-1121:free 2023-11-21 41K 8K $0 $0 5%
20 google/gemini-exp-1206:free 2023-12-06 2.1M 8K $0 $0 5%
21 google/gemini-flash-1.5 2024-08-27 1M 8K $0.075 $0.3 5%
22 google/gemini-flash-1.5-8b 2024-08-27 1M 8K $0.0375 $0.15 5%
23 google/gemini-flash-1.5-8b-exp 2024-08-27 1M 8K $0 $0 5%
24 google/gemini-flash-1.5-exp 2024-08-27 1M 8K $0 $0 5%
25 google/gemini-pro 2023-12-06 33K 8K $0.5 $1.5 5%
26 google/gemini-pro-1.5 2024-08-27 2M 8K $1.25 $5 5%
27 google/gemini-pro-1.5-exp 2024-08-27 1M 8K $0 $0 5%
28 google/gemini-pro-vision 2023-12-13 16K 2K $0.5 $1.5 5%
29 openai/gpt-4o 2024-01-25 128K 16K $2.5 $10 5%
30 openai/gpt-4o-2024-05-13 2024-05-13 128K 4K $5 $15 5%
31 openai/gpt-4o-2024-08-06 2024-08-06 128K 16K $2.5 $10 5%
32 openai/gpt-4o-2024-11-20 2024-11-20 128K 16K $2.5 $10 5%
33 openai/gpt-4o-mini 2024-01-25 128K 16K $0.15 $0.6 5%
34 openai/gpt-4o-mini-2024-07-18 2024-07-18 128K 16K $0.15 $0.6 5%
35 openai/gpt-4o:extended 2024-01-25 128K 64K $6 $18 5%
36 openai/o1 2024-03-14 200K 100K $15 $60 5%
37 openai/o1-mini 2024-03-14 128K 66K $3 $12 5%
38 openai/o1-mini-2024-09-12 2024-09-12 128K 66K $3 $12 5%
39 openai/o1-preview 2024-03-14 128K 33K $15 $60 5%
40 openai/o1-preview-2024-09-12 2024-09-12 128K 33K $15 $60 5%

※上記は2025年1月5日時点のものです、最新はOpenRouterのModelsページを参照してください

Models | OpenRouter

5.2. OpenAI

OpenAIは2024年12月5日から12月17日までの「12 days of OpenAI」イベントにおいて、12月6日の「Day 2」で「OpenAI o1」を正式リリースしました。2025年1月6日時点で、Codeforcesのベンチマークでgpt-4oを大きく上回る性能を示しています。

現時点でRoo-Clineに「OpenAI o1」を使用するのが最も効果的と考えられますが、2025年1月6日時点ではpreviewバージョンにしか対応していません。o1-previewも高い性能を期待できますが、100万トークンあたりInput 15USD、Output 60USDという料金設定は、トークンを大量消費するRoo-Clineにとって開発効率の向上がコストに見合うか懸念があります。

Roo-ClineでGemini Flash 1.5を使用すると解決できないエラーの無限ループに陥ることがありますが、そのような場合にのみo1モデルを使用するという方法が、コストパフォーマンスを保つ現実的な選択かもしれません。

Roo-ClineのAPIプロバイダーにはOpenAIとOpenAI Compatibleがあります。Azure OpenAIなどを利用する場合は、APIエンドポイント、デプロイ名、APIバージョンなどの付加情報を指定するためにOpenAI Compatibleを選択し、以下のパラメータを設定する必要があります。(以下は実際に動作確認済みの設定例です。)

ポイントはBase URLにエンドポイント、モデルデプロイ名、APIバージョンを含めて以下のように記載することです。

Base URL: https://(エンドポイント)/openai/deployments/(モデルデプロイ名)/chat/completions?api-version=(APIバージョン)

APIプロバイダー:OpenAI Compatible
Base URL:https://ptf-eus.openai.azure.com//openai/deployments/gpt-4o-mini/chat/completions?api-version=2024-06-01(エンドポイントとデプロイ名、モデルバージョンを含む)
APIキー:APIキー
Search and select a modle:gpt-4o-mini(デフォルトモデル名)
Set Azure API Version:2024-08-01-preview

benchmark_o1_codeforces.png

benchmark_o1_improvement.png

※OpenAI社の「Learning to Reason with LLMs」から引用

No 言語モデル リリース日 Context Max Output Input Output
1 gpt-4o 2024-01-25 128K 16K $2.5 $10
2 gpt-4o-mini 2024-01-25 128K 16K $0.15 $0.6
3 o1-mini 2024-03-14 128K 66K $3 $12
4 o1-preview 2024-03-14 128K 33K $15 $60

※上記は2025年1月5日時点のものです、最新はOpenAIの料金ページを参照してください

5.3. Anthropic

Roo-Cline(Cline)は、もともとClaude-devという名前のVisual Studio Code拡張機能として開発されたこともあり、Anthropicのclaude-3.5-sonnetとの相性が抜群です。
RooVetGit/Roo-ClineREADME.mdにも、Claude 3.5 Sonnetのエージェントコーディング機能への敬意が示されています。

従って、相性的には本命はclaude-3.5-sonnetだと思われます。
OpenRouterからも利用できるため、Anthropic個別契約はしなくても良いかと思われます。

Thanks to Claude 3.5 Sonnet's agentic coding capabilities, Cline can handle complex software development tasks step-by-step. With tools that let him create & edit files, explore large projects, use the browser, and execute terminal commands (after you grant permission), he can assist you in ways that go beyond code completion or tech support. Cline can even use the Model Context Protocol (MCP) to create new tools and extend his own capabilities. While autonomous AI scripts traditionally run in sandboxed environments, this extension provides a human-in-the-loop GUI to approve every file change and terminal command, providing a safe and accessible way to explore the potential of agentic AI.

Enter your task and add images to convert mockups into functional apps or fix bugs with screenshots.
Cline starts by analyzing your file structure & source code ASTs, running regex searches, and reading relevant files to get up to speed in existing projects. By carefully managing what information is added to context, Cline can provide valuable assistance even for large, complex projects without overwhelming the context window.
Once Cline has the information he needs, he can:
Create and edit files + monitor linter/compiler errors along the way, letting him proactively fix issues like missing imports and syntax errors on his own.
Execute commands directly in your terminal and monitor their output as he works, letting him e.g., react to dev server issues after editing a file.
For web development tasks, Cline can launch the site in a headless browser, click, type, scroll, and capture screenshots + console logs, allowing him to fix runtime errors and visual bugs.
When a task is completed, Cline will present the result to you with a terminal command like , which you run with a click of a button.open -a "Google Chrome" index.html
No 言語モデル リリース日 Context Max Output Input Output
1 claude-3-5-sonnet-20241022 2024-10-22 200K 100K $3 $15
2 claude-3-5-haiku-20241022 2024-10-22 128K 66K $0.8 $4
3 claude-3-opus-20240229 2024-02-29 200K 100K $15 $75
4 claude-3-haiku-20240307 2024-03-07 128K 66K $0.25 $1.25

※上記は2025年1月5日時点のものです、最新はAnthropicのPricingページを参照してください

5.5. Google

Google gemini-flash-1.5はなんといってもコスパ最高です。
いちおう、Google GeminiのAPI契約もしましたが、OpenRouterに課金しているので、GeminiはOpenRouter経由で使います。
私のGeminiの設定は以下の通りです。

APIプロバイダー:OpenRouter
OpenRouter API Key:APIキー
Compress prompts and message chains to the context size (OpenRouter Transforms)にチェック
Model:google/gemini-flash-1.5

or

APIプロバイダー:Google Gemini
Gemini API Key:APIキー
Model:gemini-1.5-flash-002
No 言語モデル リリース日 Context Max Output Input Output
1 gemini-2.0-flash-exp:free 2024-12-19 1.05M 8K $0 $0
2 gemini-2.0-flash-thinking-exp:free 2024-12-19 40K 8K $0 $0
3 gemini-exp-1114:free 2023-11-14 32K 4K $0 $0
4 gemini-exp-1121:free 2023-11-21 32K 4K $0 $0
5 gemini-exp-1206:free 2023-12-06 32K 4K $0 $0
6 gemini-flash-1.5 2024-08-27 128K 16K $0.5 $1.5
7 gemini-flash-1.5-8b 2024-08-27 128K 16K $0.25 $0.75
8 gemini-flash-1.5-8b-exp 2024-08-27 128K 16K $0.25 $0.75
9 gemini-flash-1.5-exp 2024-08-27 128K 16K $0.5 $1.5
10 gemini-pro 2023-12-06 32K 4K $0.25 $0.75
11 gemini-pro-1.5 2024-08-27 128K 8K $0.25 $0.75
12 gemini-pro-1.5-exp 2024-08-27 128K 8K $0.25 $0.75
13 gemini-pro-vision 2023-12-13 32K 4K $0.25 $0.75

6.実行結果

6.1. 素数の計算

APIプロバイダーをAzure OpenAIに設定して素数を表示するPythonのプログラムを作成してもらいました。
Roo-ClineのCustom Instructionの設定はSunwood-ai-labs/MysticLibraryさんのprompt/codding/CLAUDE-DEV-SYSTEM-PROMT-PS.mdを設定させていただいています。
記事は「cline (旧:Claude-dev) 向けPowerShellシステムプロンプトの開発」を参照してください。

APIプロバイダーの設定は以下の通りです

APIプロバイダー:OpenAI Compatible
Base URL:https://ptf-eus.openai.azure.com//openai/deployments/gpt-4o-mini/chat/completions?api-version=2024-06-01(エンドポイントとデプロイ名、モデルバージョンを含む)
APIキー:APIキー
Search and select a modle:gpt-4o-mini(デフォルトモデル名)
Set Azure API Version:2024-08-01-preview

エクスプローラで空のプロジェクトフォルダPrimeNumberを作成してvscodeで空のPrimeNumberフォルダを開いておき、以下のプロンプトを入力します。

プロンプト:1から100までの素数を計算して表示するPythonプログラムを作成してください

上記プロンプトで実際に実行されたのは以下の内容です。
① Pythonプログラムを作成するためのファイルを作成します。
② プログラムの内容を記述します。(コーディング)
③ prime_numbers.pyファイルの保存(vscodeで開いていたフォルダに保存されます)
④ PowerShellを使用して生成したprime_numbers.pyをPythonで実行
⑤ ローカルGitにコミット(ちゃんとgit addもしてくれるし、コミットメッセージはいい感じに考えてくれる)
 (当然、git initはしていないので、git commitでエラーになるのですが、エラーを自動検出して、git initを実行して.gitフォルダを生成し、その後git commitしてくれてます)
 git commitが一度エラーになるのがRoo-Cline(Cline)がカワイイところですが、プロンプトを消費してくれます。

因みにこちらの作業で消費したプロンプトはInput:116.5k($0.003495:)、Output:1.5k($0.00009)で合計$0.00359(日本円で0.5385円)でした。
gpt-4o-miniは安いですね

上記コストはChatGPT o1で費用を計算してもらったものです。

Roo-Clineはvscodeのコンソールで以下のように生成したコードも自動実行してくれます。
以下の例では実行後にgit commitしようとしてgit initされていないエラーが発生し、その後自動的にgit initコマンドを実行して再コミットする様子の記録です。

PS Q:\OneDrive\Python\PrimeNumber> python prime_numbers.py
1から100までの素数: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
PS Q:\OneDrive\Python\PrimeNumber> git add prime_numbers.py; git commit -m " feat: 1から100までの素数を計算するプログラムを作成
>> 
>> 1から100までの素数を計算し、表示するPythonプログラムを作成しました。"
fatal: not a git repository (or any of the parent directories): .git
fatal: not a git repository (or any of the parent directories): .git
PS Q:\OneDrive\Python\PrimeNumber> git init
Initialized empty Git repository in Q:/OneDrive/Python/PrimeNumber/.git/
PS Q:\OneDrive\Python\PrimeNumber> git add prime_numbers.py; git commit -m " feat: 1から100までの素数を計算するプログラムを作成
>> 
>> 1から100までの素数を計算し、表示するPythonプログラムを作成しました。"
[master (root-commit) 3d7382b]  feat: 1から100までの素数を計算するプログラムを作成
 1 file changed, 16 insertions(+)
 create mode 100644 prime_numbers.py
PS Q:\OneDrive\Python\PrimeNumber>

gitのコミットの結果をログから確認

local_git_repositry.png

6.2. リアルタイム文字起こしツールの生成

OpenRouterのanthropic/claude-3.5-sonetを使って2024年11月30日に試したaoai-realtime-audio-sdkのrtclientを使ってリアルタイム文字起こしプログラムを作ってもらいます。

real-time-transcript.png

プロンプト

aoai-realtime-audio-sdkを使ってPythonで話した言葉を文字起こしするツールを作成してください。
必要なrtclientパッケージはインストールしてください。
AZURE_OPENAI_ENDPOINTAZURE_OPENAI_API_KEYAZURE_OPENAI_DEPLOYMENTOPENAI_API_KEY.envファイルから読み取るようにしてください。
利用するモデルはAzure OpenAIgpt-4o-realtime-previewモデルです。
コンピュータのマイクからの入力はpyaudioのエコーキャンセル機能を使ってください。

当初の指示ではgpt-4o-realtime-previewモデルを使用する予定でしたが、実装上の課題があり、途中でWhisperモデルに切り替えることになりました。約20分間のトライアンドエラーを経て、最終的に動作するコードを生成できました。

East US2リージョンのWhisperには1分あたり3回という要求レート制限があり、この制限に対応する必要がありました。また、システムが複数のマイクを検出したため、当初は全てのマイクからの入力を監視する仕様となっていました。

このプロセスを通じて、AIの優れたエラー診断能力と問題解決力を実感することができました。

Whisperには1分あたり3回という要求レート制限では現実的に使えるものではありませんが、自然言語でコードが作成できるのは素晴らしいです。

import os
import pyaudio
import wave
import asyncio
import json
from dotenv import load_dotenv
from openai import AsyncAzureOpenAI

# 環境変数の読み込み
load_dotenv()

# Azure OpenAI の設定
client = AsyncAzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    api_version="2024-02-15-preview",
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT")
)

# PyAudio の設定
CHUNK = 4096
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100

class AudioTranscriber:
    def __init__(self):
        self.p = pyaudio.PyAudio()
        
        # Logicool BRIOのデバイスインデックスを取得
        self.device_index = self.get_brio_device_index()
        if self.device_index is None:
            raise ValueError("Logicool BRIOが見つかりませんでした。")
        
        print(f"\nLogicool BRIO (デバイス {self.device_index}) を使用します。")
        
        # 入力デバイスの設定
        self.stream = self.p.open(
            format=FORMAT,
            channels=CHANNELS,
            rate=RATE,
            input=True,
            frames_per_buffer=CHUNK,
            input_device_index=self.device_index,
            stream_callback=self._audio_callback
        )
        
        self.frames = []
        self.is_recording = True
        self.silence_threshold = 1500  # 無音判定のしきい値を大幅に引き上げ
        self.last_transcription_time = 0
        self.min_transcription_interval = 20.0  # 20秒間隔(1分間に3回まで)

    def get_brio_device_index(self):
        """Logicool BRIOのデバイスインデックスを取得"""
        print("\n利用可能なオーディオデバイス:")
        for i in range(self.p.get_device_count()):
            dev_info = self.p.get_device_info_by_index(i)
            if dev_info.get('maxInputChannels') > 0:
                device_name = dev_info.get('name')
                print(f"デバイス {i}: {device_name}")
                # Logicool BRIOを探す
                if "BRIO" in device_name:
                    return i
        return None

    def _audio_callback(self, in_data, frame_count, time_info, status):
        if self.is_recording:
            self.frames.append(in_data)
        return (in_data, pyaudio.paContinue)

    def is_silent(self, data):
        """音声データが無音かどうかを判定"""
        # 音量レベルをデバッグ表示
        volume_level = max(abs(int.from_bytes(data[i:i+2], 'little', signed=True)) 
                         for i in range(0, len(data), 2))
        print(f"現在の音量レベル: {volume_level}")
        return volume_level < self.silence_threshold

    async def transcribe_audio(self):
        try:
            print("音声認識を開始しました。Ctrl+Cで終了します。")
            print("マイクに向かって話してください。")
            print(f" レート制限により、{self.min_transcription_interval}秒ごとに音声認識を実行します。")
            print(f" 無音判定のしきい値: {self.silence_threshold}")
            
            self.stream.start_stream()
            buffer_duration = 5.0  # 5秒分のバッファ
            samples_per_buffer = int(RATE * buffer_duration)
            
            while self.stream.is_active():
                current_time = asyncio.get_event_loop().time()
                
                # レート制限に基づく最小間隔を確保
                if current_time - self.last_transcription_time < self.min_transcription_interval:
                    await asyncio.sleep(0.1)
                    continue

                if len(self.frames) * CHUNK >= samples_per_buffer:
                    # フレームをまとめて音声データとして処理
                    audio_data = b''.join(self.frames)
                    self.frames = []

                    # 無音でない場合のみ処理
                    if not self.is_silent(audio_data):
                        print("音声を検出しました。文字起こしを開始します...")
                        # WAVファイルとして保存
                        with wave.open("temp.wav", 'wb') as wf:
                            wf.setnchannels(CHANNELS)
                            wf.setsampwidth(self.p.get_sample_size(FORMAT))
                            wf.setframerate(RATE)
                            wf.writeframes(audio_data)

                        # 音声認識を実行
                        try:
                            with open("temp.wav", "rb") as audio_file:
                                response = await client.audio.transcriptions.create(
                                    model=os.getenv("AZURE_OPENAI_DEPLOYMENT"),
                                    file=audio_file,
                                    response_format="text",
                                    language="ja"
                                )
                                if response and response.strip():
                                    print(f"認識結果: {response}")
                                    self.last_transcription_time = current_time
                        except Exception as e:
                            if "429" in str(e):
                                print("APIレート制限に達しました。20秒後に再開します。")
                                await asyncio.sleep(20)
                            else:
                                print(f"音声認識エラー: {str(e)}")
                                await asyncio.sleep(2)
                    else:
                        print("無音を検出しました。スキップします。")

                await asyncio.sleep(0.1)

        except KeyboardInterrupt:
            print("\n音声認識を終了します。")
        finally:
            self.cleanup()

    def cleanup(self):
        self.is_recording = False
        self.stream.stop_stream()
        self.stream.close()
        self.p.terminate()
        if os.path.exists("temp.wav"):
            os.remove("temp.wav")

async def main():
    transcriber = AudioTranscriber()
    await transcriber.transcribe_audio()

if __name__ == "__main__":
    asyncio.run(main())

transcribe.png

OpenRouterの課金
この作業を行う前は9.7USDくらいでしたので、約1USDくらい消費しました。
自然言語だけでコードが作成できてこの価格

openrouter_credits.png

7.感想

これまでVSCodeの拡張機能のGenie AIをコーディングアシスタントとして使用してきましたが、Roo-Clineは操作が不要で感動的な体験でした。

推論モデルやRoo-ClineのCustom Instructionsの設定に起因する可能性がありますが、Claude-3.5-SonnetやGPT-4o-miniを使用しても、やはりケアレスミスが目立ちます。

たとえば、最初にpip installを実行すれば防げるエラーでも、生成したコードをすぐに実行してパッケージ不足のエラーが発生し、それをトリガーにしてpip installが実行されるといった具合です。

このpip installの繰り返しは少しストレスを感じます。また、毎回プロンプトとエラーをコンテキストとして次のアクションを実行するため、大量のプロンプトトークンを消費してしまいます。無限ループなども自動検出されず、Ctrl+Cでプログラムを停止した後に、LLMが無限ループを認識するという状況です。

細かい部分では改善の余地がまだありますが、総合的に見て、これは間違いなく未来を感じさせる自律型AIエージェントだと言えます。

8.参考URL

54
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?