オープンソースの詳細については、以下をご覧ください。 51CTO オープンソース基本ソフトウェアコミュニティ https://ost..com プロジェクトの背景「自閉症教育・リハビリテーション産業発展状況報告書」によると、世界中で54人に1人の子どもが自閉症スペクトラム障害を患っています。現在、中国における自閉症スペクトラム障害の患者数は1,300万人を超えており、この数は毎年20万人近くのペースで増加しています。 私たちの研究を通じて、わが国では自閉症スペクトラム障害の統一された診断基準が欠如していることがわかりました。主要な病院や医療機関の主流の診断計画は、依然として体重計などのツールに依存しており、誤診率が高くなっています。しかし、現在、診断のための科学的かつ正確な検査機器が不足しており、自閉症と診断される患者の平均年齢は4~5歳で、最適な早期スクリーニングおよび診断時期である18~24か月よりはるかに遅れており、子どもたちがリハビリ治療の最適な期間を逃す原因となっています。 上記の問題点を踏まえ、当チームは子どもの話し声を生データとして、ディープラーニングでトレーニングした高精度モデルを用いて、自閉症スペクトラム障害児と健常児の音響特徴の違いを比較・分析しました。音声分析技術を用いて分析用の音響特徴パラメータを抽出し、Runhe Dayu DAYU200を基に、音響の観点から検査対象児の早期スクリーニングを医師に指導しました。自閉症患者の実際のスクリーニング・診断年齢は1~2歳まで早めることができるため、自閉症スペクトラム障害児を非常に早期に診断することができ、介入治療をできるだけ早く実施して、先天性発達障害が患者と家族全体に与える影響を最小限に抑えることができます。 チームについてスターウォッチチームは、2021年6月に鄭州軽工業大学のメコルスタジオに設立されました。自閉症スペクトラム障害の診断技術の研究開発に重点を置いた、キャンパス内のイノベーションおよび起業家精神のチームです。メコルスタジオの講師と生徒も、極めて限られた条件の中で価値を最大限に高めなければなりません。スタジオは、高齢化、高齢者のリハビリテーション、特別なグループのケアに向けて長い道のりを歩んでいます。まずは紹介状を持って病院に出向き、協力を依頼し、少しずつ患者さんを訪問していきました。現在、Mercol Studio は 60 を超える医療プロジェクトの共同イノベーションと開発に携わっており、そのうち 40 以上は特別な集団をケアするためのプロジェクトです。脳卒中、自閉症、パーキンソン病などの分野で2,000人以上の患者からデータサンプルを収集し、300件以上の利用可能な医療事例を蓄積しています。 Huawei Cloudの紹介ビデオ。 BrainPole とのインタビュー - 荒野を照らすのは、若い開発者の目の中のたいまつです。 デザインのアイデアこのプロジェクトでは、ニューラルネットワークとオーディオ分析技術を使用して、自閉症スペクトラム障害を持つ子供たちの音響特徴パラメータを抽出して分析し、最も代表的な音響特徴と、分類と認識のパフォーマンスが最も優れたモデルを選別し、音響の観点から自閉症スペクトラム障害を持つ子供たちの早期診断を医師が行うのを支援し、分類用の機械学習モデルを設計します。モデルが構築され、最終的なネットワークは 93.8% の精度を達成しました。医師は、DAYU200端末、ウェブ端末、デスクトップexeプログラム端末、携帯電話端末Hongmeng APPで結果を確認できます。自閉症スペクトラム障害の予測精度は70%を超えており、自閉症スペクトラム障害の可能性がある子供は、最適な介入期間を逃さないように介入トレーニングを受けることをお勧めします。 開発・設計技術フレームワーク図は以下のとおりです。 主に以下のステップに分かれます。 1. 音声データの収集私たちのプロジェクトのオーディオ データ取得モジュールは、主にスピーカー、3 つのマイク アレイ デジタル信号プロセッサ、および Esp32-Korvo オーディオ開発ボードの 3 つの部分で構成されています。オーディオ データは、エコー キャンセル アルゴリズム、音声強調アルゴリズム、ノイズ低減アルゴリズム、オーディオ自動ゲイン アルゴリズムを通じて収集され、被験者のオーディオ データの品質が保証されます。その後、オーディオデータは Bluetooth または WLAN 経由でクラウド サーバーに送信され、さらに処理されます。内部レイアウトでは、開発基板、スピーカー、充電池のサイズを正確に計測し、内部部品の位置を合理的に計画・設計し、内部スペースを確保するための精密なモデリングを行いました。 製品の効果画像は以下の通りです。 2. オーディオデータの前処理データ収集モジュールで取得した音声データをHuaweiクラウドサーバーにアップロードし、独自開発のノイズ低減アルゴリズムを使用して収集した音声に対して二次ノイズ低減処理を行い、ガウスノイズ、ホワイトノイズなどのノイズを除去します。次に、OpenSmileを使用して音響特徴を抽出します。処理されたデータは、Librosaライブラリを使用してMFCC画像を描画するために使用されます。 まず、音声を画像に変換する前に、Berouti スペクトル減算法を使用して、自閉症患者の音声サンプルに含まれる加法性ノイズ (背景ノイズ) のスペクトル情報を取得し、それを周波数空間から減算します。同時に、抽出の困難さを回避するために、プリエンファシス技術を使用して元のオーディオにプリエンファシス フィルターを追加して高周波部分を強調し、フレーム分割とウィンドウ処理を使用して、分析対象の信号変化が突然消えるのを防ぎます。次に、連続したアナログ信号をデジタル信号に変換し、フレーム分割およびウィンドウ処理後の各フレーム信号を高速フーリエ変換して、各フレームのスペクトルを取得します。そして、音声信号のパワースペクトルは、音声信号のスペクトルの絶対値の二乗を取ることによって得られます。次に、三角形のバンドパス フィルターを使用してスペクトルを滑らかにし、高調波の影響を排除して、元の音声の共鳴ピークを強調します。したがって、音声のトーンやピッチはメル周波数ケプストラム係数に反映されません。言い換えれば、メル周波数ケプストラム係数によって特徴付けられる音響特徴フィルタリング認識および診断システムは、入力音声の異なるピッチの影響を受けません。さらに、計算量も削減できます。 最後に、離散コサイン変換 (DCT) によって MFCC 係数が得られます。 オーディオから画像への変換の具体的なプロセスは次のとおりです。 音響特徴から抽出され描画された MFCC 画像は次のとおりです。 3. 画像データ解析ディープラーニングモデルの予測プログラムでは、被験者の自閉症スペクトル障害が予測されています畳み込み層は、それぞれ完全に接続された層に入る前に、ベクターに平らになり、その後、ベクターレイヤーの層を抑制します最終的な1次元ベクトル出力はバイナリ分類に使用され、自閉症スペクトラム障害の子供の確率と正常な子供の確率が出力されます。ディープニューラルネットワークに基づくアルゴリズムは、コンピュータの強力な学習能力を利用して自閉症患者と健常者の音響特性を学習し、自閉症患者の音声データの効果的な認識を実現します。 開発環境- OpenHarmony 用 DevEco Studio 3.0.0.900
- OpenHarmony バージョン: 3.1_リリース
- 開発ボード: DAYU200
開発プロセスページ開発Huxing 健康システムのアイコン config.json ファイル内のソフトウェア アイコンとソフトウェア名を変更します。 「能力」 : [ { 「スキル」 : [ { 「エンティティ」 : [ 「エンティティ.システム.ホーム」 ]、 「アクション」 : [ 「アクション.システム.ホーム」 ] } ]、 「方向」 : 「未指定」 、 「表示」 : true 、 "srcPath" : "メインアビリティ" , 「名前」 : 「.MainAbility」 、 "src言語" : "js" 、 「アイコン」 : 「$media:icon1」 、 "説明" : "$string:MainAbility_desc" , "formsEnabled" : false 、 "ラベル" : "$string:MainAbility_label" , 「タイプ」 : 「ページ」 、 「起動タイプ」 : 「標準」 } ] スタートページスタート ページはシステムを読み込むために使用され、ユーザーはこのページをクリックしてメイン ページにジャンプできます。 Hml ソースコード: < div id = "ラッパー" > < div id = "div1" onclick = "divclick" > < テキストid = "text1" > {{title}} </ テキスト> < 画像id = "image1" src = "common/images/background.png" > </ 画像> </div> </div> CSS ソースコード: #ラッパー{ flex-direction : 列; 幅: 100% ; } #div1 { 幅: 100% ; 高さ: 100% ; 位置: 相対的; ディスプレイ: フレックス; 可視性: 可視; 不透明度: 1 ; flex-direction : 列; align-items : flex-start ; } #テキスト 1 { 高さ: 600px ; 幅: 60px ; 位置: 相対的; 可視性: 可視; フォントサイズ: 60px ; テキスト配置: 中央; 左パディング: 0 ; 左マージン: 45% ; 上マージン: 200px ; 色: #7468BE ; 文字間隔: 10px ; } #画像1 { 幅: 100% ; 高さ: 300px ; 上: 80px ; パディング下部: 0 ; } js ソースコード: '@system.router' からルーターをインポートします。 エクスポートデフォルト{ データ: { タイトル:「星を守る子供たち」 }, divクリック(){ ルータ.push({ uri:'pages/sign_in/sign_in', //ジャンプ先のページを指定します }) } } ログインページアカウント名と MIMA をサーバーにアップロードすると、サーバーは MD5 暗号化とソルト アルゴリズムを使用して、アカウント名と MIMA が正しいかどうかを確認します。 Hml ソースコード: < div id = "ラッパー" > < div id = "div1" > < text id = "text1" >ログイン</ text > < input id = "input1" プレースホルダー= "{{title1}}" onchange = "accountChange" 値= "XXXXX" > </ input > < input id = "input2" type = "password" placeholder = "{{pass}}" onchange = "passwordChange" value = "XXXXX" > </ input > < テキストid = "text3" > {{メッセージ}} </ テキスト> < ボタンid = "button1" 値= "{{enter}}" onclick = "btnclick" > </ ボタン> </div> </div> CSS ソースコード: #ラッパー{ flex-direction : 列; 幅: 100% ; } #div1 { 幅: 100% ; 高さ: 100% ; flex-direction : 列; } #テキスト 1 { 高さ: 100px ; 幅: 150px ; フォントサイズ: 58px ; テキスト配置: 中央; フォントの太さ: 600 ; フォントスタイル: 通常; 上: 250px ; 位置: 絶対; 左マージン: 80px ; } #入力1 { 幅: 70.69827263766581% ; 高さ: 80px ; 背景色: #f5f5f5 ; フォントサイズ: 26px ; 位置: 絶対; 上: 400px ; 左マージン: 80px ; } #入力2 { 幅: 70.69827263766581% ; 高さ: 80px ; 背景色: #f5f5f5 ; フォントサイズ: 26px ; 位置: 絶対; 上: 500px ; 左マージン: 80px ; } #テキスト3 { 高さ: 45.43705332600329px ; 幅: 100% ; フォントサイズ: 28px ; 色: #C8C8C8 ; フォントの太さ: 太字; フォントサイズステップ: 0 ; 位置: 絶対; 上: 620px ; 左マージン: 15% ; } #ボタン1 { 幅: 50% ; 高さ: 80px ; 境界線の半径: 50px ; フォントサイズ: 38px ; フォントの太さ: 通常; 背景色: #7468BE ; 左マージン: 150px ; 上: 700px ; ディスプレイ: フレックス; 位置: 絶対; } js ソースコード: '@system.prompt' からprompt をインポートします。 '@system.fetch' からfetch をインポートします。 '@system.router' からルーターをインポートします。 エクスポートデフォルト{ データ: { title1 : 「ユーザー名を入力してください」 pass : 「MIMAを入力してください」 、 メッセージ: 「未登録の携帯電話番号は確認後に自動的に作成されます」 入力: 「ログイン」 、 アカウント: 「XXXX」 、 パスワード: 「XXXX」 、 結果: "" }, アカウント変更( e ) { この. アカウント= e . 値 }, パスワード変更( e ) { this . パスワード= e . 値 }, ボタンクリック(){ ルータ. プッシュ({ uri : 'pages/page/page' , }) コンソール.info ( この. アカウント) console.info ( JSON.stringify ({ "username" : this.Account , "password" : this.Password } ) ) ; フェッチ. フェッチ({ url : `https://XXXXXX:80/login?username=` + this . アカウント+ `&password=` + this . パスワード、 メソッド: 'POST' 、 レスポンスタイプ: "json" 、 成功: ( 応答) => { console . info ( "取得成功" ); console.info ( JSON.stringify ( レスポンス. データ) ) ; this.result = JSON.parse ( response.data ) ; console.info ( JSON.stringify ( this.result.data ) ) ; if ( this . result . data == "True" ) { console . info ( "ログイン成功" ); ルータ. プッシュ({ uri : 'pages/index2/index2' , }); } それ以外{ console . info ( "ログインに失敗しました" ); prompt.showToast ( { メッセージ: 「MIMAエラー」 、 期間: 3000 、 }); } } }); } } メインページ現在は音声認識機能のみが開発されており、ユーザーは音声認識ボタンをクリックすることでこの機能モジュールに入ることができます。 Hml ソースコード: < 要素名= 'comp' src = '../../components/tabbar/tabbar.hml' > </ 要素> < div id = "ラッパー" > < 画像id = "image1" src = "common/images/21.png" > </ 画像> < 入力ID = "input1" プレースホルダー= "{{title}}" > </ 入力> < 画像id = "image2" src = "common/images/22.png" > </ 画像> < スワイパークラス= "コンテナ" インデックス= "{{index}}" 自動再生= "true" > < div クラス= "スワイパーアイテムプライマリアイテム" > < 画像src = "common/images/23.png" > </ 画像> </div> < div クラス= "スワイパー項目警告項目" > < 画像src = "common/images/sw4.png" > </ 画像> </div> < div クラス= "スワイパーアイテム成功アイテム" > < 画像src = "common/images/sw3.png" > </ 画像> </div> </ スワイパー> < text id = "text1" >機能選択</ text > < div id = "div1" onclick = "divclick" > < 画像id = "image5" src = "common/images/26.png" > </ 画像> < text id = "text2" >音声認識</ text > < text id = "text3" >クリックして音声認識に入ります</ text > < 画像id = "image30" src = "common/images/h4.png" > </ 画像> </div> < 画像id = "image7" src = "common/images/h2.png" > </ 画像> < div id = "div2" > < 画像id = "image8" src = "common/images/27_h.png" > </ 画像> < text id = "text4" >眼球運動認識</ text > < text id = "text5" >この機能は現在開発中です</ text > < 画像id = "image32" src = "common/images/h5.png" > </ 画像> </div> < 画像id = "image10" src = "common/images/h2.png" > </ 画像> < div id = "div3" > < 画像id = "image11" src = "common/images/28_h.png" > </ 画像> < text id = "text6" >物理的動作検出</ text > < text id = "text7" >この機能は開発中です</ text > < 画像id = "image31" src = "common/images/h6.png" > </ 画像> </div> < 画像id = "image13" src = "common/images/h2.png" > </ 画像> < コンポーネントインデックス= "0" > </ コンポーネント> </div> CSS ソースコード: #ラッパー{ flex-direction : 列; 幅: 100% ; 高さ: 100% ; 位置: 絶対; } #画像1 { 幅: 40px ; 高さ: 40px ; 左マージン: 10px ; 上マージン: 10px ; パディング: 5px ; } #入力1 { 幅: 66.65016628828752% ; 高さ: 36.51376146788991px ; 上マージン: -35px ; 左マージン: 60px ; } #画像2 { 幅: 40px ; 高さ: 35px ; 上マージン: -35px ; オブジェクトフィット: 塗りつぶし; 左マージン: 305px ; パディング: -3px ; } #画像3 { 幅: 360ピクセル; 高さ: 180.91743119266056px ; 上マージン: 10px ; } #テキスト 1 { 高さ: 30px ; 幅: 100px ; フォントサイズ: 22px ; 上マージン: 14px ; 左マージン: 15px ; フォントの太さ: 600 ; } #div1 { 幅: 100% ; 高さ: 100px ; 上マージン: 8px ; } #画像5 { 幅: 35.59633027522935px ; 高さ: 38.89908256880733px ; 上マージン: 40px ; 左マージン: 30px ; オブジェクトフィット: 塗りつぶし; } #テキスト2 { 高さ: 30px ; 幅: 100px ; フォントサイズ: 20px ; 上マージン: 25px ; 左マージン: 20px ; 色: #7468BE ; フォントの太さ: 太字; } #テキスト3 { 高さ: 30px ; 幅: 128.07339449541286px ; フォントサイズ: 15px ; 上マージン: 60px ; 左マージン: -100px ; 色: #999999 ; } #画像30 { 幅: 100px ; 高さ: 100px ; オブジェクトフィット: 塗りつぶし; 左マージン: 19px ; 上マージン: 6px ; パディング: 1px ; 境界線の半径: 50px ; } #画像7 { 幅: 360ピクセル; 高さ: 30px ; オブジェクトフィット: 塗りつぶし; } #div2 { 幅: 100% ; 高さ: 100px ; } #画像8 { 幅: 60.36697247706422px ; 高さ: 63.669724770642205px ; 上マージン: 20px ; オブジェクトフィット: 塗りつぶし; 左マージン: 19px ; パディング: 8px ; } #テキスト4 { 高さ: 30px ; 幅: 100px ; フォントサイズ: 20px ; 色: #7468BE ; フォントの太さ: 太字; 上マージン: 25px ; 左マージン: 4px ; } #テキスト5 { 高さ: 30px ; 幅: 100px ; フォントサイズ: 15px ; 色: #999999 ; 上マージン: 60px ; 左マージン: -100px ; } #画像31 { 幅: 100px ; 高さ: 100px ; 上マージン: 6px ; 左マージン: 48px ; オブジェクトフィット: 塗りつぶし; 境界線の半径: 50px ; } #画像10 { 幅: 360ピクセル; 高さ: 30px ; オブジェクトフィット: 塗りつぶし; } #div3 { 幅: 100% ; 高さ: 100px ; } #画像11 { 幅: 62.01834862385321px ; 高さ: 57.06422018348623px ; オブジェクトフィット: 塗りつぶし; 左マージン: 19px ; パディング: 6px ; 上マージン: 16px ; } #テキスト6 { 高さ: 30px ; 幅: 123.11926605504587px ; フォントサイズ: 20px ; 色: #7468BE ; フォントの太さ: 太字; 上マージン: 16px ; } #テキスト7 { 高さ: 30px ; 幅: 100px ; フォントサイズ: 15px ; 色: #999999 ; 左マージン: -125px ; 上マージン: 50px ; } #画像32 { 幅: 100px ; 高さ: 100px ; オブジェクトフィット: 塗りつぶし; 左マージン: 53px ; 上マージン: 0 ; 境界線の半径: 50px ; } #画像13 { 幅: 360ピクセル; 高さ: 30px ; オブジェクトフィット: 塗りつぶし; } .コンテナ1 { flex-direction : 列; コンテンツの中央揃え ; アイテムの位置合わせ: 中央; } 。容器{ 左: 0px ; 上: 0px ; 幅: 454px ; 高さ: 200px ; パディングトップ: 3% ; } .スワイパーアイテム{ 幅: 454px ; 高さ: 200px ; コンテンツの中央揃え ; アイテムの位置合わせ: 中央; } 患者ページを選択対応する患者を選択して、患者の情報インターフェイスに入ります。 ソースコードが多すぎて記事が長くなりすぎるため、以降のページにはソースコードは載せません。 患者ステータスページサーバーから最新の予測確率を取得し、Canva を使用して曲線チャートを描画します。 デバイス接続ページBluetoothを使用してデバイスを接続し、マイクを呼び出して録音します。 記録ページ10 ~ 15 秒の音声を録音し、ボタンをクリックして音声をサーバーにアップロードし、分析します。 結果分析ページ使用されるサーバーが比較的非効率であるため、分析には長い時間がかかります。 分析結果ページサーバーから予測確率を取得後、結果分析ページに表示されます。 Flask バックエンドコードバックエンド コードは長いので、ログイン インターフェイスのソース コードのみを次に示します。 json をインポート pymysql をインポートする インポートOS Flask からFlask をインポートし、 リクエストを Blueprint に格納します。 インポートシステム acoustic_featureをaf としてインポートする 輸入トーチ base64 をインポート
@ app .route ( '/login' 、 methods = [ 'POST' 、 'GET' ] ) デフ検証(): 戻り値= { '戻りコード' : '200' , 'return_msg' : '成功' 、 'データ' : { なし} } print ( リクエスト. 値) name = request.values.get ( 'ユーザー名' ) pwd = リクエスト. 値.get ( 'パスワード' ) 試す: db_password = select ( "アカウント = '%s' のユーザーからパスワードを選択" % name ) except 例外をe として: return_dict [ '戻りコード' ] = '500' return_dict [ 'data' ] = 'データベースエラー' json . dumps ( return_dict ) を返します input_password_md5_code = md5_verify ( パスワード, 'XXXX' ) 印刷( 入力パスワード md5 コード) 印刷( db_password ) input_password_md5_code == db_password の場合: return_dict [ 'データ' ] = 'True' それ以外: return_dict [ 'データ' ] = 'False' 印刷( return_dict ) json . dumps を返します( return_dict 、 ensure_ascii = False ) def md5_verify ( パスワード、 ソルト): ハッシュライブラリをインポートする md5 = ハッシュライブラリ.md5 ( ) md5 . update ( パスワード. encode ( 'utf-8' )) md5 . update ( salt . encode ( 'utf-8' )) md5.hexdigest ( ) を返す 操作効果デモビデオ 記事の添付ファイルをダウンロードするには、以下のリンクをクリックしてください。 https://ost..com/resource/2138. https://ost..com/resource/2142. オープンソースの詳細については、以下をご覧ください。 51CTO オープンソース基本ソフトウェアコミュニティ https://ost..com. |