{"id":140,"date":"2026-04-06T08:00:00","date_gmt":"2026-04-05T23:00:00","guid":{"rendered":"https:\/\/classlab.co.jp\/engineer\/blog\/ai-voice-roleplay-training-2\/"},"modified":"2026-04-06T08:00:00","modified_gmt":"2026-04-05T23:00:00","slug":"ai-voice-roleplay-training-2","status":"publish","type":"post","link":"https:\/\/classlab.co.jp\/engineer\/blog\/ai-voice-roleplay-training-2\/","title":{"rendered":"AI\u97f3\u58f0\u30ed\u30fc\u30eb\u30d7\u30ec\u30a4\u7814\u4fee\u3092\u5185\u88fd\u3057\u305f\u8a71"},"content":{"rendered":"<blockquote>\n<p>ClassLab Engineering \u306e Dev \u30c1\u30fc\u30e0\u30e1\u30f3\u30d0\u30fc\u304c\u57f7\u7b46\u3057\u307e\u3057\u305f\u3002<\/p>\n<\/blockquote>\n<p>*\u3053\u306e\u8a18\u4e8b\u306f\u3001\u97f3\u58f0AI\u30fb\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0API\u30fbElectron\u3067\u306e\u696d\u52d9\u30c4\u30fc\u30eb\u958b\u767a\u306b\u8208\u5473\u304c\u3042\u308b\u30a8\u30f3\u30b8\u30cb\u30a2\u5411\u3051\u3067\u3059\u3002*<\/p>\n<h2>1. \u80cc\u666f<\/h2>\n<p>ClassLab \u306e\u30b3\u30fc\u30eb\u30bb\u30f3\u30bf\u30fc\u3067\u306f\u3001\u65b0\u4eba\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u304c\u96fb\u8a71\u5fdc\u5bfe\u30b9\u30ad\u30eb\u3092\u8eab\u306b\u3064\u3051\u308b\u307e\u3067\u306b\u4e00\u5b9a\u306e\u7814\u4fee\u671f\u9593\u304c\u5fc5\u8981\u3067\u3059\u3002\u5f93\u6765\u306f\u30d9\u30c6\u30e9\u30f3\u793e\u54e1\u304c\u30ed\u30fc\u30eb\u30d7\u30ec\u30a4\u306e\u76f8\u624b\u5f79\u3092\u52d9\u3081\u3066\u3044\u307e\u3057\u305f\u304c\u3001\u4ee5\u4e0b\u306e\u554f\u984c\u304c\u3042\u308a\u307e\u3057\u305f\u3002<\/p>\n<ul>\n<li>\u30d9\u30c6\u30e9\u30f3\u793e\u54e1\u304c\u7814\u4fee\u306b\u62d8\u675f\u3055\u308c\u3001\u672c\u6765\u696d\u52d9\u304c\u5727\u8feb\u3055\u308c\u308b<\/li>\n<li>\u7814\u4fee\u306e\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u8abf\u6574\u304c\u96e3\u3057\u304f\u3001\u65b0\u4eba\u304c\u5341\u5206\u306a\u7df4\u7fd2\u91cf\u3092\u78ba\u4fdd\u3067\u304d\u306a\u3044<\/li>\n<li>\u30ed\u30fc\u30eb\u30d7\u30ec\u30a4\u306e\u8a55\u4fa1\u57fa\u6e96\u304c\u5c5e\u4eba\u7684\u3067\u3001\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u306e\u8cea\u306b\u3070\u3089\u3064\u304d\u304c\u3042\u308b<\/li>\n<p>\u300cAI\u304c\u9867\u5ba2\u5f79\u3092\u6f14\u3058\u3001\u901a\u8a71\u7d42\u4e86\u5f8c\u306b\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u3068\u6539\u5584\u70b9\u3092\u81ea\u52d5\u63d0\u793a\u3059\u308b\u300d\u30b7\u30b9\u30c6\u30e0\u3092\u5185\u88fd\u3059\u308b\u3053\u3068\u3067\u3001\u3053\u308c\u3089\u306e\u8ab2\u984c\u3092\u89e3\u6d88\u3057\u307e\u3057\u305f\u3002\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u306f <strong>Convers AI<\/strong> \u3067\u3059\u3002<\/p>\n<h2>2. \u8ab2\u984c<\/h2>\n<p>| \u8ab2\u984c | \u5f71\u97ff | \u5b9a\u91cf\u30c7\u30fc\u30bf |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;|&#8212;&#8212;&#8212;&#8211;|<br \/>\n| \u30d9\u30c6\u30e9\u30f3\u793e\u54e1\u306e\u62d8\u675f | \u7814\u4fee1\u56de\u3042\u305f\u308a2\u540d\u4f53\u5236\u304c\u5fc5\u8981 | \u6708\u9593\u7814\u4fee\u5de5\u6570 \u7d0440\u6642\u9593 |<br \/>\n| \u7df4\u7fd2\u91cf\u306e\u4e0d\u8db3 | \u65b0\u4eba1\u4eba\u3042\u305f\u308a\u90312-3\u56de\u3057\u304b\u5b9f\u65bd\u3067\u304d\u306a\u3044 | \u72ec\u308a\u7acb\u3061\u307e\u3067\u5e73\u57478\u9031\u9593 |<br \/>\n| \u8a55\u4fa1\u306e\u3070\u3089\u3064\u304d | \u62c5\u5f53\u8005\u306b\u3088\u308a\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u306e\u8cea\u304c\u7570\u306a\u308b | \u8a55\u4fa1\u57fa\u6e96\u304c\u6697\u9ed9\u77e5 |<br \/>\n| \u65e5\u672c\u8a9e\u97f3\u58f0\u306e\u51e6\u7406 | \u81ea\u52d5VAD\u304c\u65e5\u672c\u8a9e\u306e\u300c\u9593\u300d\u3067\u8aa4\u691c\u77e5 | \u767a\u8a71\u9014\u4e2d\u3067\u306e\u8aa4\u5207\u65ad\u304c\u591a\u767a |<\/p>\n<p>\u7279\u306b\u6280\u8853\u7684\u306b\u96e3\u3057\u304b\u3063\u305f\u306e\u306f\u3001<strong>\u65e5\u672c\u8a9e\u97f3\u58f0\u306e\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u51e6\u7406<\/strong>\u3067\u3059\u3002OpenAI Realtime API\u306e\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9VAD\uff08Voice Activity Detection\uff09\u306f\u82f1\u8a9e\u306b\u6700\u9069\u5316\u3055\u308c\u3066\u304a\u308a\u3001\u65e5\u672c\u8a9e\u306e\u300c\u9593\u300d\u3084\u76f8\u69cc\u3067\u767a\u8a71\u7d42\u4e86\u3068\u8aa4\u5224\u5b9a\u3055\u308c\u308b\u554f\u984c\u304c\u3042\u308a\u307e\u3057\u305f\u3002<\/p>\n<h2>3. \u8a2d\u8a08<\/h2>\n<h3>\u30b7\u30b9\u30c6\u30e0\u69cb\u6210<\/h3>\n<pre><code class=\"language-mermaid\">graph TB\n    subgraph \"Salesforce\"\n        LWC[LWC \u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u30d0\u30fc&lt;br\/&gt;\u7814\u4fee\u9805\u76ee\u30fb\u62c5\u5f53\u8005\u9078\u629e]\n    end\n\n    subgraph \"\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea Electron\"\n        FE[Vue.js 3 + Pinia&lt;br\/&gt;UI\u30fb\u72b6\u614b\u7ba1\u7406]\n        BE[Express 5 + WebSocket&lt;br\/&gt;\u97f3\u58f0\u51e6\u7406\u30fbAPI\u9023\u643a]\n        FFmpeg[FFmpeg&lt;br\/&gt;\u30ce\u30a4\u30ba\u4f4e\u6e1b\u30fb\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u5909\u63db]\n    end\n\n    BE --&gt; FFmpeg\n\n    subgraph \"\u5916\u90e8\u30b5\u30fc\u30d3\u30b9\"\n        RT[OpenAI Realtime API&lt;br\/&gt;\u97f3\u58f0\u30ed\u30fc\u30eb\u30d7\u30ec\u30a4]\n        CHAT[OpenAI Chat API o4-mini&lt;br\/&gt;\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u30fb\u5206\u6790]\n        SLACK[Slack API&lt;br\/&gt;\u9332\u97f3\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9]\n    end\n\n    LWC &lt;--&gt;|WebSocket| BE\n    FE &lt;--&gt;|WebSocket| BE\n    BE &lt;--&gt;|WebSocket| RT\n    BE --&gt;|REST| CHAT\n    BE --&gt;|REST| SLACK\n    BE --&gt;|REST OAuth2| LWC<\/code><\/pre>\n<h3>\u6280\u8853\u9078\u5b9a<\/h3>\n<p>| \u9805\u76ee | \u9078\u5b9a\u6280\u8853 | \u9078\u5b9a\u7406\u7531 |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;|<br \/>\n| \u30c7\u30b9\u30af\u30c8\u30c3\u30d7 | Electron 35 | Salesforce LWC\u3068\u306e\u30ed\u30fc\u30ab\u30eb\u901a\u4fe1\uff08localhost WebSocket\uff09\u304c\u5fc5\u8981 |<br \/>\n| \u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9 | Vue.js 3 + Pinia | \u8efd\u91cf\u3067\u5b66\u7fd2\u30b3\u30b9\u30c8\u304c\u4f4e\u3044\u3002\u72b6\u614b\u7ba1\u7406\u304c\u30b7\u30f3\u30d7\u30eb |<br \/>\n| \u30d0\u30c3\u30af\u30a8\u30f3\u30c9 | Express 5 + WebSocket (ws) | Electron\u30e1\u30a4\u30f3\u30d7\u30ed\u30bb\u30b9\u3067\u52d5\u4f5c\u3002\u53cc\u65b9\u5411\u901a\u4fe1\u304c\u5bb9\u6613 |<br \/>\n| \u97f3\u58f0AI | OpenAI Realtime API | \u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u97f3\u58f0\u5bfe\u8a71\u3002\u65e5\u672c\u8a9e\u5bfe\u5fdc\u3002\u4f4e\u9045\u5ef6 |<br \/>\n| \u5206\u6790AI | o4-mini | \u901a\u8a71\u7d42\u4e86\u5f8c\u306e\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u3002\u30b3\u30b9\u30c8\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u304c\u9ad8\u3044 |<br \/>\n| \u97f3\u58f0\u51e6\u7406 | FFmpeg (ffmpeg-static) | \u30ce\u30a4\u30ba\u4f4e\u6e1b\u30fb\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u5909\u63db\u3002\u30d1\u30c3\u30b1\u30fc\u30b8\u306b\u540c\u68b1\u53ef\u80fd |<\/p>\n<p>Web\u30a2\u30d7\u30ea\u3067\u306f\u306a\u304f <strong>Electron \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea<\/strong> \u3092\u9078\u3093\u3060\u7406\u7531\u306f\u3001Salesforce LWC\u3068\u306e\u9023\u643a\u65b9\u5f0f\u306b\u3042\u308a\u307e\u3059\u3002Salesforce \u306e\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u30d0\u30fc\uff08LWC\uff09\u304b\u3089 <code>ws:\/\/localhost:3001<\/code> \u3067\u30ed\u30fc\u30ab\u30eb\u30a2\u30d7\u30ea\u3068\u901a\u4fe1\u3059\u308b\u305f\u3081\u3001\u30d6\u30e9\u30a6\u30b6\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5236\u7d04\u3092\u56de\u907f\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3057\u305f\u3002<\/p>\n<h3>Push-to-Talk\uff08PTT\uff09\u30e2\u30fc\u30c9\u306e\u8a2d\u8a08\u5224\u65ad<\/h3>\n<p>\u672c\u30b7\u30b9\u30c6\u30e0\u6700\u5927\u306e\u8a2d\u8a08\u5224\u65ad\u306f\u3001<strong>OpenAI\u306e\u81ea\u52d5VAD\u3092\u7121\u52b9\u5316\u3057\u3001Push-to-Talk\u65b9\u5f0f\u3092\u63a1\u7528\u3057\u305f<\/strong>\u3053\u3068\u3067\u3059\u3002<\/p>\n<pre><code class=\"language-mermaid\">sequenceDiagram\n    participant OP as \u30aa\u30da\u30ec\u30fc\u30bf\u30fc\n    participant APP as Electron App\n    participant AI as OpenAI Realtime API\n\n    OP-&gt;&gt;APP: PTT\u30ad\u30fc\u62bc\u4e0b\uff08Shift+Space\uff09\n    APP-&gt;&gt;AI: response.cancel\n    Note over APP: AI\u5fdc\u7b54\u4e2d\u306a\u3089\u4e2d\u65ad\n    APP-&gt;&gt;AI: input_audio_buffer.clear\n    Note over APP: \u524d\u56de\u306e\u6b8b\u7559\u30d0\u30c3\u30d5\u30a1\u3092\u7834\u68c4\n\n    loop \u767a\u8a71\u4e2d\uff08PTT\u62bc\u4e0b\u4e2d\uff09\n        OP-&gt;&gt;APP: \u97f3\u58f0\u5165\u529b\uff08MediaRecorder WebM\uff09\n        APP-&gt;&gt;APP: FFmpeg WebM\u2192PCM16\u5909\u63db+\u30ce\u30a4\u30ba\u4f4e\u6e1b\n        APP-&gt;&gt;AI: input_audio_buffer.append\n    end\n\n    OP-&gt;&gt;APP: PTT\u30ad\u30fc\u89e3\u653e\n    APP-&gt;&gt;AI: input_audio_buffer.commit\n    APP-&gt;&gt;AI: response.create\n    AI-&gt;&gt;APP: response.audio.delta\uff08AI\u97f3\u58f0\uff09\n    APP-&gt;&gt;OP: \u30b9\u30d4\u30fc\u30ab\u30fc\u518d\u751f<\/code><\/pre>\n<p><strong>\u81ea\u52d5VAD\u3092\u4f7f\u308f\u306a\u3044\u7406\u7531<\/strong>:<\/p>\n<ul>\n<li>\u65e5\u672c\u8a9e\u306e\u300c\u9593\u300d\uff08\u6c88\u9ed9\uff09\u3092\u767a\u8a71\u7d42\u4e86\u3068\u8aa4\u5224\u5b9a\u3057\u3001\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306e\u767a\u8a71\u9014\u4e2d\u3067AI\u304c\u5272\u308a\u8fbc\u3080<\/li>\n<li>\u76f8\u69cc\uff08\u300c\u306f\u3044\u300d\u300c\u3048\u3048\u300d\uff09\u3092\u72ec\u7acb\u3057\u305f\u767a\u8a71\u3068\u8a8d\u8b58\u3057\u3001\u4e0d\u8981\u306a\u5fdc\u7b54\u304c\u8fd4\u308b<\/li>\n<li>\u30b3\u30fc\u30eb\u30bb\u30f3\u30bf\u30fc\u7814\u4fee\u3067\u306f\u767a\u8a71\u30bf\u30a4\u30df\u30f3\u30b0\u306e\u5236\u5fa1\u81ea\u4f53\u304c\u30b9\u30ad\u30eb\u306e\u4e00\u90e8\u3067\u3042\u308a\u3001\u610f\u56f3\u7684\u306b\u5236\u5fa1\u3059\u308b\u65b9\u304c\u8a13\u7df4\u52b9\u679c\u304c\u9ad8\u3044<\/li>\n<p>OpenAI API\u8a2d\u5b9a: <code>turn_detection: null<\/code>\uff08\u81ea\u52d5VAD\u5b8c\u5168\u7121\u52b9\u5316\uff09<\/p>\n<h2>4. \u5b9f\u88c5<\/h2>\n<h3>\u97f3\u58f0\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3<\/h3>\n<p>\u30de\u30a4\u30af\u5165\u529b\u304b\u3089OpenAI API\u3078\u306e\u9001\u4fe1\u307e\u3067\u306e\u97f3\u58f0\u51e6\u7406\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3067\u3059\u3002<\/p>\n<pre><code class=\"language-typescript\">\/\/ FFmpeg\u306b\u3088\u308b\u5165\u529b\u97f3\u58f0\u306e\u524d\u51e6\u7406\n\/\/ MediaRecorder\u304b\u3089WebM\/Opus\u5f62\u5f0f\u3067\u53d7\u3051\u53d6\u308a\u3001OpenAI\u8981\u6c42\u306ePCM16\u306b\u5909\u63db\nconst ffmpegArgs = [\n  '-f', 'webm',           \/\/ \u5165\u529b: MediaRecorder\u51fa\u529b\uff08WebM\/Opus 60ms chunks\uff09\n  '-i', 'pipe:0',         \/\/ stdin\u5165\u529b\n  '-af', [\n    'highpass=f=60',       \/\/ 60Hz\u4ee5\u4e0b\u3092\u30ab\u30c3\u30c8\uff08\u74b0\u5883\u30ce\u30a4\u30ba\u9664\u53bb\uff09\n    'lowpass=f=10000',     \/\/ 10kHz\u4ee5\u4e0a\u3092\u30ab\u30c3\u30c8\n    'volume=2.5',          \/\/ \u97f3\u91cf\u88dc\u6b63\n  ].join(','),\n  '-ar', '24000',          \/\/ OpenAI\u8981\u6c42: 24kHz\n  '-ac', '1',              \/\/ \u30e2\u30ce\u30e9\u30eb\n  '-f', 's16le',           \/\/ PCM 16bit Little Endian\n  '-fflags', '+nobuffer',  \/\/ \u4f4e\u9045\u5ef6\u30d5\u30e9\u30b0\n  '-flags', 'low_delay',\n  'pipe:1',                \/\/ stdout\u51fa\u529b\n];<\/code><\/pre>\n<h3>\u901a\u8a71\u5f8c\u306e\u81ea\u52d5\u5206\u6790<\/h3>\n<p>\u30ed\u30fc\u30eb\u30d7\u30ec\u30a4\u7d42\u4e86\u5f8c\u3001\u9332\u97f3\u97f3\u58f0\u3092Slack\u306b\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u3001o4-mini\u3067\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<pre><code class=\"language-typescript\">async function analyzeSession(\n  transcript: string,\n  trainingItem: TrainingItem\n): Promise&lt;AnalysisResult&gt; {\n  const response = await openai.chat.completions.create({\n    model: 'o4-mini',\n    messages: [\n      {\n        role: 'system',\n        content: `\u3042\u306a\u305f\u306f\u30b3\u30fc\u30eb\u30bb\u30f3\u30bf\u30fc\u306e\u54c1\u8cea\u7ba1\u7406\u62c5\u5f53\u8005\u3067\u3059\u3002\n\u4ee5\u4e0b\u306e\u7814\u4fee\u9805\u76ee\u306b\u57fa\u3065\u3044\u3066\u30ed\u30fc\u30eb\u30d7\u30ec\u30a4\u3092\u8a55\u4fa1\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\u7814\u4fee\u9805\u76ee: ${trainingItem.name}\n\u8a55\u4fa1\u57fa\u6e96: ${trainingItem.criteria}`,\n      },\n      {\n        role: 'user',\n        content: `\u4ee5\u4e0b\u306e\u901a\u8a71\u5185\u5bb9\u3092\u8a55\u4fa1\u3057\u3001JSON\u5f62\u5f0f\u3067\u8fd4\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n${transcript}`,\n      },\n    ],\n    response_format: { type: 'json_object' },\n  });\n\n  return JSON.parse(\n    response.choices[0].message.content ?? '{}'\n  );\n}<\/code><\/pre>\n<h3>Salesforce\u9023\u643a<\/h3>\n<p>\u5206\u6790\u7d50\u679c\u306fSalesforce \u306e\u30ab\u30b9\u30bf\u30e0\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u81ea\u52d5\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002LWC\u306e\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u30d0\u30fc\u304b\u3089\u7814\u4fee\u3092\u958b\u59cb\u3057\u3001\u7d50\u679c\u304cSalesforce\u306b\u623b\u308b\u4e00\u6c17\u901a\u8cab\u306e\u30d5\u30ed\u30fc\u3092\u5b9f\u73fe\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre><code class=\"language-typescript\">\/\/ Salesforce\u3078\u306e\u5206\u6790\u7d50\u679c\u4fdd\u5b58\uff08OAuth2\u8a8d\u8a3c\u6e08\u307faxios\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\uff09\nawait sfClient.post('\/services\/data\/v59.0\/sobjects\/TrainingResult__c', {\n  trainee__c: traineeId,\n  trainingItem__c: trainingItemId,\n  score__c: analysis.overallScore,\n  feedback__c: analysis.feedback,\n  recordingUrl__c: slackPermalink,\n  sessionDate__c: new Date().toISOString(),\n});<\/code><\/pre>\n<h2>5. \u7d50\u679c\uff08\u6570\u5024\uff09<\/h2>\n<p>| \u6307\u6a19 | Before | After | \u6539\u5584\u7387 |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;&#8211;|&#8212;&#8212;-|&#8212;&#8212;&#8211;|<br \/>\n| \u7814\u4fee1\u56de\u3042\u305f\u308a\u306e\u4eba\u4ef6\u8cbb | 2\u540d\u4f53\u5236\uff08\u30d9\u30c6\u30e9\u30f3+\u65b0\u4eba\uff09 | \u65b0\u4eba1\u540d\u306e\u307f | -50% |<br \/>\n| \u6708\u9593\u7814\u4fee\u53ef\u80fd\u56de\u6570 | \u90312-3\u56de\uff08\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u5236\u7d04\uff09 | \u7121\u5236\u9650\uff08AI\u304c\u5e38\u6642\u5bfe\u5fdc\uff09 | \u5927\u5e45\u5897\u52a0 |<br \/>\n| \u72ec\u308a\u7acb\u3061\u307e\u3067\u306e\u671f\u9593\uff08\u203b\uff09 | \u7d048\u9031\u9593 | \u7d045\u9031\u9593\uff08\u7df4\u7fd2\u91cf\u5897\u52a0\u306b\u3088\u308a\u77ed\u7e2e\uff09 | -37% |<br \/>\n| \u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u306e\u4e00\u8cab\u6027 | \u62c5\u5f53\u8005\u4f9d\u5b58\uff08\u3070\u3089\u3064\u304d\u5927\uff09 | AI\u57fa\u6e96\u3067\u7d71\u4e00 | \u6a19\u6e96\u5316 |<br \/>\n| \u8a55\u4fa1\u9805\u76ee\u306e\u30ab\u30d0\u30fc\u7387 | \u4e3b\u89813-4\u9805\u76ee | \u5168\u8a55\u4fa1\u9805\u76ee\u3092\u7db2\u7f85 | \u5168\u9805\u76ee |<\/p>\n<p>\u203b \u72ec\u308a\u7acb\u3061\u57fa\u6e96: SV\u306e\u540c\u5e2d\u306a\u3057\u30671\u65e5\u306e\u53d7\u96fb\u3092\u5b8c\u4e86\u3067\u304d\u308b\u3053\u3068\u3002<\/p>\n<p>\u6700\u5927\u306e\u52b9\u679c\u306f<strong>\u30d9\u30c6\u30e9\u30f3\u793e\u54e1\u306e\u6642\u9593\u89e3\u653e<\/strong>\u3067\u3059\u3002\u6708\u9593\u7d0440\u6642\u9593\u306e\u7814\u4fee\u5de5\u6570\u304c\u5b9f\u8cea\u30bc\u30ed\u306b\u306a\u308a\u3001\u305d\u306e\u6642\u9593\u3092\u9867\u5ba2\u5bfe\u5fdc\u3084\u54c1\u8cea\u6539\u5584\u306b\u5145\u3066\u3089\u308c\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<h2>6. \u5c55\u671b<\/h2>\n<h3>\u6b21\u306b\u53d6\u308a\u7d44\u3080\u8ab2\u984c<\/h3>\n<ul>\n<li><strong>\u8a55\u4fa1\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u9ad8\u5ea6\u5316<\/strong>: \u8907\u6570\u30e2\u30c7\u30eb\u3067\u306e\u8a55\u4fa1\u6bd4\u8f03\u3084\u3001\u904e\u53bb\u306e\u9ad8\u8a55\u4fa1\u30ed\u30fc\u30eb\u30d7\u30ec\u30a4\u3068\u306e\u985e\u4f3c\u5ea6\u5206\u6790\u3002\u6b21\u306eAI\/ML\u30a8\u30f3\u30b8\u30cb\u30a2\u3068\u4e00\u7dd2\u306b\u8a2d\u8a08\u3057\u305f\u3044\u9818\u57df\u3067\u3059<\/li>\n<li><strong>\u7814\u4fee\u30b7\u30ca\u30ea\u30aa\u306e\u62e1\u5145<\/strong>: \u30af\u30ec\u30fc\u30e0\u5bfe\u5fdc\u30fb\u89e3\u7d04\u6291\u6b62\u30fb\u30a2\u30c3\u30d7\u30bb\u30eb\u306a\u3069\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30b7\u30c1\u30e5\u30a8\u30fc\u30b7\u30e7\u30f3\u5225\u306e\u30b7\u30ca\u30ea\u30aa\u8a2d\u8a08<\/li>\n<li><strong>\u7814\u4fee\u30c7\u30fc\u30bf\u5206\u6790\u57fa\u76e4<\/strong>: \u84c4\u7a4d\u3055\u308c\u305f\u30b9\u30b3\u30a2\u63a8\u79fb\u30fb\u3064\u307e\u305a\u304d\u30d1\u30bf\u30fc\u30f3\u304b\u3089\u7814\u4fee\u30d7\u30ed\u30b0\u30e9\u30e0\u81ea\u4f53\u3092\u6539\u5584\u3059\u308b\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u30eb\u30fc\u30d7\u306e\u69cb\u7bc9<\/li>\n<h3>\u95a2\u9023\u8a18\u4e8b<\/h3>\n<ul>\n<li><a href=\"\/engineer\/blog\/speech-emotion-analysis-pipeline\/\">\u901a\u8a71\u97f3\u58f0\u3092\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u3067\u611f\u60c5\u5206\u6790\u3059\u308b\u6280\u8853\u8a2d\u8a08<\/a> \u2014 \u97f3\u58f0\u51e6\u7406\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u5225\u306e\u6d3b\u7528\u4e8b\u4f8b<\/li>\n<li><a href=\"\/engineer\/blog\/ai-driven-dev-team\/\">Claude Code\u3068GitHub Copilot\u3092\u5168\u54e1\u304c\u4f7f\u3046\u958b\u767a\u30c1\u30fc\u30e0\u306e\u5b9f\u614b<\/a> \u2014 AI\u99c6\u52d5\u958b\u767a\u3067\u672c\u30b7\u30b9\u30c6\u30e0\u3082\u69cb\u7bc9\u3057\u307e\u3057\u305f<\/li>\n<p>&#8212;<\/p>\n<h2>\u63a1\u7528\u60c5\u5831<\/h2>\n<p>ClassLab \u3067\u306f\u3001AI \u00d7 \u696d\u52d9\u6539\u5584\u3092\u4e00\u7dd2\u306b\u63a8\u9032\u3057\u3066\u304f\u308c\u308b\u30a8\u30f3\u30b8\u30cb\u30a2\u3092\u52df\u96c6\u3057\u3066\u3044\u307e\u3059\u3002\u97f3\u58f0AI\u30fb\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0API\u30fbLLM\u6d3b\u7528\u306b\u8208\u5473\u304c\u3042\u308b\u65b9\u3001\u305c\u3072\u304a\u8a71\u3057\u3055\u305b\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<ul>\n<li><a href=\"https:\/\/findy-code.io\/companies\/994\">Findy\u3067\u30ab\u30b8\u30e5\u30a2\u30eb\u9762\u8ac7\u3059\u308b<\/a><\/li>\n<li><a href=\"https:\/\/classlab.co.jp\/engineer\/entry\/\">\u63a1\u7528\u60c5\u5831\u3092\u898b\u308b<\/a><\/li>\n<p>&#8212;<\/p>\n<blockquote>\n<p><strong>ClassLab Engineering<\/strong> \u30c1\u30fc\u30e0\u30e1\u30f3\u30d0\u30fc\u304c\u57f7\u7b46\u3057\u307e\u3057\u305f\u3002<\/p>\n<\/blockquote>\n<p>><\/p>\n<blockquote>\n<p>ClassLab.\u3067\u306f\u3001\u4e00\u7dd2\u306b\u30d7\u30ed\u30c0\u30af\u30c8\u3092\u4f5c\u308b\u30a8\u30f3\u30b8\u30cb\u30a2\u3092\u52df\u96c6\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/blockquote>\n<blockquote>\n<p>\u30ab\u30b8\u30e5\u30a2\u30eb\u9762\u8ac7\u3082\u5927\u6b53\u8fce\u3067\u3059\uff01<\/p>\n<\/blockquote>\n<p>><\/p>\n<blockquote>\n<p><a href=\"https:\/\/findy-code.io\/companies\/2772\">Findy\u3067\u8a71\u3092\u805e\u304f<\/a> | <a href=\"https:\/\/classlab.co.jp\/engineer\/\">\u63a1\u7528\u60c5\u5831\u3092\u898b\u308b<\/a><\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>OpenAI Realtime API\u3068Electron\u3067\u69cb\u7bc9\u3057\u305fAI\u97f3\u58f0\u30ed\u30fc\u30eb\u30d7\u30ec\u30a4\u7814\u4fee\u30b7\u30b9\u30c6\u30e0\u3002PTT\u30e2\u30fc\u30c9\u306e\u8a2d\u8a08\u5224\u65ad\u3068\u97f3\u58f0\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u5b9f\u88c5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":"","footnotes":""},"categories":[31],"tags":[10,19,23,20],"class_list":["post-140","post","type-post","status-publish","format-standard","hentry","category-project-story","tag-ai","tag-llm","tag-python","tag-20"],"_links":{"self":[{"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/posts\/140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/comments?post=140"}],"version-history":[{"count":0,"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/posts\/140\/revisions"}],"wp:attachment":[{"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/media?parent=140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/categories?post=140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/tags?post=140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}