質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

5861閲覧

文字に対して音声を再生させたい。(テキスト読み上げ)

Yuki_Unity

総合スコア129

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/07/29 13:23

例えば、あるstring型の文字列が「あいうえお」だとすれば「あいうえお」と発音するようにしたいです。イメージとしてはトモダチコレクションのような感じです。
Assetやネイティブで読み上げてくれるのもあるのですが、自分で用意した音を使いたいです。
音を作るときは、「あ」「い」「う」...「ん」でいいのでしょうか?それとも高低を作ったほうが良いのでしょうか?
そもそも、上の音声を一つずつ作れたとしてもどのように読み上げさせるのかまったく検討も付きません。
どなたか回答お願いいたします。

・読み上げる音は50音で一つずつでいいのか
・どのように読み上げさせるのか

お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ぱっと思いつく方法としては、
以下のようにとりあえず50音(他)を作り、配列に入れて制御する方法。
(方法はイメージなんて実際使う時は上手いこと調整してください。負荷は無視、動作確認はしていません)

C#

1//音声ファイルの配列 2public AudioClip[] sounds; 3 4//対応表 5private Dictionary<string, AudioClip> soundsDic; 6 7public AudioSource audioSource; 8 9void Start () { 10 //対応表作る(一例) 11 soundsDic = new Dictionary<string, AudioClip>(); 12 soundsDic.Add ("あ", sounds [0]); 13 soundsDic.Add ("い", sounds [1]); 14 soundsDic.Add ("う", sounds [2]); 15 soundsDic.Add ("こんにちは", sounds [3]); 16} 17 18IEnumerator Speech (string text) { 19 //一文まるごと対応表にあるか? 20 audioSource.clip = soundsDic [text]; 21 //音が存在するなら 22 if (audioSource.clip != null) { 23 //再生 24 audioSource.Play (); 25 //再生終了まで待つ 26 while (audioSource.isPlaying) { 27 yield return null; 28 } 29 } 30 31 //1文字ずつ切り分けて対応表チェック 32 foreach (char item in text) { 33 //対象の音をセット 34 audioSource.clip = soundsDic [item.ToString ()]; 35 36 //音が存在するなら 37 if (audioSource.clip != null) { 38 //再生 39 audioSource.Play (); 40 //再生終了まで待つ 41 while (audioSource.isPlaying) { 42 yield return null; 43 } 44 } 45 } 46}

トモダチコレクションはちょっとしか見ていませんが、「棒読みでも構わない!」というなら最小限の音だけ用意すればOKかと。

ちゃんと読み上げたいなら、全部同じ音の高さ・長さだと聞いた時違和感が出るので対応が必要です。
同音異義語(「橋」と「端」など)の為に音の高低付ける(そもそもどう対応表に落とし込むかって問題がありますが)、2文字ずつのチェック追加して「っ(促音)」「ー(長音)」に対処するなど。
この辺をがっつり作り込むなら音や声の知識が必要になってくるので普通はAssetやAPIを使います。
お好きな方法でどうぞ。

投稿2018/07/30 02:09

sakura_hana

総合スコア11425

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

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

Yuki_Unity

2018/07/31 12:42

回答有り難うございます。 Dictionaryをまだあまり理解していないのですが、 「stringの文字列を読み上げる」のstringはsoundsDicのstringでしょうか? _______________________________ もう一つ質問なのですが、 soundsDic.Add ("こんにちは", sounds [3]); 例えば、「こんにちは」と言わせたい時は上の一文が必要で、 「こんばんは」と言わせたい時は soundsDic.Add ("こんばんは", sounds [4]); が必要になるということですか? お時間があればお返事お待ちしています。
sakura_hana

2018/08/01 00:00

実際に読み上げたいstringはSpeechに渡します。 例えば StartCoroutine("Speech","あいこん"); としたら、 「あ」→soundsDicにあるので鳴る 「い」→soundsDicにあるので鳴る 「こ」→soundsDicに無いので鳴らない 「ん」→soundsDicに無いので鳴らない となります。 "Dictionary = 辞書" "辞書に登録されていない内容は無視する(ようにしている)" というイメージです。 >「こんばんは」と言わせたい時は〜 そうなります。(別途「こ」「ん」「ば」「は」を登録していればそちらが使われますが)
Yuki_Unity

2018/08/01 04:21

なるほど! わかりやすい説明ありがとうございます!
guest

0

「C# テキスト読み上げ」とか、
「unity テキスト読み上げ」とかでぐぐってみればいろいろでてくるようです

投稿2018/07/29 23:02

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問