seikacenter-200
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| seikacenter-200 [2023/04/13 00:45] – 削除 - 外部編集 (Unknown date) 127.0.0.1 | seikacenter-200 [2025/03/30 02:01] (現在) – 外部編集 127.0.0.1 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== HTTP機能利用例 ====== | ||
| + | |||
| + | SeikaCenterのサポートは終了いたしました。\\ この製品に修正や機能拡張は今後行われません。現時点での最新版のダウンロードは可能です。\\ | ||
| + | 後継プロダクト AssistantSeika をご利用ください。 | ||
| + | |||
| + | SeikaCenterをWebブラウザのJavaScriptで操作するサンプルWebアプリケーション SeikaSanJS の説明。 | ||
| + | |||
| + | |||
| + | |||
| + | ===== 概要 ===== | ||
| + | |||
| + | SeikaCenter 20190428/u 以降に追加した、簡易Webサーバ機能とHTTP機能を使って、WebブラウザからSeikaCenterを制御するアプリケーションです。 | ||
| + | |||
| + | ===== 実行例 ===== | ||
| + | |||
| + | HTTP機能で設定したURL http:// | ||
| + | モダンなブラウザなら多分開けるでしょう。 | ||
| + | |||
| + | 話者のプルダウンを選択すると、その話者のパラメタ入力欄が動的に生成されます。なお、以前のパラメタ値を覚えているような作りにはなっていませんので注意してください。 | ||
| + | |||
| + | また、入力値に対するエラーチェックは省いてます。気になったら利用者自身で追加してください。 | ||
| + | {{pasted: | ||
| + | {{pasted: | ||
| + | {{pasted: | ||
| + | |||
| + | ===== 設定 ===== | ||
| + | |||
| + | ==== SeikaCenter設定 ==== | ||
| + | |||
| + | 設定2タブの設定を書き換えます。 | ||
| + | |||
| + | * 待ち受けアドレスには、SeikaCenterを実行しているPCに割り当てたIPアドレスを入力します。この例では " | ||
| + | * Access-Control-Allow-Origin は、待ち受けアドレスと待ち受けポートからURLを作ります。この例では " | ||
| + | * 配布アーカイブに含まれる、app フォルダを、丸ごとワークフォルダへコピーします。この例ではワークフォルダが " | ||
| + | |||
| + | 設定が終わったら利用可能話者タブのサービス開始/ | ||
| + | |||
| + | {{pasted: | ||
| + | |||
| + | ==== SeikaSan.js 書き換え ==== | ||
| + | |||
| + | C: | ||
| + | * var id = " | ||
| + | * var pass = " | ||
| + | * var url = " | ||
| + | |||
| + | を自分のSeikaCenterの設定に合わせて書き換えます。 | ||
| + | |||
| + | 以下は20190428/ | ||
| + | |||
| + | <code js SeikaSan.js> | ||
| + | // 単にPCの音声合成製品を発声させるだけならこちら true, ブラウザを実行している機器で再生するなら false | ||
| + | var playswitch | ||
| + | var headers | ||
| + | var fetchopt | ||
| + | var id = " | ||
| + | var pass = " | ||
| + | var url = " | ||
| + | var sampleRate | ||
| + | var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); | ||
| + | var paramJson; | ||
| + | |||
| + | function initcode() | ||
| + | { | ||
| + | headers.set(' | ||
| + | headers.set(' | ||
| + | fetchopt.headers = headers; | ||
| + | document.getElementById(' | ||
| + | document.getElementById(' | ||
| + | } | ||
| + | |||
| + | function MakeTalkParam() | ||
| + | { | ||
| + | var body = {}; | ||
| + | |||
| + | body.talktext = document.getElementById(' | ||
| + | body.effects | ||
| + | for(let propName in paramJson.effect) | ||
| + | { | ||
| + | body.effects[propName] = parseFloat(document.getElementById(propName).value); | ||
| + | } | ||
| + | if (" | ||
| + | { | ||
| + | body.emotions = {}; | ||
| + | for(let propName in paramJson.emotion) | ||
| + | { | ||
| + | body.emotions[propName] = parseFloat(document.getElementById(propName).value); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | return body; | ||
| + | } | ||
| + | |||
| + | async function Talk() | ||
| + | { | ||
| + | var cid = document.getElementById(' | ||
| + | var btn = document.getElementById(' | ||
| + | |||
| + | fetchopt.method | ||
| + | fetchopt.body | ||
| + | btn.disabled = true; | ||
| + | |||
| + | if (playswitch) | ||
| + | { | ||
| + | const res = await fetch(url + "/ | ||
| + | const json = await res.json(); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | const res = await fetch(url + "/ | ||
| + | const wavbuff = await res.arrayBuffer(); | ||
| + | var audioBuffer = await audioCtx.decodeAudioData(wavbuff); | ||
| + | var source = audioCtx.createBufferSource(); | ||
| + | source.buffer = audioBuffer; | ||
| + | source.loop | ||
| + | source.loopStart = false; | ||
| + | source.loopEnd | ||
| + | source.connect(audioCtx.destination); | ||
| + | source.start(0); | ||
| + | } | ||
| + | |||
| + | btn.disabled = false; | ||
| + | } | ||
| + | |||
| + | async function MakeAvatorList() | ||
| + | { | ||
| + | fetchopt.method | ||
| + | fetchopt.body | ||
| + | const res = await fetch(url+"/ | ||
| + | const json = await res.json(); | ||
| + | |||
| + | var sel = document.getElementById(' | ||
| + | sel.disabled = true; | ||
| + | for(let idx=0; idx< | ||
| + | { | ||
| + | | ||
| + | } | ||
| + | sel.disabled = false; | ||
| + | MakeEffectPanel(); | ||
| + | } | ||
| + | |||
| + | async function MakeEffectPanel() | ||
| + | { | ||
| + | var sel = document.getElementById(' | ||
| + | var cid = sel.options[sel.selectedIndex].value; | ||
| + | fetchopt.method | ||
| + | fetchopt.body | ||
| + | const res = await fetch(url+"/ | ||
| + | paramJson = await res.json(); | ||
| + | |||
| + | var p300 = document.getElementById(' | ||
| + | var s = p300.childNodes.length; | ||
| + | for(let idx=0; idx < s; idx++) | ||
| + | { | ||
| + | p300.removeChild(p300.firstChild); | ||
| + | } | ||
| + | |||
| + | for(let propName in paramJson.effect) | ||
| + | { | ||
| + | var item = paramJson.effect[propName]; | ||
| + | var p1 = document.createTextNode(propName + ': '); | ||
| + | var p2 = document.createElement(' | ||
| + | var p3 = document.createTextNode(' | ||
| + | var p4 = document.createElement(' | ||
| + | p300.appendChild(p1); | ||
| + | p300.appendChild(p2); | ||
| + | p2.value = item.value; | ||
| + | p2.id = propName; | ||
| + | p300.appendChild(p3); | ||
| + | p300.appendChild(p4); | ||
| + | } | ||
| + | |||
| + | for(let propName in paramJson.emotion) | ||
| + | { | ||
| + | var item = paramJson.emotion[propName]; | ||
| + | var p1 = document.createTextNode(propName + ': '); | ||
| + | var p2 = document.createElement(' | ||
| + | var p3 = document.createTextNode(' | ||
| + | var p4 = document.createElement(' | ||
| + | p300.appendChild(p1); | ||
| + | p300.appendChild(p2); | ||
| + | p2.value = item.value; | ||
| + | p2.id = propName; | ||
| + | p300.appendChild(p3); | ||
| + | p300.appendChild(p4); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 以下は20190428/ | ||
| + | |||
| + | <code html seikasanjs.html> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta charset=" | ||
| + | < | ||
| + | <script src=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <select id=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | <button id=" | ||
| + | < | ||
| + | < | ||
| + | <div id=" | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | initcode(); | ||
| + | MakeAvatorList(); | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== 音声再生場所の変更 ===== | ||
| + | |||
| + | SeikaSan.js の以下の行をtrueにするとSeikaCenterを実行しているPCで音声再生となり、falseにすると、seikasanjs.htmlを表示しているWebブラウザを実行しているPCで音声再生します。 | ||
| + | |||
| + | < | ||
| + | |||
| + | {{tag> 技術資料 Windows Voiceroid2 CeVIO }} | ||
| + | |||
