ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

女性の声で文章を朗読する、VoiceTextとNHKのTVML miniを比べてみた

2006-11-15 22:38:23 | Weblog

ペンタックスが、入力した文字を女性の声で読み上げるVoiceTextという
製品のデモサイトについて、先週のR25(11/10→11/16号)に出ていたので、
つかってみました。

ここ http://voice.pentax.co.jp/pentaxtts/ttsdemoplay.asp

以下の文

人気女優の藤原紀香さんとお笑いタレントの陣内智則さんが結婚することが15日、分かった。

(引用もとは、ここ

 を、NHKのTVML mini出の読み上げとくらべてみました(ただしTVMLの場合は適当なところに改行をいれました。そうしないと巧く再生できないので)

 たしかに、TVML miniよりかは、自然に読んでますね。。

 でも、R25には、

さあ、Misakiちゃんに喋らせてみよう!癒されますよ。あーっと変な言葉はいわせないように

(Misakiちゃん=VoiceTextの女性の声)
って書いてあるけど、Hなことをよませようとしても。。この読み上げ声では(^^;)
ただし、ニュースっぽいのは、結構いい感じに読んでくれてるかも。。

NHKのTVML Miniよりも、むしろ、ニュースやブログ読み上げには向いている??



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

マニュアルの書き方読み方-その1 マニュアルの種類と読み方などなど。。。

2006-11-15 18:03:27 | Weblog

 本家のほうに、(ここ

 さっき書いた、マニュアルの読み方。
 じつは、マニュアルの書き方というのがあり、それの逆をやると、読めるようになる。
 頭からよんでいくと、わけわかんなくなる(人間の記憶の限界を超える)

 よく、短大卒の女性が、業務マニュアルを頭から読んで、やろとして、その業務マニュアルも
 更新されていないので、結局業務が分からないって言う結果になることがあるが、
 マニュアルは、頭から読むとわかんないことは、「ひじょーに」多い(^^;)


 って書いて、かんじんの、そのマニュアルの書き方っていうのを、書いてなかった。
 でも、どー考えても、ちゃんと説明すると、システム用語バリバリになるので、こっちに書きます。ただし、今日はシステム用語はないやつ。次回の書き方から、バリバリにでてきます。

(なお、「短大卒の女性」というのは、短大を差別しているわけではなく、短大卒の一般職で入社した人が、総合職の仕事を手伝うようになって、この壁にあたるような話を聞いたことがあるので、それを想定して書いています)




■マニュアルは、そもそも大きく4種類に分かれる

マニュアルと一口に言っても4種類に分かれます。

●インストールマニュアル、導入マニュアル等
 はじめの、導入時期(コンピューターならインストール)あるいは、これを変更するときとかにしか使わないもの。日常的には使わないもの。

 これは、頭から読んで、手順どおりになってください。
 たいてい、インストールの手順が書いてあって、そのとおりするとできます。

●オペレーションマニュアル
 業務に基づいた、一通りの流れが書いてあるもの
 名称はいろいろあり、オーバービューとか、ツアーガイドという名前になっていたりもする。

●リファレンスマニュアル
 1つ1つについて、細かく書いてあるもの
 コンピューターの場合、コマンドの説明になる

●手引書
 上記にあてまはらないもの。説明が書いてある。

 パソコンのアプリの本などもこの4種類に分けられる。
 なお、1つのマニュアルに4つのうちいくつも入っていることもある。これは、意識的にまとめている場合もおおいが、フリーのソフトの場合、マニュアルの書き方を知らない人が書くと、ごちゃごちゃになり、なにがかいてあるのか???ってこともある。この場合は、自分で4つにわける。
 意識している人は、ページごとに簡単に別れる。いしきしてないと、ぐちゃぐちゃになる(>_<!)




■インストール、オペレーションの順に読む。リファレンスはまず読むな。

 で、読み方。
 インストールマニュアルは読んで、まずは、インストールする。そっから、話は始まる。
 つぎに、オペレーションマニュアルをみる。

 はじめに、目次を見たり、ぱらぱらめくって、立ち上げと、終了を確認して、実行する。

 つぎに、目次をみて、どういう業務について説明してあるかを確認。
 このとき、最終的になにをやらせたいのか、そのとき、目次レベルでは、どういう手順なのかを確認する。最終的に何をやらせたいのかという点では、最終的にできるもの(帳票、成果物、ファイル、お金など)を確認し、そのために必要な大まかな手順を目次レベルで確認、頭の中に引き出しをつくる。

 それから、一つ一つの操作をしていくということになる。




■つまり、オペレーションマニュアルは、目的と、大まかな手順がある

 つまり、オペレーションマニュアルは、なにをしたいか、させたいかという目的と、そこにいたるための大まかな手順がある。そして、手順内に、大事なキーワード(イベント、ダイアログ操作など)がある。

1.この目的を確認し、
2.それにむけての手順のため、目次を見て、頭の中に引き出しを作って
3.キーワードを浮き彫りにして、引き出しに入れていく

という作業が、オペレーションマニュアルの手順になる。




■リファレンスは、オペレーションの補足である

 リファレンスマニュアルは、オペレーションマニュアルの補足で、この引き出しの中のキーワードの詳しい説明に過ぎない。なので、それは、オペレーションでもっと知りたいことがあったり、熟知したときに読むことである。手引書もそう。




っていうことで、概要はここまで。あとは、ディープな話を、またこんど。





  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JavaScript,AJAXにおける汎用的な設計をするためのレイヤ分け

2006-11-15 15:09:34 | Weblog

 昨日、建築用でも、農業用でも、ビジネス、宇宙開発、軍事でも汎用的なロボットを作るとしたら。。において、ロボットを汎用的にするために、何段階かのレイヤに分けて構築するという話になったけど、それを、Webアプリの画面制御のはなしにしたら、どーなるかって言う話。

で、昨日のレイヤわけなんだけど、こんなかんじ

1.センサーの値を数値にして返す、アクチュエーターに対する値に基づき動くというレイヤ
    →目とか手とか、そういう器官に相当する

2.基本的な汎用的な動作(歩くとか、走るとか、乗るとか)を示すレイヤ
    →反射や、小脳の運動系の処理に該当する

3.建築用、軍事用などにおける、ロボット単体の目的に合った動作をさせるレイヤ
    →相手を認識して機関銃を撃つとか、みかんを認識してみかんを摘み取るとか
    →大脳あたりの処理になってくる。運動を状況によって統合する

4.複数のロボットに対して、あんたは、これして、あんたはこれして、と操作する
    →管理職に相当する


ってことは、これを、画面に対応させると、こんなかんじかな

1.ブラウザがイベントや値を返し、逆に値を表示したりする
    →目とか手とか、そういう器官に相当する
    →ブラウザ自身の処理ということになる。ユーザーは操作できないところ

2.基本的な汎用的な動作(XMLアクセスとかキー取得とか)を示すレイヤ
    →各ブラウザの差異を吸収して、汎用的な関数にするレイヤ
    →prototype.jsなどが、フリーで出ているものとしては、相当する

3.画面の目的に合った動作をさせるレイヤ
    →一般の画面側のjavaScript(AJAX)を記述するところ

4.複数の端末に対して、処理する
    →Webで公開しているということは、基本的に複数端末対応ということになる
       →同時かどうかはわかんないけど。。。
    →Webサーバー側プログラム(CGIなど)


 なお、1から3までが、ブラウザ側、4がサーバー側で、3と4の間が、インターネットでの通信となる。なので、POSTあるいはGetによる通信ということになる。




 このとき、ブラウザによる差異は、2で吸収される。というか、逆に言うと、吸収されるようなライブラリを用意しておく。たしかにprototype.jsのようなフリーのものを使うのも、1つの方法かもしれないが、ブラウザがバージョンアップしたとき、もし、そのフリーソフトが対応するのに時間がかかったら、アウトっていうことになる。

 そういう意味で、ここをフリーにしないで、自分たちで作成し、ブラウザごとの特性のノウハウを持つことも、意味はある(どっちを選ぶかは企業戦略による)。




3と4の違いだが、この場合、前に書いたように、3は、ブラウザでなくても、ロボットでも、複写機でもいいっていうようなことを考えると、画面固有の、フォント・色の操作や情報は、できるだけ送らないほうがいいということになる。

 そうすると、画面情報は、CSSなり、XSLなりにいれておいて、ってことになるだろう。

 そんなロボットまで考えなくとも、CSSで、着せかえを意図している人たちはいるみたいだ。

 受け取りパラメータも、画面情報そのものだと、これは、ブラウザなどを認識しないといけなくなるので、(論理的な項目=値)の組で受け渡しできるようなカタチ(って、ふつうにCGIだとこうなるわけなんだけど)にしないといけないってことになる。




 ま、いわれなくても、そうしてるよ!といわれそうだが、ロボットなんかと、体系的に、かんがえられるということで、あえて書いてみたわけであります。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

仕様書からプログラムソースを生成する方法(Excelの仕様書編 その14:IF文追加ソース)

2006-11-15 10:51:32 | ケータイ

シリーズ仕様書からプログラムソースを生成する方法の続きです。

前回、その使用例をかきました。すみません、余計なことかいてると、字数制限にひっかかってしまうので、今日は、早速ソースを載せます。




■変更箇所のソース
 Excelのマクロを変更するわけですが、マクロは、「ユーザー作成部分」用と「標準処理」用の2つがあります。今回は、このアプリに限ったことではないので、「標準処理」のモジュールを修正します。
 修正した「標準処理」モジュールの内容は以下のとおりです。赤字で修正箇所は書いています。
'//*************************************************//
'//                                                 //
'//                標準処理                         //
'//                                                 //
'//*************************************************//

'//=========================//
'//     共通変数宣言        //
'//=========================//
Public outdata As String           '// 出力内容

    '// 繰り返し
Public lpstr_pos As Integer        '//  繰り返しソース開始点
Public lpgyo As Integer            '//  繰り返しデータ、今何行目?

    '// IF文
Public no_out_flg As Integer        '// 出力しないとき1

    '//    作業一覧シート用
Public Const sagyo_shname As String = "作業一覧"    '//シート名
Public Const sagyo_str_gyo As Integer = 5           '// 繰り返し開始行
Public Const sagyo_hina_keta As String = "A"        '// 雛形の桁
Public Const sagyo_sh_keta As String = "B"          '// シートの桁
Public Const sagyo_out_keta As String = "C"         '// 出力の桁


'//=========================//
'//  ボタンが押されたとき   //
'//=========================//
Sub shiyoToFile()
    Dim gyo As Integer
    Dim hina_name As String
    Dim sh_name As String
    Dim out_name As String
    
            '//================================//
            '//  開始時の前処理(固有処理)    //
            '//================================//
    Call initAppData
    
            '//================================//
            '//作業一覧に基づき出力(共通処理)//
            '//================================//
    gyo = sagyo_str_gyo
    Do While Sheets(sagyo_shname).Range(sagyo_hina_keta & CStr(gyo)) <> ""
        
        hina_name = Sheets(sagyo_shname).Range(sagyo_hina_keta & CStr(gyo))
        sh_name = Sheets(sagyo_shname).Range(sagyo_sh_keta & CStr(gyo))
        out_name = Sheets(sagyo_shname).Range(sagyo_out_keta & CStr(gyo))
        Call makefile(hina_name, sh_name, out_name)
        
        gyo = gyo + 1
    Loop
    
            '//================================//
            '//  終了時の後処理(固有処理)    //
            '//================================//
    Call freeAppData
    
    MsgBox "終わりました"

End Sub

'//=========================//
'//  出力ファイル作成     //
'//=========================//
Sub makefile(infname As String, shname As String, outfname As String)

            '//=========================//
            '//     雛形を読み込む      //
            '//=========================//
    Open infname For Binary Access Read As #1
    fsize = FileLen(infname)
    Seek #1, 1
    indata = Input(fsize, #1)
    Close #1

            '//=========================//
            '//     書き出し内容作成    //
            '//=========================//
    str_pos = 1         '   開始ポイント
    outdata = ""
    tag_pos = InStr(str_pos, indata, "$#$")
    no_out_flg = 0      '   IF文初期化
    
    Do While (tag_pos > 0)
                        '直前まで書き出し
        If (no_out_flg = 0) Then
            outdata = outdata & Mid(indata, str_pos, tag_pos - str_pos)
        End If
                        '制御内容終わりを探す
        end_pos = InStr(tag_pos + 3, indata, "$#$")
        If (end_pos = 0) Then
            str_pos = tag_pos + 3
            Exit Do
        End If
        
                        '制御内容コピー
        tag_data = Mid(indata, tag_pos, end_pos - tag_pos + 3)
        
                        '  制御内容ごとに処理
        str_pos = chgTagToStr(Replace(tag_data, "$#$", ""), end_pos + 3, shname)
        
        
            '   次のタグ位置を探す
        tag_pos = InStr(str_pos, indata, "$#$")
    Loop
            
            '   最後の残りを書き出し
    If (no_out_flg = 0) Then
        outdata = outdata & Mid(indata, str_pos)
    End If
            
            '//=========================//
            '//     作成データ書き出し  //
            '//=========================//
    If (Dir(outfname) <> "") Then
        Kill outfname       '   ファイルがあったら、削除しておく
    End If
    
    Open outfname For Binary Access Write As #1
    fsize = FileLen(outfname)
    Put #1, 1, outdata
    Close #1

End Sub

'//=========================//
'// タグを処理する      //
'//=========================//
Function chgTagToStr(tag As String, next_str_pos As Integer, shname As String) As Integer
    
    If (Mid(tag, 1, 6) = "REPEND") Then
        lpgyo = lpgyo + 1
        cellpos = Replace(Mid(tag, 7), " ", "") & CStr(lpgyo)
        celldata = Sheets(shname).Range(cellpos)
        If (celldata = "") Then
            chgTagToStr = next_str_pos
        Else
            chgTagToStr = lpstr_pos
        End If
        Exit Function
    End If
    
    If (Mid(tag, 1, 3) = "REP") Then
        lpstr_pos = next_str_pos
        lpgyo = CInt(Replace(Mid(tag, 4), " ", ""))
        chgTagToStr = next_str_pos
        Exit Function
    End If
    
    If (Mid(tag, 1, 4) = "CELL") Then
        cellpos = Replace(Mid(tag, 5), " ", "")
        celldata = Sheets(shname).Range(cellpos)
        If (no_out_flg = 0) Then
            outdata = outdata & celldata
        End If
        chgTagToStr = next_str_pos
        Exit Function
    End If
    
    If (Mid(tag, 1, 4) = "KETA") Then
        cellpos = Replace(Mid(tag, 5), " ", "") & CStr(lpgyo)
        celldata = Sheets(shname).Range(cellpos)
        If (no_out_flg = 0) Then
            outdata = outdata & celldata
        End If
        chgTagToStr = next_str_pos
        Exit Function
    End If

    If (Mid(tag, 1, 6) = "IFKETA") Then
        kugiri_pos = InStr(7, tag, ",")
        cellpos = Replace(Mid(tag, 7, kugiri_pos - 7), " ", "") & CStr(lpgyo)
        celldata = Sheets(shname).Range(cellpos)
        chkdata = Mid(tag, kugiri_pos + 1)
        If (celldata = chkdata) Then
            no_out_flg = 0
        Else
            no_out_flg = 1
        End If
        chgTagToStr = next_str_pos
        Exit Function
    End If
    
    If (Mid(tag, 1, 6) = "IFCELL") Then
        kugiri_pos = InStr(7, tag, ",")
        cellpos = Replace(Mid(tag, 7, kugiri_pos - 7), " ", "")
        celldata = Sheets(shname).Range(cellpos)
        chkdata = Mid(tag, kugiri_pos + 1)
        If (celldata = chkdata) Then
            no_out_flg = 0
        Else
            no_out_flg = 1
        End If
        chgTagToStr = next_str_pos
        Exit Function
    End If
    
    If (Mid(tag, 1, 5) = "IFEND") Then
        no_out_flg = 0
        chgTagToStr = next_str_pos
        Exit Function
    End If
    
    chgTagToStr = next_str_pos

End Function

(上記< > ¥ は本当は半角です)
これを、 < > ¥について、それぞれ半角に置換して、「標準処理」のモジュールを置き換えればうまくいきます。




ということで、このシリーズの今日の分はここまで。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする