takataka430’s blog

.NET系を中心に勉強したことのまとめを書きます

Blazorで接続文字列を読み込む

はじめに

以前ASP.NET Core Web APIで接続文字列を設定する方法を書きました。

takataka430.hatenablog.com

最近Blazorを使うことがあり、同じ方法でできるだろうと思ったのですが、少しやり方が違いました。

環境

Microsoft Visual Studio Community 2022 Version 17.0.5
Blazor Server(.NET 6)

手順

ASP.NET Coreと同じようにrazorページのコンストラクタでIConfiguration型の変数を受け取るのかと思ったのですが、Blazorでは違うようです。
以下のようにページ先頭に書きます。

@inject IConfiguration Configuration

こうするとIConfiguration型のConfiguration をコード内で利用することができます。

次に接続文字列を設定します。今回はsecrets.jsonに以下のように記載してみます。

{
  "ConnectionStrings": {
    "test": "これは接続文字列です"
  }
}

設定したtestの値を取得するには以下のように記述します。

[何らかの変数] = Configuration.GetConnectionString("test");

今回はページ全体のコードを以下のようにしてみました。

@page "/"
@inject IConfiguration Configuration


<label>@SelectedColor</label>

@code {
    string SelectedColor = ""; //ラベルに表示する文字列

    protected override void OnInitialized()
    {
        base.OnInitialized();
        SelectedColor = Configuration.GetConnectionString("test");
    }
}

これを実行すると画面には「これは接続文字列です」と表示され、接続文字列の値を取得できていることがわかります。

参考

ASP.NET Core Blazor configuration | Microsoft Docs

MRTKのダイアログを使う

はじめに

MRTKで「Yes」「No」のような2択から選べるダイアログを表示して、結果によって処理を変えるということをやりたかったので調査しました。

環境

Unity 2020.3.27f1
MRTK 2.7.2

実装方法

ダイアログの使い方は以下のページに記載があります。

docs.microsoft.com

今回は以下のようにスクリプトを作ります。

using Microsoft.MixedReality.Toolkit.UI;
using UnityEngine;

public class DialogStudy : MonoBehaviour
{
    [SerializeField]GameObject dialogPrefab;

    void Start()
    {
        //ダイアログの表示
        Dialog dialog = Dialog.Open(dialogPrefab, DialogButtonType.Yes | DialogButtonType.No, "Title", "Message", true);
        
        if(dialog != null)
        {
            dialog.OnClosed += (DialogResult result) => 
            { 
                //ダイアログのボタンを選択後、やりたい処理を書く
                //今回はログに選択したボタンを表示
                Debug.Log(result.Result.ToString()); 
            };
        }
    }
}

あとはこのスクリプトをオブジェクトにアタッチして、ダイアログのPrefabを設定すれば完了です。 f:id:takataka430:20220216095122p:plain

以下のようにエディタ上で実行するとダイアログが表示されます。 f:id:takataka430:20220216095151p:plain

nugetパッケージをコマンドからダウンロードする

はじめに

nugetパッケージを(プロジェクトにインストールではなく)ローカルフォルダにダウンロードしたいと思い、方法を調べました。ホームページからダウンロードボタンを押す方法もありますが、今回はコマンドで実行する方法について書きます。

環境

nuget.exe v6.0.0

手順

以下のページからnuget.exeをダウンロードします。 www.nuget.org

あとはnuget.exeがある場所でコマンドプロンプトを起動してコマンドを実行するだけです。

以下のコマンドを実行するとコマンドプロンプトで開いている場所にパッケージがダウンロードされます。
nuget install <packageID>
オプションとして以下のものがあります。
-OutputDirectory <ディレクトリ名>
→指定のディレクトリにダウンロードされます。ディレクトがなくても自動で作成されます。
-Version <version>
→パッケージのバージョンを指定できます。

例えば、Newtonsoft.Jsonのバージョン13.0.1をtestディレクトリにダウンロードするためには以下のコマンドになります。
nuget install Newtonsoft.Json -Version 13.0.1 -OutputDirectory test

参考

nuget.exe CLI を使用して NuGet パッケージを管理する | Microsoft Docs

【MRTK】Hand Coachを使う

MRTKのHand Coachを使ってみました。

docs.microsoft.com

上記にドキュメントがあるのですが、どのように使えばいいのかわからなかったので使い方をメモしておきます。

環境

MRTK 2.7.2
Unity 2020.3.0f1

手順

まずProjectウィンドウから手のPrefabを追加します。場所は以下の通りです。 Packages/com.microsoft.mixedreality.toolkit.foundation/SDK/Features/UX/Prefabs/HandCoach
今回はStaticHandCoachRoot_Lを利用します。 f:id:takataka430:20211123123653p:plain

次にアニメーションを設定します。
StaticHandCoachRoot_Lを展開してInteractionHint_Lをクリックします。Inspectorを見るとHand Interaction Hint (Script)があります。このスクリプトAnimation Stateにアニメーションファイルの文字列を記入するとアニメーションが実行されます。

f:id:takataka430:20211123123757p:plain

アニメーションファイルはMRTKに準備されており、以下の場所にあります。 Packages/com.microsoft.mixedreality.toolkit.foundation/SDK/Features/UX/Animations/HandCoach

f:id:takataka430:20211123123822p:plain

今回はLeftHand内にあるAirTap_Lを利用します。
以下のように文字列で指定します。これで準備は完了です。

f:id:takataka430:20211123123846p:plain

Unityのエディタで実行すると以下のようになります。 f:id:takataka430:20211123124717g:plain

Unityでスクリプトから3Dオブジェクトを作成する

忘れやすいのでメモです。
Unityでヒエラルキーメニューから右クリックで3Dオブジェクトを作ることができますが、今回はスクリプトから作る方法を調べました。

環境

Unity 2020.3.01f Personal

作り方

以下のようにスクリプトに記述すると3Dオブジェクトを作成することができます。

var obj = GameObject.CreatePrimitive(PrimitiveType.Cube);

上記は立方体が生成されますが、PrimitiveTypeを変更すると他の3Dオブジェクトも生成可能です。

docs.unity3d.com

また、以下のように書くと位置や大きさのの指定もできます。

obj.transform.position = new Vector3(0f,0f,0f); //位置
obj.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); //大きさ

MRTKとLineRendererを使ってオブジェクト間を線で結ぶ

今回はUnityのLineRendererという機能を使い、オブジェクト同士を線で結ぶ方法を調べてみました。
せっかくなので、MRTKを用いて3Dオブジェクトを移動させても維持するようにしてみました。

docs.unity3d.com

環境

Unity 2020.3.01f1
MRTK ver 2.7.2.0

手順

まずは以下のようなスクリプトを作成します。

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    public GameObject object1;
    public GameObject object2;

    Vector3[] positions;
    LineRenderer lineRenderer;

    void Start()
    {
        lineRenderer = gameObject.AddComponent<LineRenderer>();

        //オブジェクトの座標を取得
        positions = new Vector3[]
        {
            object1.transform.position,
            object2.transform.position
        };

        //線の太さを設定
        lineRenderer.startWidth = 0.005f;
        lineRenderer.endWidth = 0.005f;


        //マテリアルの設定
        var material = new Material(Shader.Find("Standard"));
        lineRenderer.material = material;

        //座標間に線を結ぶ
        lineRenderer.SetPositions(positions);
    }

    void Update()
    {
        positions[0] = object1.transform.position;
        positions[1] = object2.transform.position;
        lineRenderer.SetPositions(positions);
    }
}

次にUnityで3Dオブジェクトを作成していきます。下の写真のGameObjectはHierarchy画面で右クリックしてCreate Emptyから、Cube1Cube2は3D Object→Cubeから作成しました。

f:id:takataka430:20211011225916p:plain

GameObjectには上記で作成したスクリプトを追加し、Object1とObject2にそれぞれCube1とCube2を挿入しておきます。

f:id:takataka430:20211011230117p:plain

Cube1とCube2にはNearInteractionGrabbableとObject Manipulatorの2つのスクリプトを追加しておきます。

f:id:takataka430:20211011230231p:plain

以上で準備は完了です。
Unityのエディタでデバッグすると以下のように3Dオブジェクト間に線を引いてくれます。

f:id:takataka430:20211011231704g:plain

Azure Speech Serviceの発音評価機能を試す

Speech Serviceに発音評価機能があったので試してみました。

docs.microsoft.com

環境

Microsoft Visual Studio Community 2019 Version 16.11.2
Microsoft.CognitiveServices.Speech 1.18.0

コード

C#のコンソールアプリケーションを作成し、Nuget パッケージマネージャー からMicrosoft.CognitiveServices.Speechをインストールします。
コードは以下のようにします。

using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
using Microsoft.CognitiveServices.Speech.PronunciationAssessment;
using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {

        static async Task Main(string[] args)
        {
            Console.WriteLine("評価したいテキストを入力してください");
            var refText = Console.ReadLine();

            var speechConfig = SpeechConfig.FromSubscription("[Subscription Key]", "[Region]");

            var audioConfig = AudioConfig.FromDefaultMicrophoneInput();

            var pronunciationAssessmentConfig = new PronunciationAssessmentConfig(
                refText, 
                //スコアを100点満点で表示
                GradingSystem.HundredMark);

            using (var recognizer = new SpeechRecognizer(speechConfig, audioConfig))
            {
                pronunciationAssessmentConfig.ApplyTo(recognizer);
                Console.WriteLine("評価を開始します 録音中・・・");

                //録音開始
                var speechRecognitionResult = await recognizer.RecognizeOnceAsync();

                //評価結果の取得
                var pronunciationAssessmentResult =
                        PronunciationAssessmentResult.FromResult(speechRecognitionResult);
                var fluencyScore = pronunciationAssessmentResult.FluencyScore;
                var pronunciationScore = pronunciationAssessmentResult.PronunciationScore;

                Console.WriteLine("流暢さ:" + fluencyScore);
                Console.WriteLine("スコア:" + pronunciationScore);
            }
        }
    }
}

これを実行すると以下のようになります。

評価したいテキストを入力してください
Hello
評価を開始します 録音中・・・
流暢さ:100
スコア:98.8

今回はHelloという単語を評価してもらうように入力しました。(上記の2行目)
テキストを入力すると録音が開始されます。マイクに向かって声を入力してから評価がでるまで少し時間がかかります。
今回は流暢さとスコアを表示してみました。面白い機能ですね。