ボイストゥジャーナル:Whisper APIで録音の文字起こしと気分分析
音声Recordingを受け取り、OpenAIのWhisperで文字起こし、センチメントとエンティティ分析で日記エントリを自動タグ付けするNode.jsサービスを構築します。
このページの内容
ジャーナリングは自己 省察と心の明晰さを得るための強力なツールです。しかし、さらに洞察しやすく、手間なくことはできないでしょうか?自由に思考を话来して、的文字起こしされるだけでなく気分や主要なトピックを分析されたら 어떨까요?このプロジェクトでは、まさにそれを実現する「Voice-to-Journal」アプリケーションの構築をガイドします。
OpenAIのWhisper APIを使って音声录制を受け取り、高い精度で文字起こしを行い、その後感情分析和エンティティ分析を自動実行してジャーナルエントリにタグを付けるNode.jsサービスを作成します。このプロジェクトは、AI活用アプリケーションの世界への素晴らしい入り口であり、異なるAIモデルを組み合わせることで本当に有用的なものを作成する驚くべき可能性を示しています。AIとメンタルヘルス技術の交差点に興味を持つ開発者にとって、これは完璧なポートフォリオプロジェクトです。
前提条件:
- JavaScriptとNode.jsの基本的な理解
- マシンにインストールされたNode.jsとnpm(またはyarn)
- OpenAI APIキー
- VS Codeのようなコードエディタ
問題点の理解
伝統的なジャーナリングは効果的なものの、時には面倒に感じることもあります。長時間のエントリを入力するのは遅く、特定の記憶に戻って見つけることや気分を経時的に追跡することは困難なことが多いです。音声ジャーナリングは素晴らしい代替案ですが、それでも検索や分析が難しい音声ファイルが残ります。
私たちのアプリケーションは、シームレスなパイプラインを作成することでこれ問題を解決します:
- 音声入力: 話すことで自然思考をキャプチャ
- AI文字起こし: ほぼ人間に近い精度で音声をテキストに変換
- AI分析: テキストから意味のある洞察(気分とトピック)を抽出
- 構造化データ: ジャーナルエントリを構造化され検索可能な形式で保存
このアプローチにより、非構造化の音声データが、豊かで整理された洞察に満ちた個人日記に変換されます。
前提条件
コーディングを始める前に、開発環境を設定しましょう。
1. プロジェクトの設定:
プロジェクトの新しいディレクトリを作成し、Node.jsプロジェクトを初期化します:
mkdir voice-to-journal
cd voice-to-journal
npm init -y
2. 依存関係のインストール:
サーバーを起動するには、いくつかのパッケージが必要です:
express:Node.js用の高速で柔軟性があり、ミニマリストなWebフレームワークmulter:ファイルのアップロード主に使用されるmultipart/form-dataを処理するNode.js ミドルウェアopenai:OpenAI APIの公式Node.jsライブラリsentiment:AFINN単語リストを使用した感情分析を行うNode.jsモジュールwink-nlp:固有表現抽出に優れたNode.js用自然言語処理ライブラリdotenv:.envファイルから環境変数をprocess.envにロードするゼロ依存モジュール
次のコマンドですべてインストールします:
npm install express multer openai sentiment wink-nlp dotenv
3. OpenAI APIキー:
まだお持ちでない場合は、OpenAIアカウントにサインアップして、新しいAPIキーを作成してください。
APIキーを安全に保存するための.envファイルをプロジェクトのルートに作成します:
OPENAI_API_KEY=your_api_key_here
ステップ1:Expressサーバーとファイルアップロードの設定
まず、音声ファイルのアップロードを処理できる基本的なExpressサーバーを作成します。
何をするか
音声ファイルを含むPOSTリクエストを受け取る単一のエンドポイントを持つExpressサーバーを設定します。Multerを使用してアップロードされたファイルを処理し、ローカルディレクトリに保存します。
実装
index.jsという名前のファイルを作成し、次のコードを追加します:
// index.js
require('dotenv').config();
const express = require('express');
const multer = require(' multer');
const fs = require('fs');
const app = express();
const port = 3000;
// Multerでファイルアップロードを設定
const upload = multer({ dest: 'uploads/' });
app.post('/journal', upload.single('audio'), (req, res) => {
if (!req.file) {
return res.status(400).send('No audio file uploaded.');
}
res.json({ message: 'File uploaded successfully', file: req.file });
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
仕組み
- Expressアプリケーションを初期化します
- アップロードされたファイルを
uploads/ディレクトリに保存するようにMulterを設定します /journalエンドポイントを作成し、upload.single('audio')をミドルウェアとして使用します。これにより、Multerは'audio'というフィールド名で単一のファイル ожидатьようになります- アップロードされたファイルの情報は
req.fileから利用可能です
エンドポイントのテスト
Postmanやcurlなどのツールを使用してこのエンドポイントをテストできます。プロジェクトのルートにuploadsディレクトリを作成してください。
curl -X POST -F "audio=@/path/to/your/audio.mp3" http://localhost:3000/journal
ファイルアップロードを確認するJSON応答と、uploadsディレクトリ内の新しいファイルが表示されます。
ステップ2:Whisper APIで音声を文字起こし
音声ファイルをアップロードできるようになったので、OpenAI Whisper APIに送信して文字起こしを行いましょう。
何をするか
アップロードされた音声ファイルのパスを取り、読み取り可能なストリームを作成し、OpenAI APIの文字起こしエンドポイントに渡します。
実装
index.jsファイルを次の変更で更新します:
// index.js (continued)
const { OpenAI } = require('openai');
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
// ... (previous code)
app.post('/journal', upload.single('audio'), async (req, res) => {
if (!req.file) {
return res.status(400).send('No audio file uploaded.');
}
try {
const transcription = await openai.audio.transcriptions.create({
file: fs.createReadStream(req.file.path),
model: 'whisper-1',
});
// アップロードされたファイルのクリーンアップ
fs.unlinkSync(req.file.path);
res.json({ transcription: transcription.text });
} catch (error) {
console.error('Error with OpenAI API:', error);
res.status(500).send('Failed to transcribe audio.');
}
});
仕組み
- APIキーでOpenAIクライアントを初期化します
/journalエンドポイントでawaitを使用するためにasync関数に変更しますopenai.audio.transcriptions.createを使用して音声ファイルをWhisperに送信しますfs.createReadStream(req.file.path)はアップロードされたファイルから読み取り可能なストリームを作成し、大きなファイルにより効率的です- 強力で正確な文字起こしモデルである
whisper-1モデルを指定します - 文字起こしを取得した後、
fs.unlinkSyncを使用してサーバーから一時音声ファイルを削除します
これで、/journalエンドポイントに音声ファイルを送信すると、テキストに変換された文字起こしを含むJSON応答が返されます。
ステップ3:感情分析で気分を分析
テキストが手元にあるので、その感情的なトーンを分析しましょう。
何をするか
sentimentライブラリを使用して文字起こしテキストを分析し、感情スコアを取得します。
実装
sentimentライブラリをエンドポイントに統合しましょう:
// index.js (continued)
const Sentiment = require('sentiment');
const sentiment = new Sentiment();
// ... (previous code)
app.post('/journal', upload.single('audio'), async (req, res) => {
// ... (file upload and transcription logic)
try {
// ... (transcription code)
const journalText = transcription.text;
const sentimentResult = sentiment.analyze(journalText);
// ... (cleanup)
res.json({
transcription: journalText,
sentiment: sentimentResult,
});
} catch (error) {
// ... (error handling)
}
});
仕組み
- Sentimentアナライザーの新しいインスタンスを作成します
- Whisperからの
journalTextをsentiment.analyze()に渡します - これは
score(全体的な感情)、comparativeスコア(単語あたりのスコア)、およびテキストで見つかった肯定的な単語と否定的な単語の配列を含むオブジェクトを返します
応答には、文字起こしと詳細な感情分析の両方が含まれるようになります。正のスコアは肯定的な気分を示し、負のスコアはより否定的なトーンを示します。
ステップ4:固有表現抽出(NER)による自動タグ付け
ジャーナルエントリをさらに便利にするために、人、場所、組織などの主要なエンティティを自動的に識別してタグ付けしましょう。
何をするか
wink-nlpを使用して、文字起こしテキストに対して固有表現抽出を実行します。
実装
まず、wink-nlpモデルをロードする必要があります。その後、テキストを処理してエンティティを見つけることができます。
// index.js (continued)
const winkNLP = require('wink-nlp');
const model = require('wink-eng-lite-web-model');
const nlp = winkNLP(model);
// ... (previous code)
app.post('/journal', upload.single('audio'), async (req, res) => {
// ... (file upload and transcription logic)
try {
// ... (transcription and sentiment code)
const journalText = transcription.text;
const sentimentResult = sentiment.analyze(journalText);
const doc = nlp.readDoc(journalText);
const entities = doc.entities().out();
// ... (cleanup)
res.json({
transcription: journalText,
sentiment: sentimentResult,
tags: entities
});
} catch (error) {
// ... (error handling)
}
});
仕組み
wink-nlp用の事前訓練済み英語言語モデルをロードしますnlp.readDoc(journalText)はテキストを処理してドキュメントオブジェクトを作成しますdoc.entities().out()はすべての認識されたエンティティを抽出して配列として返します。各エンティティにはvalue(テキスト)とtype(例:PERSON、LOCATION、DATE)があります
すべてをまとめる
index.jsファイルの完全なコードです。すべてのステップを統合しています:
// index.js
require('dotenv').config();
const express = require('express');
const multer = require('multer');
const fs = require('fs');
const { OpenAI } = require('openai');
const Sentiment = require('sentiment');
const winkNLP = require('wink-nlp');
const model = require('wink-eng-lite-web-model');
const app = express();
const port = 3000;
// AIツールの初期化
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const sentiment = new Sentiment();
const nlp = winkNLP(model);
// Multerでファイルアップロードを設定
const upload = multer({ dest: 'uploads/' });
app.post('/journal', upload.single('audio'), async (req, res) => {
if (!req.file) {
return res.status(400).send('No audio file uploaded.');
}
try {
// 1. Whisperで音声を文字起こし
const transcription = await openai.audio.transcriptions.create({
file: fs.createReadStream(req.file.path),
model: 'whisper-1',
});
const journalText = transcription.text;
// 2. 感情を分析
const sentimentResult = sentiment.analyze(journalText);
// 3. エンティティを抽出(タグ)
const doc = nlp.readDoc(journalText);
const entities = doc.entities().out();
const tags = entities.map(entity => ({ value: entity.value, type: entity.type }));
res.json({
transcription: journalText,
sentiment: {
score: sentimentResult.score,
comparative: sentimentResult.comparative,
},
tags: tags,
});
} catch (error) {
console.error('Error processing journal entry:', error);
res.status(500).send('Failed to process journal entry.');
} finally {
// アップロードされたファイルのクリーンアップ
fs.unlinkSync(req.file.path);
}
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
これで、音声ファイルとの単一のAPI呼び出しで、文字起こし、気分分析、関連するタグを含む詳細なJSONオブジェクトが返されます!
セキュリティのベストプラクティス
- APIキー管理: OpenAI APIキーなどの機密情報には常に環境変数を使用してください。ソースコードにハードコードしないでください。
- 入力検証: Multerがファイルアップロードを処理しますが、乱用を防ぐためにファイルサイズとタイプのチェックを確認してください。
- エラーハンドリング: API呼び出しやファイル処理の問題を適切に管理するために、堅牢なエラーハンドリングを実装してください。
結論
尖端的なAI機能を活用した強力なVoice-to-Journalサービスを構築しました。このプロジェクトは、異なるAIモデルをつなげて真的価値のあるアプリケーションを作成できることを実証しています。ここから、データベースを追加してジャーナルエントリを保存したり、フロントエンドインターフェースを構築したり、気分を経時的に可視化するを作成したりすることで、このプロジェクトを拡張できます。
AIの世界には多くのエキサイティングな可能性があり、このプロジェクトがあなた自身のインテリジェントアプリケーションを構築するきっかけになれば嬉しいです。
リソース
- OpenAI API Documentation
- Express.js Official Website
- Multer on npm
- sentiment on npm
- wink-nlp Documentation
クイックリファレンス
| 側面 | 主要情報 |
|---|---|
| トピック | 開発 |
| 関連性 | 患者教育と意識向上 |
| アクション | 医療提供者との相談 |
| 頻度 | ケアチーム推奨通り |
| エビデンス | 現在のがんガイドラインに基づく |
よくある質問
Q: これが自分に該当するどうかはどう就知道できますか? A: 個人的および家族のがん既往歴について医療提供者と相談し、個別リスク因子を評価し、適切な次のステップを決定してください。
Q: 医師に何を聞くべきですか? A: 良い質問には次のようなものがあります:「私の結果は何を意味しますか?」「私のオプションは何ですか?」「どのような生活習慣の変更が役立ちますか?」「いつフォローアップすべきですか?」
Q: 健康を改善するのに役立つ生活習慣の変更はありますか? A: ほとんどの健康状態は、基本的な対策として効果的です:バランスの取れた栄養、定期的な運動(週150分以上)、質の良い睡眠(7〜9時間)、ストレス管理、タバコの回避。
医学的免責事項
この記事は教育目的のみを目的としており、医学的なアドバイスを构成するものではありません。健康、治療、またはケアに関する決定を行う前には、必ず資格のある医療提供者と相談してください。個人の状況によって異なり、一人に適切なものが別の人に適しているとは限りません。
医学的緊急事態が発生した場合は、直ちに911(またはお住まいの地域の緊急電話番号)に連絡してください。