ロボットは䞀生懞呜働き、人々は幞せですAI芁玠を含むりェビナヌのアヌカむブの怜玢システムをどのように䜜成したか

私たちは興味深い時代に生きおいたす。毎日がニュヌスであり、ニュヌラルネットワヌクが私たちの生掻をより簡単で䟿利にするのにどのように圹立぀かです。私は長い間、ニュヌロンに基づく機械孊習アルゎリズムを実隓したいず思っおいたしたが、今では重芁なタスクが発生したした。





今幎3月の自己隔離ぞの移行に䌎い、倚くの䌁業ず同様に、すべおの食料品むベントをオンラむンに移行したした。さお、あなたはサルずのりェビナヌに぀いおのこの玠晎らしい写真を芚えおいたす。過去6か月間で、私のチヌムが担圓するデヌタセンタヌのトピックに぀いおのみ、玄25の2時間の蚘録されたりェビナヌ、合蚈50時間のビデオを蓄積したした。完党に成長しおいる問題は、特定の質問に察する回答を探すためにどのビデオでどのように理解するかです。カタログ、タグ、簡単な説明は良いです、たあ、私たちは぀いにトピックに関する4぀の2時間のビデオがあるこずを発芋したした、そしおそれから䜕ですか巻き戻しを芋たすかどういうわけか違う方法で可胜ですかそしお、あなたがファッショナブルな方法で行動し、AIを台無しにしようずしたら



せっかちな人のためのネタバレ完党な奇跡のシステムを芋぀けるこずも、膝の䞊に組み立おるこずもできなかったので、この蚘事には意味がありたせん。しかし、数日ずいうよりは倜の調査の結果、私は実甚的なMVPを手に入れたした。これに぀いおお話ししたいず思いたす。この蚘事の目的は、この問題ぞの関心のレベルを調べ、知識のある人々からアドバむスを埗お、おそらく同じ問題を抱えおいる他の誰かを芋぀けるこずです。



私がしたいこず



䞀芋、すべおがシンプルに芋えたした。ビデオを撮り、それをニュヌラルネットワヌクで実行し、テキストを取埗しおから、関心のあるトピックを説明するテキスト内のフラグメントを探したす。カタログ内のすべおのビデオを䞀床に怜玢するずさらに䟿利です。実際、テキストのトランスクリプトをビデオず䞀緒にアップロヌドするこずは長い間発明されおきたした。Youtubeやほずんどの教育プラットフォヌムはこれを行うこずができたすが、そこで人々がこれらのテキストを線集するこずは明らかです。目でテキストをすばやくスキャンしお、目的の質問に察する答えがあるかどうかを理解できたす。おそらく、䟿利な機胜から、テキストの興味のある堎所を突いお、講垫が蚀ったり瀺したりするこずを聞くこずができおも害はありたせん。テキスト内の単語のマヌクアップが時間内にあれば、これも難しくありたせん。さお、私は開発の可胜な方向性を倢芋おいたした、最埌に話したしょう、それでは、チェヌンをできるだけ効率的に実装しおみたしょう。

ビデオファむル->テキストフラグメント->ファゞヌテキスト怜玢。



最初は、すべおがずおも単玔で、このケヌスはすでに4幎間すべおのAI䌚議で議論されおいるので、そのようなシステムは既補であるはずだず思いたした。蚘事を怜玢しお読んだ数時間は、そうではないこずを瀺したした。ビデオは䞻に、コヌルセンタヌの゜リュヌションの䞀郚ずしお、顔、車、その他の芖芚オブゞェクトマスク/ヘルメット、オヌディオ曲、トラック、スピヌカヌのトヌン/むントネヌションを探すために䜿甚されたす。Deepgramシステムに぀いおのこの蚀及だけを芋぀けるこずができたした。しかし、残念ながら、圌女はロシア語をサポヌトしおいたせん。たた、MicrosoftはStreamsで非垞によく䌌た機胜を備えおいたすが、ロシア語のサポヌトに぀いおの蚀及はどこにも芋぀かりたせんでした。明らかに、そこにもありたせん。



さお、再発明したしょう。私はプロのプログラマヌではありたせんがちなみに、コヌドに察する建蚭的な批刀は喜んで受け入れたす、時々「自分のために」䜕かを曞いおいたす。音声をテキストに倉換できるニュヌラルネットワヌクは、サプラむズサプラむズ、音声からテキストぞず呌ばれたす。公開のスピヌチからテキストぞのサヌビスを芋぀けるこずができれば、それを䜿甚しおすべおのりェビナヌでスピヌチを「デゞタル化」し、テキストでファゞヌ怜玢を行うこずができたす。これは簡単な䜜業です。最初は「クラりドに登る」ずは思っおいなかったので、すべおをロヌカルで収集したかったのですが、ハブレに関するこの蚘事を読んだ埌、音声認識はクラりドで行う方が本圓に良いず刀断したした。



音声からテキストぞのクラりドサヌビスを探しおいたす



スピヌチからテキストぞの倉換が可胜なサヌビスの怜玢では、ロシアで開発されたものを含め、そのようなシステムがたくさんあるこずがわかりたした。その䞭には、Google、Amazon、MSAzureなどのグロヌバルクラりドプロバむダヌもありたす。ロシア語を含むいく぀かのサヌビスの説明はここにありたす。通垞、怜玢゚ンゞンの結果の最初の20行は䞀意になりたす。しかし、別の問題がありたす。将来、このシステムを本番環境に移行したいず考えおいたす。これにはコストがかかりたす。私は、䞻芁なクラりドずグロヌバルに契玄を結んでいるCiscoで働いおいたす。それで、リスト党䜓から、私は今のずころそれらだけを考慮するこずにしたした。



だから私のリストはGoogle、Amazon、Azure、IBM Watsonタむトルぞのリンクは䞋の衚ず同じです。すべおのサヌビスには、それらを䜿甚できるAPIがありたす。残りの可胜性を分析した埌、私は小さな衚をたずめたした。







IBM Watsonはこの段階でレヌスを去りたした。私がロシア語で録音したものはすべお、りェビナヌからの短い抜粋で残りのプロバむダヌをテストするこずにしたした。 AWSずAzureでアカりントを蚭定したした。将来的には、Microsoftはアカりントの蚭定に関しおひびを入れるのが難しいこずが刀明したず蚀えたす。私はアムステルダムのどこかでむンタヌネットに「着陞」する䌁業ネットワヌクで働いおいたした。登録プロセス䞭に、自分の䜏所がロシアであるかどうかを2回尋ねられた埌、システムはアカりントが管理䞊ブロックされおいるずいうメッセヌゞを衚瀺したした。 ..。この蚘事を曞いおいる5日埌、状況は倉わっおいないので、Azureをただテストできおいたせん。これは残念です私は理解しおいたす-セキュリティですが、これではただサヌビスを詊すこずができたせん。埌で状況が解決したずきに、これを実行しようずしたす。



これずは別に、Yandex.Cloudでそのような機胜をテストしたいず思いたす。理論的には、ロシア語の音声の認識が最適であるはずです。ただし、残念ながら、サヌビスのテストアクセスペヌゞには、テキストを「蚀う」機胜しかなく、ファむルのダりンロヌドは提䟛されおいたせん。そこで、2䜍はAzureず䞀緒に延期したす。



だから、グヌグルずアマゟンがありたす、すぐにそれをテストしたしょうコヌドを䜜成する前に、すべおを手動で確認および比范できたす。䞡方のプロバむダヌには、APIに加えお、管理むンタヌフェむスがありたす。テストのために、私は最初に、可胜であれば、最小限の専門甚語を䜿甚しお、䞀般的な性質の10分のフラグメントを準備したした。しかし、その埌、Googleはテストモヌドで最倧1分のフラグメントをサポヌトしおいるこずが刀明したため、この57秒のフラグメントを䜿甚しおサヌビスを比范したした。



  • Google , .
  • AWS Transcribe AWS, . AWS Transcribe 1 . , , AWS S3. ,


䜜業の結果に基づいお、䞡方のサヌビスが認識されたテキストを発行し、1分間隔で䜜業の結果を比范できたす。







率盎に蚀っお、結果は期埅どおりではありたせんが、モデルがカスタマむズのためのさたざたなオプションを提䟛するこずは䜕の意味もありたせん。ご芧のずおり、「箱から出しおすぐに」䜿甚できるGoogle゚ンゞンは、ほずんどのテキストをより明確に認識し、すべおではありたせんが、䞀郚の補品の名前も確認できたした。これは、圌らのモデルが倚蚀語テキストを可胜にするこずを瀺唆しおいたす。アマゟン埌でこれが確認されたにはそのような機䌚がありたせん-圌らはロシア語を蚀いたした、それは私たちが歌うこずを意味したす「キンベむビヌロム」ずピリオド



しかし、Amazonが提䟛するタグ付きJSONを取埗する機胜は、私には非垞に興味深いように思えたした。結局のずころ、これにより、将来、目的のフラグメントが芋぀かったファむルの郚分ぞの盎接遷移を実装できるようになりたす。すべおの音声認識ニュヌラルネットワヌクがこのように機胜するため、おそらくGoogleにもそのような機胜がありたすが、ドキュメントをざっず怜玢しおもこの機胜を芋぀けるこずができたせんでした。







このJSONを芋るず、翻蚳されたテキストトランスクリプト、単語の配列アむテム、およびセグメントのセットセグメントの3぀のセクションで構成されおいるこずがわかりたす。単語ずセグメントの配列に぀いおは、各芁玠に぀いお、その開始時刻ず終了時刻、およびそれが正しく認識されたずいう神経ネットワヌクの信頌性が瀺されたす。



デヌタセンタヌを理解するためのニュヌラルネットワヌクの指導



そこで、この段階の終わりに、さらなる実隓のためにAmazon Transcribeを遞択し、孊習モデルを蚭定するこずにしたした。たた、安定した認識が埗られない堎合は、Googleにご盞談ください。さらなるテストは、10分のフラグメントで実行されたした。



AWS Transcribeには、ニュヌラルネットワヌクが認識するものを調敎するための2぀のオプションず、テキストを埌凊理するための2぀の機胜がありたす。



  1. Custom Vocabularies – «» , , «» , . : «, , » Word 97- . , , .. .
  2. Custom Language Models – «» 10 . , . , , , .
  3. , , -. , – , .. -, .


それで、私はテキストのために私自身の蚀葉を䜜るこずに決めたした。明らかに、「ネットワヌク、サヌバヌ、プロファむル、デヌタセンタヌ、デバむス、コントロヌラヌ、むンフラストラクチャ」などの単語が含たれたす。 2〜3回のテストの埌、私の語圙は60語に増えたした。この蟞曞は、通垞のテキストファむルで、1行に1単語、すべお倧文字で䜜成する必芁がありたす。単語の発音を指定する機胜を備えた、より耇雑なオプションここで説明もありたすが、最初の段階では、単玔なリストを䜿甚するこずにしたした。



蟞曞を䜿甚する前に、それを䜜成する必芁がありたす。Amazon Transcribeの[ Custom vocabulary ]タブで、[ Create Vocabulary ]をクリックし、ファむルのテキストをロヌドし、ロシア語を指定し、残りの質問に答えるず、蟞曞の䜜成プロセスが始たりたす。圌が出たら凊理が準備完了になりたす-蟞曞を䜿甚できたす。



問題は残っおいたす-「英語」の甚語をどのように認識するか蟞曞は1぀の蚀語しかサポヌトしおいないこずを思い出させおください。最初は、英語の甚語を䜿っお別の蟞曞を䜜成し、同じテキストを実行するこずを考えたした。Cisco、VLAN、UCSなどの甚語が怜出された堎合等c確率率100-指定された時間フラグメントに察しおそれらを取埗したす。しかし、すぐに機胜しなかったず蚀いたす。英語のアナラむザヌは、テキスト内の甚語の半分以䞊を認識したせんでした。考えおみたずころ、これらすべおの甚語を「ロシアのアクセント」で発音しおいるので、英米人でさえ初めお私たちを理解しおいないので、これは論理的であるず刀断したした。これは、「聞いたずおりに曞かれおいる」ずいう原則に埓っお、これらの甚語をロシアの蟞曞に単玔に远加するずいうアむデアを促したした。Cisco、usies、eisiai、vilan、viikslan-結局のずころ、私たちはお互いに通信するずきに正盎に蚀っおいたす。これにより、蟞曞が数十語増えたしたが、将来的には、認識品質が1桁向䞊したした。



「いい考えが来る」ずいうこずわざにあるように、最初の蟞曞はすでに䜜成されおいるので、別の蟞曞を䜜成し、それにすべおの略語を远加しお、䜕が起こるかを比范するこずにしたした。



蟞曞で認識を開始するこずで、同様に簡単です議事録のサヌビス䞊の転写ゞョブ、タブを遞択し、ゞョブを䜜成し、ロシア語を指定し、蟞曞我々の必芁性を指定するこずを忘れないでください。もう1぀の䟿利なアクション-ニュヌラルネットワヌクにいく぀かの代替怜玢結果を提䟛するように䟝頌できたす。代替結果-はい項目、3぀の代替オプションを蚭定したす。埌でファゞヌテキスト怜玢を行うずきに、これは䟿利です。



10分のテキストの攟送には4〜5分かかりたす。時間を無駄にしないために、結果を比范するプロセスを容易にする小さなツヌルを䜜成するこずにしたした。 JSONファむルの最終テキストをブラりザに衚瀺するず同時に、ニュヌラルネットワヌクによる個々の単語の怜出の「信頌性」を匷調したす同じ信頌性パラメヌタ。結果のテキストには、デフォルトの翻蚳、甚語のない蟞曞、甚語のある蟞曞の3぀のオプションがありたす。 3぀のテキストすべおを3぀の列に同時に衚瀺したす。信頌性の高い単語を緑で95以䞊、黄色で95から70、赀で70未満で匷調衚瀺したす。結果のHTMLペヌゞの急いでコンパむルされたコヌドは以䞋のずおりです。JSONファむルはファむルず同じディレクトリにある必芁がありたす。ファむル名は、FILENAME1倉数などで指定されたす。



結果を衚瀺するためのHTMLペヌゞコヌド
<!DOCTYPE html>
<html lang="en">
<head>  <meta charset="UTF-8">    <title>Title</title> </head>
<body onload="initText()">
<hr> <table>  <tr valign="top">
        <td width="400"> <h2 >- </h2><div id="text-area-1"></div></td>
        <td width="400"> <h2 > 1:  / </h2><div id="text-area-2"></div></td>
        <td width="400"> <h2 > 2: /   </h2><div id="text-area-3"></div></td>
    </tr> </table> <hr>
<style>
.known {  background-image: linear-gradient(90deg, #f1fff4, #c4ffdb, #f1fff4);   }
.unknown {  background-image: linear-gradient(90deg, #ffffff, #ffe5f1, #ffffff);    }
.badknown {  background-image: linear-gradient(90deg, #feffeb, #ffffc2, #feffeb);  }
</style>

<script>
    // File names
    const FILENAME1 = "1-My_CiscoClub_transcription_10min-1-default.json";
    const FILENAME2 = '2-My_CiscoClub_transcription_10min-2-Russian_only.json';
    const FILENAME3 = '3-My_CiscoClub_transcription_10min-v3_Russian_terminilogy.json';

    // Read file from disk and call callback if success
     function readTextFile(file, textBlockName, callback) {
            let rawFile = new XMLHttpRequest();
            rawFile.overrideMimeType("application/json");
            rawFile.open("GET", file, true);
            rawFile.onreadystatechange = function() {
                if (rawFile.readyState === 4 && rawFile.status == "200") {
                    callback(textBlockName, rawFile.responseText);
                }
            };
            rawFile.send(null);
        }

    // Insert text to text block and color words confidence level
        function updateTextBlock(textBlockName, text) {
            var data = JSON.parse(text);
            let translatedTextList = data['results']['items'];
            
            const listLen = translatedTextList.length;
            const textBlock = document.getElementById(textBlockName);

            for (let i=0; i<listLen; i++) {
                let addWord = translatedTextList[i]['alternatives'][0];
                // load word probability and setup color depends on it
                let wordProbability = parseFloat(addWord['confidence']);
                let wordClass = 'unknown';  
                // setup the color
                if (wordProbability > 0.95) {
                    wordClass = 'known';
                } else if (wordProbability > 0.7) {
                    wordClass = 'badknown';
                }
                // insert colored word to the end of block
                let insText = '<span class="' + wordClass+ '">' + addWord['content'] + ' </span>';
                textBlock.insertAdjacentHTML('beforeEnd', insText)
            }
        }

        function initText() {
         // read three files each to it's area
        readTextFile(FILENAME1, "text-area-1", function(textBlockName, text){
            updateTextBlock(textBlockName, text);
        });
        readTextFile(FILENAME2, "text-area-2", function(textBlockName, text) {
            updateTextBlock(textBlockName, text);
        });
        readTextFile(FILENAME3, "text-area-3", function(textBlockName, text) {
            updateTextBlock(textBlockName, text);
        });
        }
</script>
</body></html>




3぀のタスクすべおのasrOutput.jsonファむルをダりンロヌドし、HTMLスクリプトで蚘述された名前に倉曎するず、次のようになりたす。







ロシア語の甚語を远加するこずで、ニュヌラルネットワヌクが特定の甚語「サヌビスプロファむル」などをより正確に認識できるようになったこずがはっきりずわかりたす。そしお、2番目のステップでロシア語の文字起こしを远加するず、CSKAがciscoに倉わりたした。テキストはただかなり「汚い」ですが、私のコンテキスト怜玢タスクにはすでに適しおいるはずです。新しいりェビナヌが远加されお読たれるに぀れお、語圙は埐々に拡倧したす。これは、忘れおはならないそのようなシステムを維持するプロセスです。



認識されたテキストのファゞヌ怜玢



ファゞヌ怜玢の問題を解決するには、おそらく12のアプロヌチがありたす。ほずんどの堎合、それらは、たずえばLevenshtein距離など、数孊的なアルゎリズムの小さなセットに基づいおいたす。これに぀いおの良い蚘事、もう1぀そしおもう1぀。しかし、私は打ち䞊げや動䜜など、準備ができおいるものを芋぀けたかったのです。



ロヌカル文曞怜玢のための既補の゜リュヌションから、少し研究した埌、私は比范的叀いプロゞェクトを芋぀けSPHINXを、フルテキスト怜玢の可胜性は、それはそう、それはそれに぀いお曞かれおいる、PostgreSQLではあるHERE。しかし、ロシア語を含むほずんどの資料は、Elasticsearchに぀いお芋぀かりたした。のような良いスタヌトアップずセットアップガむドを読んだ埌この投皿たたはこのレッスン、ここに別のもの、およびPythonのドキュメントずAPIガむドがあり、私はそれを䜿甚するこずにしたした。



すべおのロヌカル実隓で、私は長い間Dockerを䜿甚しおきたしたが、䜕らかの理由でただDockerを理解しおいないすべおの人に、これを行うこずを匷くお勧めしたす。実際、私はロヌカルオペレヌティングシステムで開発環境、ブラりザ、「ビュヌア」以倖のものを実行しないようにしおいたす。互換性の問題などがないこずは別ずしお。これにより、新補品をすばやく詊しお、うたく機胜するかどうかを確認できたす。



Elasticsearchを䜿甚しおコンテナをダりンロヌドし、次の2぀のコマンドで実行したす。



$ docker pull elasticsearch:7.9.1
$ docker run -d --name elasticsearch -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.9.1 


コンテナを起動http://localhost:9200するず、アドレスに゚ラスティックむンタヌフェむスが衚瀺され、ブラりザたたはPOSTMANツヌルのRESTAPIを䜿甚しおアクセスできたす。しかし、私は䟿利なChromeプラグむンを芋぀けたした。



これは、䞊蚘のガむドの1぀で説明されおいる面癜い子猫に関する䟋でプラグむンりィンドりがどのように芋えるかです。







巊偎はリク゚ストです-右偎は回答、自動完了、構文の匷調衚瀺、自動フォヌマットです-生産性を高めるために他に䜕が必芁ですかさらに、このプラグむンは、クリップボヌドから貌り付けられたテキストのCURLコマンドラむン圢匏を認識しお正しくフォヌマットできたす。たずえば、

「curl -X GET $ ES_URL」行を貌り付けお、䜕が起こるかを確認したす。䞀般的には䟿利なものです。



䜕をどのように保存および怜玢したすかElasticsearchは、すべおのJSONドキュメントを取埗し、それらをむンデックスず呌ばれる構造に栌玍したす。むンデックスはいく぀でも存圚できたすが、1぀のむンデックスに同皮のデヌタずドキュメントを含めるこずができ、フィヌルドの構造は類䌌しおおり、怜玢方法も同じです。



ファゞヌ怜玢の可胜性を調査するために、前の手順で取埗した転蚘ファむルのフレヌズセグメントセクションをダりンロヌドしお怜玢するこずにしたした。 JSONファむルのセグメントセクションでは、デヌタは次の圢匏で保存されたす。



-  1 (segment)
->   /  
->   
-->  1
---->   
---->  ,      (confidence) 
-->  2
---->   
---->  ,      (confidence) 


怜玢が成功する可胜性を高めたいので、すべおの代替オプションをデヌタベヌスにアップロヌドしお怜玢し、芋぀かったフラグメントから党䜓の信頌性が高いものを遞択したす。



JSONドキュメントを再フォヌマットしおElasticsearchにロヌドするには、小さなPythonスクリプトを䜿甚したす。スクリプトロゞックは次のずおりです。



  1. たず、セグメントセクションのすべおの芁玠ずすべおの代替転写オプションに぀いお説明したす。
  2. 各転写オプションに぀いお、その党䜓的な認識の信頌性を考慮したす。私は個々の単語の算術平均を取りたすが、おそらく将来的には、これにもっず泚意深く取り組む必芁がありたす。
  3. 代替の転蚘オプションごずに、フォヌムのレコヌドをElasticsearchにロヌドしたす



    {          "recording_id" : <   >,
                "seg_id" : <id >,
                "alt_id" : <id   >,
                "start_time" : <    >,
                "end_time" : <    >,
                "transcribe_score" : < (confidence) >,
                "transcript" : < >
    }
    


JSONファむルからElasticsearchにレコヌドをロヌドするPythonスクリプト
from elasticsearch import Elasticsearch
import json
from statistics import mean

#       
TRANCRIBE_FILE_NAME = "3-My_CiscoClub_transcription_10min-v3_Russian_terminilogy.json"
LOCAL_IP = "192.168.2.35"
INDEX_NAME = 'ciscorecords'

# Setup Elasticsearch connection
es = Elasticsearch([{'host': LOCAL_IP, 'port': 9200}])
if not es.ping():
    print ("ES connection error, check IP and port")

es.indices.create(index=INDEX_NAME) # Create index for our recordings

# Open and load file
res = None
with open(TRANCRIBE_FILE_NAME) as json_file:
    data = json.load(json_file)
    res = data['results']
    
#    
index = 1
for idx, seq in enumerate(res['segments']):
    # enumerate fragments
    for jdx, alt in enumerate(seq['alternatives']):
        # enumerate alternatives for each segments
        score_list = []
        for item in alt['items']:
            score_list.append( float(item['confidence']))
        score = mean(score_list)
        obj = {
            "recording_id" : "rec_1",
            "seg_id" : idx,
            "alt_id" : jdx,
            "start_time" : seq["start_time"],
            "end_time" : seq ["end_time"],
            "transcribe_score" : score,
            "transcript" : alt["transcript"]
            
        }
        es.index( index=INDEX_NAME, id = index, body = obj )
        
        index += 1




Pythonをお持ちでない堎合でも、心配しないでください。Dockerが再びサポヌトしおくれたす。私は通垞、Jupyterノヌトブック付きのコンテナヌを䜿甚したす。通垞のブラりザヌでコンテナヌに接続しお、必芁なこずをすべお実行できたす。コンテナヌが砎棄されるずすべおの情報が倱われるため、結果の保存に぀いお考慮する必芁があるのは1぀だけです。これたでこのツヌルを䜿甚したこずがない堎合は、初心者向けの優れた蚘事です。ちなみに、むンストヌルに関するセクションはスキップしおかたいたせん。



次のコマンドを䜿甚しお、Pythonノヌトブックでコンテナを起動したす。



$ docker run -p 8888:8888 jupyter/base-notebook sh -c 'jupyter notebook --allow-root --no-browser --ip=0.0.0.0 --port=8888'


そしお、スクリプトが正垞に起動された埌に画面に衚瀺されるアドレスにある任意のブラりザヌで接続しhttp://127.0.0.1:8888たす。これは、指定されたセキュリティキヌを䜿甚したす。



新しいノヌトブックを䜜成したす。最初のセルに次のように蚘述したす。

!pip install elasticsearch

実行し、APIを介しおESを操䜜するためのパッケヌゞがむンストヌルされるたで埅ち、スクリプトを2番目のセルにコピヌしお実行したす。䜜業埌、すべおが成功した堎合、Elasticsearchコン゜ヌルでデヌタが正垞にロヌドされたこずを確認できたす。コマンドを入力するGET /ciscorecords/_searchず、hits.total.valueフィヌルドに瀺されおいるように、ロヌドされたレコヌドが応答りィンドりに合蚈173個衚瀺されたす。







今こそファゞヌ怜玢を詊すずきです-それがすべおでした。たずえば、「デヌタセンタヌネットワヌクのコア」ずいうフレヌズを怜玢するには、次のコマンドを実行する必芁がありたす。



POST /ciscorecords/_search
{
"size" : 20,
"min_score" : 1,
"sort": { "_score": { "order": "desc"  } }, 
"query": {
    "multi_match": {
        "query"   : "  ",
        "fuzziness" : 2,
        "fields": [ "transcript" ], 
        "analyzer" : "russian"
    }
  },
  "_source": [ "transcript", "transcribe_score" ]
}


47もの結果が埗られたす







圓然のこずながら、それらのほずんどは同じフラグメントの異なるバリ゚ヌションであるためです。別のスクリプトを䜜成しお、各セグメントから信頌倀が最も高い1぀のレコヌドを遞択しおみたしょう。



Elasticsearchデヌタベヌスにク゚リを実行するPythonスクリプト
#####      
#   
# PHRASE = "  "
# PHRASE = "  "
PHRASE = "  "

LOCAL_IP = "192.168.2.35"
INDEX_NAME = 'ciscorecords'

#  
elastic_queary = {
    "size" : 40,
    "min_score" : 1,
    "sort": { "_score": { "order": "desc"  } },
    "query": {
        "multi_match": {
            "query"   : PHRASE,
            "fuzziness" : 2,
            "fields": [ "transcript" ], 
            "analyzer" : "russian"
        }
  },
}

# Setup Elasticsearch connection
es = Elasticsearch([{'host': LOCAL_IP, 'port': 9200}])
if not es.ping():
    print ("ES connection error, check IP and port")

#       
res = es.search(index=INDEX_NAME, body = elastic_queary)
print ("Got %d Hits:" % res['hits']['total']['value'])

#       
search_results = {}

for hit in res['hits']['hits']:
    seg_id = hit["_source"]['seg_id']
    if seg_id not in search_results or search_results[seg_id]['score'] < hit["_score"]:
        _res = hit["_source"]
        _res["score"] = hit["_score"]
        search_results[seg_id] = _res

print ("%s unique results \n-----" % len(search_results))

for rec in search_results:
    print ("seg %(seg_id)s: %(score).4f : start(%(start_time)s)-end(%(end_time)s) -- %(transcript)s" % \
           (search_results[rec]))




出力䟋



Got 47 Hits:
16 unique results 
-----
seg 39: 7.2885 : start(374.24)-end(377.165) --    ,   ..
seg 49: 7.0923 : start(464.44)-end(468.065) --  ,      ... 
seg 41: 4.5401 : start(385.14)-end(405.065) --         .     ,   ,     ,     ,            ,     ...
seg 30: 4.3556 : start(292.74)-end(298.265) --  ,       ,    ,  
seg 44: 2.1968 : start(415.34)-end(426.765) --      ,    ,      ,    .          -
seg 48: 2.0587 : start(449.64)-end(464.065) --              ,     ,       ,   ,  ,   .
seg 26: 1.8621 : start(243.24)-end(259.065) --     .   . ,   .         ...


結果がはるかに小さくなっおいるこずがわかりたした。これで、結果を衚瀺しお、最も関心のあるものを遞択できたす。

たた、ビデオフラグメントの開始時刻ず終了時刻があるため、ビデオプレヌダヌを䜿甚しおペヌゞを䜜成し、プログラムで目的のフラグメントに「巻き戻す」こずができたす。



ただし、このトピックに関する今埌の出版物に関心がある堎合は、このタスクを別の蚘事に入れたす。



結論の代わりに



そこで、この蚘事の枠組みの䞭で、技術的なトピックに関するりェビナヌの蚘録を備えたビデオツヌルを䜿甚しおテキスト怜玢システムを構築する問題をどのように解決したかを瀺したした。その結果、通垞MVPず呌ばれるものになりたす。結果を取埗し、その結果が原則ずしお既存のテクノロゞヌで達成可胜であるこずを蚌明するための最小限の䜜業アルゎリズム。



近い将来に実装できるアむデアから、最終補品に到達するたでにはただ長い道のりがありたす。

  • あなたが聞くこずができるようにビデオプレヌダヌをねじ蟌み、芋぀かったフラグメントを芋る
  • テキスト線集の可胜性を考えおください。100認識された単語のテキストにアンカヌを残すこずができたすが、認識品質が「䜎䞋」しおいるフラグメントのみを線集しおください。
  • elasticsearch, -
  • speech-to-text, Google, Yandex, Azure. –
  • , «»
  • BERT (Bi-directional Encoder Representation from Transformer), . – « xx yy».
  • , - - . Youtube , 15-20 , ,
  • – , , ,


ご䞍明な点やご意芋がございたしたら、お気軜にお問い合わせください。たた、プロセス党䜓を改善たたは簡玠化するためのご提案をお埅ちしおおりたす。これはHabrの最初の技術蚘事ですが、それが有甚で興味深いものになったこずを心から願っおいたす。



あなたの創造的な怜玢のすべおの人に頑匵っおください、そしおフォヌスがあなたず䞀緒にいるかもしれたせん



All Articles