PR

翻訳された英文の表示と読み上げ

2011年8月26日(金)
PROJECT KySS

サービス参照の追加

サービス参照の追加では、Microsoft Translator APIの下記URLを使用します。
http://api.microsofttranslator.com/V2/Soap.svc

VS2010メニューの「プロジェクト(P)/サービス参照の追加(S)」と選択します。「サービス参照の追加」画面が表示されます。「アドレス(A)」に上記URLを入力し(図7)、[移動(G)]ボタンをクリックします。通信が開始され、しばらくすると、「サービス(S)」内にSoapServiceが追加されます。展開するとLanguageServiceが表示され、「操作(O)」内にSpeakとTranslateが追加されています。「名前空間(N)」はデフォルトのServiceReference1のままにしておきます。[OK]ボタンをクリックします(図8)。

3

図7:「アドレス(A)」に「http://api.microsofttranslator.com/V2/Soap.svc 」と入力した(クリックで拡大)

3

図8:サービス参照の追加を実行した(クリックで拡大)

ソリューションエクスプローラー内に、Service Referencesというフォルダが作成されます。中にServiceReference1が追加され、SOAP Serviceで定義されているAPIを扱うためのクラスが生成されています(図9)。

3

図9:ソリューションエクスプローラー内にServiceReference1 が追加された

次に、ソリューションエクスプローラー内のMainPage.xamlを展開し、表示されるMainPage.xaml.vbをダブルクリックしてリスト1のロジックコードを記述します。

ロジックコードを記述する

リスト1 (MainPage.xaml.vb)

Option Strict On

ゲームクラス (タイマー、ゲーム ループなど) を提供するクラスの含まれる、Microsoft.Xna.Framework名前空間をインポートします。フレームワークコンポーネント (メディアなど)の状態を更新する、FrameworkDispatcher.Update()メソッドを利用するために、この名前空間が必要です。
Imports Microsoft.Xna.Framework

オーディオ再生用のプログラミング・インターフェース (API) を提供するクラスの含まれる、Microsoft.Xna.Framework.Audio名前空間をインポートします。
Imports Microsoft.Xna.Framework.Audio

Partial Public Class MainPage
  Inherits PhoneApplicationPage
  ' Constructor
  Public Sub New()
    InitializeComponent()
  End Sub

定数変数myAppIDを宣言し、値に「Bing Developer Center で取得したAppID」を指定します。
  Const myAppID As String = " Bing Developer Center で取得したAppID"

「サービス参照の追加」で作成したクライアントクラスのインスタンスmyClientを、メンバ変数として宣言します。
  Dim myClient As New ServiceReference1.LanguageServiceClient

[翻訳と読み上げ]ボタンがクリックされた時の処理

TranslateAsyncメソッドに、何の言語から何の言語に翻訳するかを指定します。書式は下記の通りです。

TranslateAsync(Bing Developer Center で取得したAppID,翻訳するテキスト,どの言語から,どの言語に,ContentType,category)

「翻訳するテキスト」にはTextBoxの値を、「何の言語から」にはjaを指定して日本語から、「何の言語に」にはenを指定して英語に、ContentTypeとcategoryにはNothingを指定しておきます。
  Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
    myClient.TranslateAsync(myAppID, TextBox1.Text, "ja", "en", Nothing, Nothing)
  End Sub

ページが読み込まれた時の処理

TextBoxに表示しておく日本語の文章を指定します。AddHandlerメソッドで、翻訳が完了した時に発生するTranslateCompletedイベントに、イベントハンドラを追加します。イベントハンドラ内では以下の処理を実行します。
翻訳された結果(TransLateArgs.Result) を変数myLanguageに格納し、TextBlockに表示します。英語に翻訳された結果がTextBlockに表示されます。SpeakAsyncメソッドで英語に翻訳されたTextBlock内の内容を読み上げます。SpeakAsyncメソッドの書式は下記の通りです。

SpeakAsync(Bing Developer Center で取得したAppID,読み上げる内容,言語,形式)

「読み上げる内容」にはTextBlockの値を指定し、「言語」には英語を表すenを指定し、「形式」にはaudio/wavを指定します。
次に、AddHandlerメソッドで、読み上げが完了した時に発生する、SpeakCompletedイベントに、イベントハンドラを追加します。イベントハンドラ内では、以下の処理を実行します。
  WebClientクラスの新しいインスタンスmyWebClientを生成します。WebClientクラスは、URIで識別されるリソースとの間でデータを送受信する共通メソッドを提供するクラスです。OpenReadAsyncメソッドで、指定したリソースを格納している読み取り可能なストリーム(SpeakArgs.Result)を開きます。リソースは絶対URIで開きます。
AddHandlerメソッドで、リソースを格納しているストリームを開く非同期操作の完了時に発生するOpenReadCompletedイベントに、イベントハンドラを指定します。イベントハンドラ内では、以下の処理を行います。
SoundEffect.FromStreamメソッドで、指定したデータストリーム(OpenReadArgs.Result)にmySoundEffect オブジェクトを作成します。SoundEffectクラスは、読み込まれたサウンドリソースを提供し、Playメソッドを呼び出すことによって複数の SoundEffect を再生できるクラスです。フレームワークコンポーネント (メディアなど)の状態を更新する、FrameworkDispatcher.Update()メソッドを実行します。PlayメソッドでSoundEffectを再生します。これで、英文の読み上げが実行されます。FrameworkDispatcher.Update()メソッドの記述を忘れると再生されませんので注意してください。
  Private Sub MainPage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    Dim myLanguage As String
      TextBox1.Text = "何かお手伝いしましょうか?"
 
      AddHandler myClient.TranslateCompleted, Sub(TranslateSender, TransLateArgs)
                                                 myLanguage = TransLateArgs.Result
                                                 TextBlock1.Text = myLanguage
                                                 myClient.SpeakAsync(myAppID, TextBlock1.Text, "en", "audio/wav")
                                               End Sub



      AddHandler myClient.SpeakCompleted, Sub(SpeakSender, SpeakArgs)
                                            Dim myWebClient As New WebClient
                                            myWebClient.OpenReadAsync(New Uri(SpeakArgs.Result, UriKind.Absolute))
                                            AddHandler myWebClient.OpenReadCompleted, Sub(OpenReadSender, OpenReadArgs)
                                                                               Dim mySoundEffect As SoundEffect = SoundEffect.FromStream(OpenReadArgs.Result)
FrameworkDispatcher.Update()
mySoundEffect.Play()
                                                                           End Sub
                                            End Sub
  End Sub
End Class

最後に、次ページで小さなサンプルを1つ紹介します。

Think IT会員限定特典
  • 「翻訳された英文の表示と読み上げ」サンプルプログラム_1

  • 「翻訳された英文の表示と読み上げ」サンプルプログラム_2

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think IT会員サービス無料登録受付中

Think ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。会員登録を済ませてThink ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

他にもこの記事が読まれています