💭

AIさんに手伝ってもらって、日本語をしゃべるアプリを作った

2024/06/26に公開

はじめに

突然ですが、日本語でしゃべるソフトを実装しようと思ったので、ChatGPTに作り方を聞いてみた。

ChatGPTにやり方を聞いてみる

トークン

日本語を音声として再生するには、どういった技術がありますか?C#で実装できるものが良いです

回答としては、詳細は省きますが以下の感じ

C#で日本語のテキストを音声として再生するためには、以下のような方法があります。
1. Microsoft Azure Cognitive Services
2. System.Speech.Synthesis 名前空間を使用
まとめ
Azure Cognitive Servicesを利用する方法は、クラウドベースであり高品質な音声合成を提供します。System.Speech.Synthesis 名前空間を使用する方法は、ローカル環境で簡単に実装できますが、音声の品質や対応プラットフォームに制限があります。用途に応じて適切な方法を選択してください。

だそうです。ローカル環境で動作するものを作りたかったのですが、品質が悪そうな事言ってるので、Azureで実装してみる事にします。ChatGPT曰く、エンドポイントとAPIキーを取得しろって事らしい。

言われるがままにAzureで設定

AzurePortalへ移動
リソースの作成より「AI+Machine Learning」を選択して、「音声」ってのを選んでみた。この辺はChatGPTが教えてくれた選択項目とずいぶん違っていて迷った。

設定は以下の通り、結構適当

「確認と作成」「作成」でしばらく待つと、デプロイが完了しました、と言われる。
「リソースに移動」で欲しかった、APIキーと、エンドポイントとやらが取得できる。

VisualStudioで実装

次にVisualStudioを起動しよう。
プロジェクトは、手っ取り早く「コンソールアプリ」とした
実装コードはChartGPTが教えてくれてるので、それをそのままコピペしてみる

using System.Text;

namespace ConsoleApp1
{
    internal class Program
    {
        static async void Main(string[] args)
        {
            string subscriptionKey = "YOUR_AZURE_SUBSCRIPTION_KEY";
            string region = "YOUR_AZURE_REGION"; // 例: "japaneast"
            string endpoint = $"https://{region}.tts.speech.microsoft.com/cognitiveservices/v1";

            string text = "こんにちは、これはテキスト読み上げのデモです。";

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);

                var request = new HttpRequestMessage(HttpMethod.Post, endpoint);
                request.Content = new StringContent($"<speak version='1.0' xml:lang='ja-JP'><voice xml:lang='ja-JP' xml:gender='Female' name='ja-JP-AoiNeural'>{text}</voice></speak>", Encoding.UTF8, "application/ssml+xml");

                request.Headers.Add("X-Microsoft-OutputFormat", "riff-24khz-16bit-mono-pcm");
                var response = await client.SendAsync(request);
                response.EnsureSuccessStatusCode();

                using (var dataStream = await response.Content.ReadAsStreamAsync())
                using (var fileStream = new FileStream("output.wav", FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    await dataStream.CopyToAsync(fileStream);
                    fileStream.Flush();
                }

                Console.WriteLine("音声ファイルが生成されました: output.wav");
            }
        }
    }
}

「YOUR_AZURE_SUBSCRIPTION_KEY」ってなんだ?どうやらここに、Azureの設定後に取得したAPIキーを入力するようです。「キー1」をコピーしてコードに張り付けてください。
次に「YOUR_AZURE_REGION」ですが、これもAzure設定時に「リージョン」に設定したものを入れて下さい。私は「Japane West」を選択していたので、コードには「japanwest」としました。

実行、そして例外

これで実行すると、

例外発生ー!!。どうすればいいか全く分かりません。
再度ChatGPTに聞いてみましょう。

何か意思の疎通が出来てない感じがします。困りました。

Cursorにも聞いてみる

そこで、CursorというVSCodeをForkしたエディタがあるのですが、こいつもAIを積んでまして、コードの事はこっちの方が賢そうなので、VisualStudioで作成したフォルダをCursorで開いて聞いてみました、

おっ、何やらHeader情報が足らないのか、コードを追加してくれました。
期待を込めて、これで実行してみましょう。

無事動いたよ

無事終了しました。やりました。
でも何もしゃべらない…。ここで実装をよく見ると、Wavファイルを書き出しています。
どうやら、音声ファイルとしてテキストで書いた内容をしゃべってくれるみたいですね。
以下にある、output.wavファイルを聞いてみましょう
/bin/Debug/net8.0/
なぜか女の子の声ですが、text変数に入れた日本語を読み上げてくれています。

Claudeにも聞いてみた

性能が良いと噂のClaudeでも、聞いてみた。こっちはC#じゃないんだけど、質問入れて3秒後に動くアプリが出来て、さすがにびびった。
トークン

入力欄に入力した文字を日本語で読み上げるアプリを作成して


ちゃんと、読み上げてくれます。
なんかすごい…。

つづく

https://zenn.dev/maedan/articles/e7bf2caf9ba596

Discussion