【Azure Cognitive Services】Javaで作る「オウム返しナナミ」

# はじめに
しゃべった言葉をオウム返ししてくるぬいぐるみのことは知っていますか？遊んだことありますか？

![イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/6685750c-1ad6-ea47-005d-a96ff3091ddb.png)

「僕の名前は太郎！」としゃべったら、ぬいぐるみも「僕の名前は太郎！」と同じ言葉を言い返してきます。ぬいぐるみの電池が切れるまで、ずっとオウム返ししてくるわけです。

今回は、Azure Cognitive ServicesのSpeech Serviceを使って、同じような仕組みを作ろうと思います。
Speech Serviceでニューラル音声というより人間らしい声を発する音声が提供されており、その中に、**Nanami** という日本語で女性の声があるので、これを使って作っていきたいと思います！

この記事は[ **Java開発者のためのAzure入門** ](https://qiita.com/official-events/22637c675c61a797a24f)というキャンペーンへの記事投稿です！

# 実行環境・前提
- Windows 10 home
- IntelliJ IDEA
    - インストール手順は以下のサイト参考
        - [IntelliJ IDEAインストール手順＜Windows向け＞](https://sukkiri.jp/technologies/ides/intellij-idea/intellij-idea-win.html)
    - java sdk 11.0.2
- Azureサブスクリプション所持

# 手順

以下の手順で進めていきます。
1. Azure portal上でCognitive Servicesのリソース作成と準備
2. IntelliJ IDEAでJavaの実行環境を構築
3. 「オウム返しナナミ」のプログラム作成

## Azure portal上でCognitive Servicesのリソース作成と準備

① [Azure portal](https://portal.azure.com/)を開きます。
② 上部にあるリソース、サービス、ドキュメントの検索で「Cognitive Services」と入力し、選択します。
③ 作成をクリックし、Marketplaceが出てきたら「音声」と検索し、**Microsoftが提供する音声サービス** を選択し、作成をクリックします。
④ 作成の内容に関しては、以下のように設定し、作成をクリックする。少し時間がかかります。

![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/adc5f1d2-bc64-8f5a-4c4c-37582058657d.jpeg)
**注意！**
場所に関して、ニューラル音声を使いたい場合、 **東日本や西日本はサポートされていない** ので選択してはいけません！サポートされているリージョンについては[MSドキュメント](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/regions#custom-neural-voice)で確認してください。米国東部はサポートされているので、私は米国東部を選択しています。

⑤ 「デプロイが完了しました」と表示されたら、リソースに移動をクリックしましょう。 
⑥ 左側の欄の[ リソース管理 ] > [ キーとエンドポイント ]をクリックします。
⑦ **キー1と場所** をメモ帳などにメモしておきます。これでリソースの作成と準備は完了です！お疲れ様でした！

## IntelliJ IDEAでJavaの実行環境を構築
① IntelliJ IDEAを起動したら、新規プロジェクトをクリックします。
② Mavenを選択し、プロジェクト SDKを「11 ver 11.0.2」にし、（筆者は選んだのがこのバージョンです。）次へをクリックします。
③ 名前を「SpeechNanami」にして、完了をクリックします。
④ pom.xmlを開き、以下のように追記します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SpeechNanami</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <repositories>
        <repository>
            <id>maven-cognitiveservices-speech</id>
            <name>Microsoft Cognitive Services Speech Maven Repository</name>
            <url>https://csspeechstorage.blob.core.windows.net/maven/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>com.microsoft.cognitiveservices.speech</groupId>
            <artifactId>client-sdk</artifactId>
            <version>1.12.1</version>
        </dependency>
    </dependencies>
</project>
```

\<repositories>～\</repositories>と\<dependencies>～\</dependencies>を下に追記しています。
追記後、右上あたりに出てくるアイコン **「Load Maven Changes」** をクリックします。もしくは、Ctrl + Shift + Oでも大丈夫です。


⑤ [ src ] > [ main ] > [ java ]を右クリックし、[ 新規 ] > [Javaクラス]で「NanamiSpeech」という名前でクラスファイルを作成します。これで実行環境の構築は終了です！お疲れ様でした！

##  「オウム返しナナミ」のプログラム作成
いよいよプログラムの作成です。
先ほど作成した「NanamiSpeech」という名前のクラスファイルに以下のコードを入力します。

```java
import com.microsoft.cognitiveservices.speech.*;
import java.util.concurrent.ExecutionException;

public class NanamiSpeech {
    static String subscriptionKey = "YourSubscriptionKey";
    static String serviceRegion = "YourServiceRegion";

    public static void main(String[] args) throws InterruptedException, ExecutionException{
        var config = SpeechConfig.fromSubscription(subscriptionKey, serviceRegion);
        config.setSpeechRecognitionLanguage("ja-JP");

        var synthesizer = new SpeechSynthesizer(config);
        var recognizer = new SpeechRecognizer(config);

        while(true) {
            var result = recognizer.recognizeOnceAsync().get();
            var text = result.getText();
            System.out.println("話した内容：" + text);
            synthesizer.SpeakSsml(CreateTextReadOut(text));
        }
    }

    static String CreateTextReadOut(String text)
    {
        return "<speak version='1.0' xmlns='https://www.w3.org/2001/10/synthesis' xml:lang='ja-JP'><voice name='ja-JP-NanamiNeural'>" + text + "</voice></speak>";
    }
}
```
フィールド変数にある、**subscriptionKeyとserviceRegion** にメモしておいた **キー1と場所** に書き換えれば、完成です！
Ctrl + Shift + F10などで実行してみてください。何か話してみると、以下のようにコンソール上に話した内容が出力され、さらにNanamiがその内容を話してくれます！！

```
話した内容：こんにちは
話した内容：私の名前はななみです。
話した内容：私の好きな食べ物はりんごです。
・・・
・・
・
```

以上で、「オウム返しナナミ」の完成です！お疲れ様でした！