質問するログイン新規登録
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

ChatGPT

ChatGPTは、OpenAI社の提供するインタラクティブなテキストコミュニケーションを行うことができるAIサービスまたは、そのアルゴリズムのモデル名です。

Q&A

解決済

1回答

411閲覧

【C++】ChatGPTと接続して話せるプログラムを実現したい

snowman2000

総合スコア2

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

ChatGPT

ChatGPTは、OpenAI社の提供するインタラクティブなテキストコミュニケーションを行うことができるAIサービスまたは、そのアルゴリズムのモデル名です。

0グッド

0クリップ

投稿2023/11/14 11:01

編集2023/11/15 06:15

0

0

前提

C++で音声を取り込み,ChatGPTと会話できるプログラムを作ろうとしています.
しかしながらこのプログラムを動かそうとすると,connection errorという文字が出て接続することができません.
以下のスクリプトを書き,接続しようとしましたが,つながりませんでした.

実現したいこと

C++で,ChatGPTと接続したい

発生している問題・エラーメッセージ

connection error と出てしまい動かない

該当のソースコード

C++

1#include <iostream> 2#include <cstdlib> 3#include <fstream> 4#include <cstring> 5#include <curl/curl.h> 6 7// 以下のライブラリは、音声認識とテキスト読み上げをサポートするライブラリです。 8// 必要に応じて適切なライブラリをインストールし、ヘッダーファイルとリンクします。 9// 音声認識にはPocketSphinxを使用することができます。 10// テキスト読み上げにはeSpeakを使用することができます。 11 12#include <sphinxbase/ad.h> 13#include <sphinxbase/err.h> 14#include <pocketsphinx.h> 15#include <stdio.h> 16#include <string.h> 17#include <speak_lib.h> // eSpeakのヘッダーファイル 18 19// OpenAI APIキー 20const std::string API_KEY = "自分のAPIキーを入力しています"; 21 22// ChatGPTに送信するテキスト 23const std::string USER_INPUT = "こんにちは"; 24 25// ChatGPTエンジンのバージョン 26const std::string ENGINE_VERSION = "ada"; 27 28// ChatGPTの応答を受け取る関数 29size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) { 30 size_t totalSize = size * nmemb; 31 output->append(static_cast<char*>(contents), totalSize); 32 return totalSize; 33} 34 35// 音声の取り込み時間(秒) 36const int PHRASE_TIME_LIMIT = 3; 37 38// 音声認識ライブラリの設定 39config_t* ps_config; 40ps_decoder_t* ps; 41cmd_ln_t* config; 42ad_rec_t* ad; 43 44// 音声をテキストに変換する関数 45std::string transcribeVoice() { 46 ad_rec_t* ad; 47 int16 adbuf[2048]; 48 const char* hyp; 49 int rv; 50 51 if ((ad = ad_open_dev("plughw:0", 16000)) == NULL) { 52 fprintf(stderr, "Failed to open audio device\n"); 53 return ""; 54 } 55 56 if (ad_start_rec(ad) < 0) { 57 fprintf(stderr, "Failed to start recording\n"); 58 return ""; 59 } 60 61 ps_start_utt(ps); 62 63 std::cout << "音声取り込み中..." << std::endl; 64 65 while (1) { 66 if ((rv = ad_read(ad, adbuf, 2048)) < 0) 67 return ""; 68 69 ps_process_raw(ps, adbuf, rv, FALSE, FALSE); 70 hyp = ps_get_hyp(ps, NULL ); 71 if (hyp != NULL) { 72 break; 73 } 74 } 75 76 ps_end_utt(ps); 77 ad_close(ad); 78 79 return hyp; 80} 81 82// OpenAIのAPIにテキストを送信する関数 83std::string getChatGPTAnswer(const std::string& apiKey, const std::string& input, const std::string& engine) { 84 CURL* curl; 85 CURLcode res; 86 std::string response; 87 88 // APIエンドポイント 89 std::string endpoint = "https://api.openai.com/v1/engines/" + engine + "/completions"; 90 91 // ヘッダーを設定 92 struct curl_slist* headers = NULL; 93 headers = curl_slist_append(headers, ("Authorization: Bearer " + apiKey).c_str()); 94 headers = curl_slist_append(headers, "Content-Type: application/json"); 95 96 // JSONデータを作成 97 std::string json_data = "{\"prompt\": \"" + input + "\", \"max_tokens\": 50}"; 98 99 curl = curl_easy_init(); 100 if (curl) { 101 // POSTリクエストを設定 102 curl_easy_setopt(curl, CURLOPT_URL, endpoint.c_str()); 103 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data.c_str()); 104 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 105 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); 106 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); 107 108 res = curl_easy_perform(curl); 109 if (res != CURLE_OK) { 110 std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl; 111 } 112 113 curl_easy_cleanup(curl); 114 } 115 else { 116 std::cerr << "Curl initialization failed." << std::endl; 117 } 118 119 return response; 120} 121 122// テキストを読み上げる関数 123void readText(const std::string& text) { 124 espeak_AUDIO_OUTPUT output = AUDIO_OUTPUT_PLAYBACK; // オーディオ出力の設定 125 const char* path = NULL; // パスはNULLに設定 126 127 int intBuffer[5]; // バッファ 128 unsigned int size = 0; // バッファのサイズ 129 130 // eSpeakの初期化 131 if (espeak_Initialize(output, 0, path, espeakINITIALIZE_PHONEMES | espeakINITIALIZE_LEXICON) < 0) { 132 std::cerr << "eSpeak initialization failed" << std::endl; 133 return; 134 } 135 136 // 読み上げるテキストを設定 137 const char* textToRead = text.c_str(); 138 139 // テキストを読み上げ 140 espeak_Synth(textToRead, text.length(), 0, 0, 0, espeakCHARS_UTF8, intBuffer, &size); 141 142 // テキストを再生 143 espeak_Synchronize(); 144 145 // eSpeakのクリーンアップ 146 espeak_Terminate(); 147} 148 149int main() { 150 // 音声を取り込み、音声からテキストに変換 151 std::string voiceText = transcribeVoice(); 152 153 if (!voiceText.empty()) { 154 std::cout << "あなた: " << voiceText << std::endl; 155 156 // ChatGPTにテキストを送信し、応答を取得 157 std::string answer = getChatGPTAnswer(API_KEY,voiceText,ENGINE_VERSION); 158 159 // ChatGPTの応答を表示 160 std::cout << "ChatGPT: " << answer << std::endl; 161 162 // 応答を読み上げ 163 readText(answer); 164 } 165 else { 166 std::cerr << "音声を認識 167 }

試したこと

上記のスクリプトを実行しようとするとエラーで止まりはしないのだが,ポップアップが表示されconnection error と出る
呼び出しの際の引数を
std::string answer = getChatGPTAnswer(API_KEY,voiceText,ENGINE_VERSION);
に変更した.
イメージ説明

補足情報(FW/ツールのバージョンなど)

APIキーには自分のOpenAIのAPIキーを入力している

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/11/14 11:39

掲示されているソースコードですが、getChatGPTAnswer の関数パラメーターと呼び出しの際の引数が合っていませんね。。。(コンパイルエラーが発生します) // OpenAIのAPIにテキストを送信する関数 std::string getChatGPTAnswer(const std::string& apiKey, const std::string& input, const std::string& engine) {   : std::string answer = getChatGPTAnswer(voiceText);
snowman2000

2023/11/15 06:12

コメントありがとうございます. ご指摘の通り,呼び出しの際の引数を std::string answer = getChatGPTAnswer(API_KEY,voiceText,ENGINE_VERSION); に変更いたしましたが,まだconnectionerrorと出てしまいます.
melian

2023/11/15 06:30

curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); を追加して実行してみれば、原因が判るかもしれません。
snowman2000

2023/11/19 09:23

ご返信ありがとうございます。 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); をmain文に追加しましたが,connectionerror のままでした.
melian

2023/11/19 09:34

ログメッセージが表示されているはずなので、それを読み解けば connection error の原因が判るかもしれません、という意味でコメントしました。curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); を追加するだけでエラーが直るわけではありません。
guest

回答1

0

自己解決

pythonでつなぎました.

投稿2024/01/09 11:11

snowman2000

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問