การรู้จำเสียงโดยใช้แอปพลิเคชันเดสก์ท็อป .NET การรู้จำเสียงพูดที่รวดเร็วเป็นพิเศษโดยไม่ต้องใช้เซิร์ฟเวอร์โดยใช้ตัวอย่างการรู้จำเสียงออฟไลน์จริงใน Android 6.0

) โดยใช้ตัวอย่างการควบคุมเครื่องใช้ไฟฟ้าภายในบ้านของ Hello World อย่างแท้จริง
ทำไมต้องเป็นเครื่องใช้ไฟฟ้าภายในบ้าน? ใช่ เพราะด้วยตัวอย่างดังกล่าว คุณจึงสามารถชื่นชมสิ่งนั้นได้ ความเร็วและความแม่นยำซึ่งสามารถทำได้โดยการใช้ ท้องถิ่นโดยสมบูรณ์การรู้จำเสียงโดยไม่ต้องมีเซิร์ฟเวอร์เช่น Google ASRหรือ Yandex SpeechKit.
ฉันยังแนบซอร์สโค้ดทั้งหมดของโปรแกรมและชุดประกอบสำหรับ Android เข้ากับบทความด้วย

ทำไมจู่ๆ?

เมื่อเร็วๆ นี้ฉันพบสิ่งนี้ ฉันถามผู้เขียนว่าทำไมเขาถึงต้องการใช้การรู้จำเสียงบนเซิร์ฟเวอร์สำหรับโปรแกรมของเขา (ในความคิดของฉัน สิ่งนี้ไม่จำเป็นและนำไปสู่ปัญหาบางอย่าง) ด้วยเหตุนี้ ฉันขออธิบายรายละเอียดเพิ่มเติมเกี่ยวกับการใช้วิธีการทางเลือกสำหรับโครงการที่ไม่จำเป็นต้องจดจำสิ่งใดเลย และพจนานุกรมประกอบด้วยชุดคำที่มีขอบเขตจำกัด และถึงแม้จะมีตัวอย่างการใช้งานจริง...

เหตุใดเราจึงต้องการสิ่งอื่นนอกเหนือจาก Yandex และ Google

สำหรับ "การใช้งานจริง" นั้น ฉันเลือกหัวข้อนี้ การควบคุมด้วยเสียงสำหรับบ้านอัจฉริยะ.
ทำไมตัวอย่างนี้ถึงชัดเจน? เพราะมันแสดงให้เห็นข้อดีหลายประการของการรู้จำเสียงท้องถิ่นโดยสมบูรณ์มากกว่าการรู้จำโดยใช้โซลูชันคลาวด์ กล่าวคือ:
  • ความเร็ว- เราไม่ขึ้นอยู่กับเซิร์ฟเวอร์ ดังนั้นจึงไม่ขึ้นอยู่กับความพร้อมใช้งาน แบนด์วิธ ฯลฯ ปัจจัย
  • ความแม่นยำ- เอ็นจิ้นของเราใช้งานได้กับพจนานุกรมที่สนใจแอปพลิเคชันของเราเท่านั้น ซึ่งจะเป็นการเพิ่มคุณภาพของการจดจำ
  • ราคา- เราไม่ต้องจ่ายเงินสำหรับแต่ละคำขอไปยังเซิร์ฟเวอร์
  • การเปิดใช้งานด้วยเสียง- เป็นโบนัสเพิ่มเติมสำหรับคะแนนแรก - เราสามารถ "ฟังการออกอากาศ" ได้ตลอดเวลาโดยไม่ต้องเปลืองปริมาณการรับส่งข้อมูลและไม่ต้องโหลดเซิร์ฟเวอร์

บันทึก

ขอจองด่วนครับว่าข้อดีเหล่านี้ถือเป็นข้อดี เฉพาะโครงการบางประเภทเท่านั้น,เราอยู่ไหน เรารู้ล่วงหน้าอย่างแน่นอนผู้ใช้จะใช้พจนานุกรมอะไรและไวยากรณ์อะไร นั่นคือเมื่อเราไม่จำเป็นต้องจดจำข้อความที่กำหนดเอง (เช่น ข้อความ SMS หรือคำค้นหา) มิฉะนั้น การจดจำระบบคลาวด์ก็เป็นสิ่งที่ขาดไม่ได้

ดังนั้น Android จึงสามารถจดจำคำพูดได้โดยไม่ต้องใช้อินเทอร์เน็ต!
ใช่ ใช่... เฉพาะบน JellyBean เท่านั้น และจากครึ่งเมตรเท่านั้นไม่มีอีกแล้ว และการจดจำนี้เป็นคำสั่งเดียวกันโดยใช้เฉพาะรุ่นที่เล็กกว่ามากเท่านั้น ดังนั้นเราจึงไม่สามารถจัดการหรือกำหนดค่าได้เช่นกัน และสิ่งที่เธอจะกลับมาหาเราในครั้งต่อไปไม่เป็นที่รู้จัก แม้ว่าจะเหมาะสำหรับ SMS!

พวกเราทำอะไร?

เราจะใช้รีโมทคอนโทรลด้วยเสียงสำหรับเครื่องใช้ไฟฟ้าภายในบ้าน ซึ่งจะทำงานได้อย่างแม่นยำและรวดเร็วในระยะไม่กี่เมตร หรือแม้แต่บนสมาร์ทโฟน แท็บเล็ต และนาฬิกา Android ราคาถูก เส็งเคร็ง และราคาไม่แพงมาก
ตรรกะจะเรียบง่ายแต่ใช้งานได้จริงมาก เราเปิดใช้งานไมโครโฟนและพูดชื่ออุปกรณ์อย่างน้อยหนึ่งชื่อ แอปพลิเคชันจะจดจำและเปิดและปิดขึ้นอยู่กับสถานะปัจจุบัน หรือเขาได้รับโชคลาภจากพวกเขาและออกเสียงด้วยเสียงผู้หญิงที่ไพเราะ เช่น อุณหภูมิปัจจุบันในห้อง

มีการใช้งานจริงมากมาย

ในตอนเช้าคุณตบฝ่ามือลงบนหน้าจอสมาร์ทโฟนบนโต๊ะข้างเตียงโดยไม่ได้ลืมตาและสั่งว่า “อรุณสวัสดิ์!” - บทเริ่มต้นขึ้น เครื่องชงกาแฟเปิดขึ้น และฮัมเพลง เพลงไพเราะ ม่านเปิด
มาแขวนสมาร์ทโฟนราคาถูก (2 พันไม่มีอีกแล้ว) ไว้บนผนังแต่ละห้องกันดีกว่า เรากลับบ้านหลังเลิกงานและสั่งการสู่ความว่างเปล่า “สมาร์ทโฮม! ไฟ ทีวี! - ฉันไม่คิดว่ามีความจำเป็นต้องพูดว่าจะเกิดอะไรขึ้นต่อไป

การถอดเสียง



ไวยากรณ์อธิบายว่าอะไร สิ่งที่ผู้ใช้สามารถพูดได้- เพื่อให้พ็อกเก็ตสฟิงซ์ได้รู้ว่า ยังไงเขาจะออกเสียงมันจำเป็นสำหรับแต่ละคำจากไวยากรณ์ในการเขียนว่ามันฟังดูอย่างไรในรูปแบบภาษาที่เกี่ยวข้อง นั่นคือ การถอดเสียงทุกคำ. มันถูกเรียกว่า พจนานุกรม.

การถอดเสียงอธิบายโดยใช้ไวยากรณ์พิเศษ ตัวอย่างเช่น:
ฉลาด uu mn ay j house d oo m

โดยหลักการแล้วไม่มีอะไรซับซ้อน สระคู่ในการถอดความบ่งบอกถึงความเครียด พยัญชนะคู่คือพยัญชนะเสียงอ่อนที่ตามด้วยเสียงสระ ชุดค่าผสมที่เป็นไปได้ทั้งหมดสำหรับเสียงทั้งหมดของภาษารัสเซีย

เป็นที่ชัดเจนว่าเราไม่สามารถอธิบายการถอดเสียงทั้งหมดในแอปพลิเคชันของเราล่วงหน้าได้ เนื่องจากเราไม่ทราบชื่อที่ผู้ใช้จะมอบให้กับอุปกรณ์ของพวกเขาล่วงหน้า ดังนั้นเราจะสร้างการถอดเสียงดังกล่าว "ทันที" ตามกฎบางประการของการออกเสียงภาษารัสเซีย เมื่อต้องการทำเช่นนี้ คุณสามารถใช้คลาส PhonMapper ต่อไปนี้ ซึ่งสามารถรับสตริงเป็นอินพุต และสร้างการถอดเสียงที่ถูกต้องได้

การเปิดใช้งานด้วยเสียง

นี่คือความสามารถของระบบรู้จำเสียงในการ "ฟังการออกอากาศ" ตลอดเวลาเพื่อตอบสนองต่อวลี (หรือวลีที่กำหนดไว้ล่วงหน้า) ในเวลาเดียวกัน เสียงและคำพูดอื่นๆ ทั้งหมดจะถูกยกเลิก นี่ไม่เหมือนกับการอธิบายไวยากรณ์และแค่เปิดไมโครโฟน ฉันจะไม่นำเสนอทฤษฎีของงานนี้และกลไกการทำงานของมันที่นี่ ฉันขอบอกว่าเมื่อเร็ว ๆ นี้โปรแกรมเมอร์ที่ทำงานเกี่ยวกับ Pocketsphinx ได้นำฟังก์ชันดังกล่าวไปใช้และตอนนี้ก็พร้อมใช้งานแล้วใน API

สิ่งหนึ่งที่ควรค่าแก่การกล่าวถึงอย่างแน่นอน สำหรับวลีเปิดใช้งาน คุณไม่เพียงแต่ต้องระบุการถอดเสียงเท่านั้น แต่ยังต้องเลือกวลีที่เหมาะสมด้วย ค่าเกณฑ์ความไว- ค่าที่น้อยเกินไปจะนำไปสู่การบวกลวงจำนวนมาก (นี่คือเมื่อคุณไม่ได้พูดวลีเปิดใช้งาน แต่ระบบจดจำได้) และสูงเกินไป - ภูมิคุ้มกัน ดังนั้นการตั้งค่านี้จึงมีความสำคัญเป็นพิเศษ ช่วงของค่าโดยประมาณ - ตั้งแต่ 1e-1 ถึง 1e-40 ขึ้นอยู่กับวลีเปิดใช้งาน.

การเปิดใช้งานเซ็นเซอร์ความใกล้ชิด

งานนี้เฉพาะสำหรับโครงการของเราและไม่เกี่ยวข้องโดยตรงกับการรับรู้ สามารถดูรหัสได้โดยตรงในกิจกรรมหลัก
เธอปฏิบัติ SensorEventListenerและในขณะที่เข้าใกล้ (ค่าเซ็นเซอร์น้อยกว่าค่าสูงสุด) ตัวจับเวลาจะเปิดขึ้นโดยตรวจสอบหลังจากเกิดความล่าช้าระยะหนึ่งว่าเซ็นเซอร์ยังคงถูกบล็อกอยู่หรือไม่ ทำเช่นนี้เพื่อกำจัดผลบวกลวง
เมื่อเซ็นเซอร์ไม่ถูกบล็อกอีกครั้ง เราจะหยุดการจดจำ และรับผลลัพธ์ (ดูคำอธิบายด้านล่าง)

มาเริ่มการจดจำกัน

Pocketsphinx มอบ API ที่สะดวกสบายสำหรับการกำหนดค่าและรันกระบวนการจดจำ เหล่านี้คือชั้นเรียน SpechRecognizerและ โปรแกรมรู้จำเสียงตั้งค่า.
นี่คือลักษณะการกำหนดค่าและการเปิดใช้งานการจดจำ:

PhonMapper phonMapper = PhonMapper ใหม่(getAssets().open("dict/ru/hotwords")); ไวยากรณ์ไวยากรณ์ = ไวยากรณ์ใหม่ (ชื่อ phonMapper); grammar.addWords(คำที่นิยม); DataFiles dataFiles = DataFiles ใหม่ (getPackageName(), "ru"); ไฟล์ hmmDir = ไฟล์ใหม่ (dataFiles.getHmm()); ไฟล์ dict = ไฟล์ใหม่ (dataFiles.getDict()); ไฟล์ jsgf = ไฟล์ใหม่ (dataFiles.getJsgf()); คัดลอกสินทรัพย์(hmmDir); saveFile(jsgf, grammar.getJsgf()); saveFile(dict, grammar.getDict()); mRecognizer = SpeechRecognizerSetup.defaultSetup() .setAcousticModel(hmmDir) .setDictionary(dict) .setBoolean("-remove_noise", false) .setKeywordThreshold(1e-7f) .getRecognizer(); mRecognizer.addKeyphraseSearch(KWS_SEARCH, คำที่นิยม); mRecognizer.addGrammarSearch(COMMAND_SEARCH, jsgf);

ขั้นแรกเราจะคัดลอกไฟล์ที่จำเป็นทั้งหมดลงดิสก์ (Pocketpshinx ต้องใช้โมเดลอะคูสติก ไวยากรณ์ และพจนานุกรมที่มีการถอดเสียงไว้บนดิสก์) จากนั้นจึงกำหนดค่าเอ็นจิ้นการจดจำเอง มีการระบุพาธไปยังไฟล์โมเดลและพจนานุกรม รวมถึงพารามิเตอร์บางตัว (เกณฑ์ความไวสำหรับวลีการเปิดใช้งาน) จากนั้นจะมีการกำหนดค่าเส้นทางไปยังไฟล์ที่มีไวยากรณ์รวมถึงวลีเปิดใช้งาน

ดังที่คุณเห็นจากโค้ดนี้ มีการกำหนดค่ากลไกหนึ่งสำหรับทั้งการจดจำไวยากรณ์และวลีเปิดใช้งาน เหตุใดจึงทำเช่นนี้? เพื่อให้เราสามารถสลับระหว่างสิ่งที่เราต้องรับรู้ในปัจจุบันได้อย่างรวดเร็ว นี่คือลักษณะที่การเริ่มต้นกระบวนการรู้จำวลีเปิดใช้งาน:

MRecognizer.startListening(KWS_SEARCH);
และนี่คือวิธีการจดจำคำพูดตามไวยากรณ์ที่กำหนด:

MRecognizer.startListening(COMMAND_SEARCH, 3000);
อาร์กิวเมนต์ที่สอง (ไม่บังคับ) คือจำนวนมิลลิวินาที หลังจากนั้นการจดจำจะสิ้นสุดโดยอัตโนมัติหากไม่มีใครพูดอะไร
อย่างที่คุณเห็น คุณสามารถใช้เครื่องมือเดียวเท่านั้นในการแก้ปัญหาทั้งสองอย่าง

วิธีรับผลการรับรู้

หากต้องการรับผลลัพธ์การจดจำ คุณต้องระบุตัวฟังเหตุการณ์ที่ใช้อินเทอร์เฟซด้วย การรับรู้ผู้ฟัง.
มีหลายวิธีที่ถูกเรียกโดย Pocketsphinx เมื่อเหตุการณ์ใดเหตุการณ์หนึ่งเกิดขึ้น:
  • บนจุดเริ่มต้นของคำพูด- เครื่องยนต์ได้ยินเสียงบางอย่าง อาจเป็นเสียงพูด (หรืออาจจะไม่)
  • onEndOfSpeech- เสียงสิ้นสุด
  • บนผลบางส่วน- มีผลการรับรู้ระดับกลาง สำหรับวลีเปิดใช้งาน หมายความว่าได้ผล การโต้แย้ง สมมติฐาน
  • บนผลลัพธ์- ผลสุดท้ายของการรับรู้ เมธอดนี้จะถูกเรียกหลังจากเมธอดถูกเรียก หยุดที่ โปรแกรมรู้จำเสียงพูด- การโต้แย้ง สมมติฐานมีข้อมูลการจดจำ (สตริงและคะแนน)

ด้วยการใช้เมธอด onPartialResult และ onResult ไม่ทางใดก็ทางหนึ่ง คุณสามารถเปลี่ยนตรรกะการจดจำและรับผลลัพธ์สุดท้ายได้ ต่อไปนี้เป็นวิธีดำเนินการในกรณีของการสมัครของเรา:

@แทนที่ โมฆะสาธารณะ onEndOfSpeech() ( Log.d(TAG, "onEndOfSpeech"); if (mRecognizer.getSearchName().equals(COMMAND_SEARCH)) ( mRecognizer.stop(); ) ) @แทนที่ โมฆะสาธารณะ onPartialResult(สมมุติฐานสมมุติฐาน) ( if (hypothesis == null) return; String text = hypothesis.getHypstr(); if (KWS_SEARCH.equals(mRecognizer.getSearchName())) ( startRecognition(); ) else ( Log.d(TAG, ข้อความ); ) ) @แทนที่โมฆะสาธารณะ onResult(สมมุติฐานสมมุติฐาน) ( mMicView.setBackgroundResource(R.drawable.Background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); String text = Hypothesis != null ? hypothesis.getHypstr() : null; Log.d(TAG , "onResult " + ข้อความ); if (COMMAND_SEARCH.equals(mRecognizer.getSearchName())) ( if (text != null) ( Toast.makeText(นี่, ข้อความ, Toast.LENGTH_SHORT).show(); กระบวนการ (ข้อความ ); ) mRecognizer.startListening(KWS_SEARCH); ) )

เมื่อเราได้รับเหตุการณ์ onEndOfSpeech และหากในเวลาเดียวกันเรารับรู้คำสั่งที่จะถูกดำเนินการ เราก็จำเป็นต้องหยุดการจดจำ หลังจากนั้น onResult จะถูกเรียกทันที
ใน onResult คุณต้องตรวจสอบสิ่งที่เพิ่งได้รับการยอมรับ หากนี่คือคำสั่ง คุณจะต้องเปิดใช้งานเพื่อดำเนินการและเปลี่ยนกลไกให้จดจำวลีการเปิดใช้งาน
ใน onPartialResult เราสนใจเพียงการจดจำวลีเปิดใช้งานเท่านั้น หากเราตรวจพบ เราจะเริ่มกระบวนการจดจำคำสั่งทันที นี่คือสิ่งที่ดูเหมือน:

โมฆะการซิงโครไนซ์ส่วนตัว startRecognition() ( if (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) return; mRecognizer.cancel(); new ToneGenerator(AudioManager.STREAM_MUSIC, ToneGenerator.MAX_VOLUME).startTone(ToneGenerator. TONE_CDMA_PIP, 200); โพสต์ (400, Runnable ใหม่ () ( @ แทนที่การรันโมฆะสาธารณะ () ( mMicView.setBackgroundResource (R.drawable.Background_big_mic_green); mRecognizer.startListening (COMMAND_SEARCH, 3000); Log.d (TAG, "ฟัง คำสั่ง"); โพสต์ (4000, mStopRecognitionCallback); ) )); )
ขั้นแรกเราจะเล่นสัญญาณเล็กๆ เพื่อแจ้งให้ผู้ใช้ทราบว่าเราได้ยินเขาและพร้อมรับคำสั่งของเขา ในระหว่างนี้ ควรปิดไมโครโฟน ดังนั้นเราจึงเริ่มการรับรู้หลังจากหมดเวลาสั้นๆ (นานกว่าระยะเวลาของสัญญาณเล็กน้อย เพื่อไม่ให้ได้ยินเสียงสะท้อน) นอกจากนี้ยังเริ่มเธรดที่จะบังคับให้หยุดการจดจำหากผู้ใช้พูดนานเกินไป ในกรณีนี้คือ 3 วินาที

วิธีเปลี่ยนสตริงที่รู้จักให้เป็นคำสั่ง

ทุกสิ่งที่นี่มีความเฉพาะเจาะจงกับแอปพลิเคชันเฉพาะ ในกรณีของตัวอย่างเปล่า เราเพียงแค่ดึงชื่ออุปกรณ์ออกจากบรรทัด ค้นหาอุปกรณ์ที่ต้องการ และเปลี่ยนสถานะโดยใช้คำขอ HTTP ไปยังตัวควบคุมบ้านอัจฉริยะ หรือรายงานสถานะปัจจุบันของอุปกรณ์ (เช่นในกรณีของ เทอร์โมสตัท) ตรรกะนี้สามารถเห็นได้ในคลาสคอนโทรลเลอร์

วิธีสังเคราะห์คำพูด

การสังเคราะห์เสียงเป็นการดำเนินการผกผันของการรู้จำ นี่เป็นวิธีอื่น - คุณต้องเปลี่ยนบรรทัดข้อความเป็นคำพูดเพื่อให้ผู้ใช้สามารถได้ยินได้
ในกรณีของเทอร์โมสตัท เราต้องทำให้อุปกรณ์ Android ของเราพูดอุณหภูมิปัจจุบัน การใช้ API ข้อความเป็นคำพูดมันค่อนข้างง่ายที่จะทำ (ขอบคุณ Google สำหรับ TTS ผู้หญิงที่ยอดเยี่ยมสำหรับภาษารัสเซีย):

โมฆะส่วนตัวพูด (ข้อความสตริง) ( ซิงโครไนซ์ (mSpeechQueue) ( ​​mRecognizer.stop(); mSpeechQueue.add (ข้อความ); HashMap params = HashMap ใหม่ (2); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UUID.randomUUID().toString()); params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC)); params.put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "จริง"); mTextToSpeech.speak (ข้อความ, TextToSpeech.QUEUE_ADD, พารามิเตอร์); -

ฉันอาจจะพูดอะไรซ้ำซาก แต่ ก่อนกระบวนการสังเคราะห์ จำเป็นต้องปิดการใช้งานการจดจำ- ในอุปกรณ์บางอย่าง (เช่น อุปกรณ์ Samsung ทั้งหมด) โดยทั่วไปจะไม่สามารถฟังไมโครโฟนและสังเคราะห์บางอย่างในเวลาเดียวกันได้
การสิ้นสุดการสังเคราะห์เสียงพูด (นั่นคือ การสิ้นสุดกระบวนการพูดข้อความด้วยเครื่องสังเคราะห์เสียง) สามารถติดตามได้ในตัวฟัง:

TextToSpeech.OnUtteranceCompletedListener สุดท้ายส่วนตัว mUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() ( @Override โมฆะสาธารณะ onUtteranceCompleted(String utteranceId) ( ซิงโครไนซ์ (mSpeechQueue) ( ​​mSpeechQueue.poll(); if (mSpeechQueue.isEmpty()) ( mRecognizer.startListening( KWS_ค้นหา) ; ) ) ) );

ในนั้น เราเพียงแค่ตรวจสอบว่ามีสิ่งอื่นใดในคิวการสังเคราะห์หรือไม่ และเปิดใช้งานการรู้จำวลีการเปิดใช้งานหากไม่มีสิ่งอื่นใด

และมันคือทั้งหมดเหรอ?

ใช่! อย่างที่คุณเห็นการจดจำคำพูดโดยตรงบนอุปกรณ์อย่างรวดเร็วและมีประสิทธิภาพนั้นไม่ใช่เรื่องยากเลยเนื่องจากมีโปรเจ็กต์ที่ยอดเยี่ยมเช่น Pocketsphinx มี API ที่สะดวกมากซึ่งสามารถใช้ในการแก้ปัญหาที่เกี่ยวข้องกับการรับรู้คำสั่งเสียง

ในตัวอย่างนี้ เราได้แนบการจดจำกับงานเฉพาะเจาะจงโดยสมบูรณ์ - การควบคุมด้วยเสียงของอุปกรณ์สมาร์ทโฮม- เนื่องจากการยอมรับในระดับท้องถิ่น เราจึงได้รับความเร็วที่สูงมากและลดข้อผิดพลาดให้เหลือน้อยที่สุด
เป็นที่ชัดเจนว่ารหัสเดียวกันนี้สามารถใช้กับงานอื่นๆ ที่เกี่ยวข้องกับเสียงได้ ไม่จำเป็นต้องเป็นบ้านอัจฉริยะ

  • การควบคุมด้วยเสียง
  • เครื่องยนต์เสียง
  • เพิ่มแท็ก

    ไม่มีโปรแกรมใดที่สามารถแทนที่การทำงานด้วยตนเองในการถอดเสียงคำพูดที่บันทึกไว้ได้อย่างสมบูรณ์ อย่างไรก็ตามมีวิธีแก้ไขปัญหาที่สามารถเพิ่มความเร็วและอำนวยความสะดวกในการแปลคำพูดเป็นข้อความได้อย่างมากนั่นคือทำให้การถอดเสียงง่ายขึ้น

    การถอดเสียงเป็นการบันทึกไฟล์เสียงหรือวิดีโอในรูปแบบข้อความ มีงานที่ต้องชำระเงินบนอินเทอร์เน็ตเมื่อนักแสดงได้รับเงินจำนวนหนึ่งสำหรับการถอดเสียงข้อความ

    การแปลคำพูดเป็นข้อความมีประโยชน์

    • นักเรียนสามารถแปลการบรรยายเสียงหรือวิดีโอที่บันทึกไว้เป็นข้อความ
    • บล็อกเกอร์ที่ทำงานเว็บไซต์และบล็อก
    • นักเขียน นักข่าวสำหรับเขียนหนังสือและตำรา
    • นักธุรกิจข้อมูลที่ต้องการข้อความหลังจากการสัมมนาทางเว็บ สุนทรพจน์ ฯลฯ
    • ผู้ที่มีปัญหาในการพิมพ์ - พวกเขาสามารถเขียนจดหมายและส่งให้ครอบครัวหรือเพื่อนได้
    • ตัวเลือกอื่น.

    เราจะอธิบายเครื่องมือที่มีประสิทธิภาพสูงสุดบนพีซี แอปพลิเคชันมือถือ และบริการออนไลน์

    1 เว็บไซต์ Speechpad.ru

    นี่คือบริการออนไลน์ที่ให้คุณแปลคำพูดเป็นข้อความโดยใช้เบราว์เซอร์ Google Chrome บริการนี้ใช้งานได้กับไมโครโฟนและไฟล์สำเร็จรูป แน่นอนว่าคุณภาพจะสูงขึ้นมากหากคุณใช้ไมโครโฟนภายนอกและควบคุมตัวเอง อย่างไรก็ตาม บริการนี้ทำงานได้ดีแม้กระทั่งกับวิดีโอ YouTube ก็ตาม

    คลิก "เปิดใช้งานการบันทึก" ตอบคำถามเกี่ยวกับ "การใช้ไมโครโฟน" - โดยคลิก "อนุญาต"

    คำแนะนำแบบยาวเกี่ยวกับการใช้บริการสามารถยุบได้โดยคลิกที่ปุ่ม 1 ในรูป 3. คุณสามารถกำจัดโฆษณาได้โดยการลงทะเบียนง่ายๆ

    ข้าว. 3. บริการแผ่นเสียง

    ผลลัพธ์ที่ได้คือง่ายต่อการแก้ไข ในการดำเนินการนี้ คุณจะต้องแก้ไขคำที่ไฮไลต์ด้วยตนเองหรือเขียนตามคำบอกอีกครั้ง ผลลัพธ์ของงานจะถูกบันทึกไว้ในบัญชีส่วนตัวของคุณ และสามารถดาวน์โหลดลงในคอมพิวเตอร์ของคุณได้

    รายการบทเรียนวิดีโอเกี่ยวกับการทำงานกับแป้นคำพูด:

    คุณสามารถถอดเสียงวิดีโอจาก Youtube หรือจากคอมพิวเตอร์ของคุณได้ อย่างไรก็ตาม คุณจะต้องมีมิกเซอร์ รายละเอียดเพิ่มเติม:

    วิดีโอ "การถอดเสียง"

    บริการนี้ดำเนินการในเจ็ดภาษา มีลบเล็กน้อย อยู่ในความจริงที่ว่าหากคุณต้องการถอดเสียงไฟล์เสียงที่เสร็จแล้วเสียงนั้นจะได้ยินผ่านลำโพงซึ่งทำให้เกิดการรบกวนเพิ่มเติมในรูปแบบของเสียงสะท้อน

    2 บริการเขียนตามคำบอก.io

    บริการออนไลน์ที่ยอดเยี่ยมที่ช่วยให้คุณแปลคำพูดเป็นข้อความได้ฟรีและง่ายดาย

    ข้าว. 4. บริการเขียนตามคำบอก.io

    1 ในรูป 4 – สามารถเลือกภาษารัสเซียได้ที่ท้ายหน้า ในเบราว์เซอร์ Google Chrome จะมีการเลือกภาษา แต่ด้วยเหตุผลบางอย่างใน Mozilla จึงไม่มีตัวเลือกดังกล่าว

    เป็นที่น่าสังเกตว่ามีการใช้ความสามารถในการบันทึกผลลัพธ์ที่เสร็จสิ้นโดยอัตโนมัติแล้ว วิธีนี้จะป้องกันการลบโดยไม่ตั้งใจอันเป็นผลมาจากการปิดแท็บหรือเบราว์เซอร์ บริการนี้ไม่รู้จักไฟล์ที่เสร็จสมบูรณ์ ทำงานร่วมกับไมโครโฟน คุณต้องตั้งชื่อเครื่องหมายวรรคตอนเมื่อเขียนตามคำบอก

    ข้อความได้รับการยอมรับค่อนข้างถูกต้องไม่มีการสะกดผิด คุณสามารถแทรกเครื่องหมายวรรคตอนได้ด้วยตนเองจากแป้นพิมพ์ ผลลัพธ์ที่เสร็จสิ้นแล้วสามารถบันทึกลงในคอมพิวเตอร์ของคุณได้

    3 เรียลสปีกเกอร์

    โปรแกรมนี้ช่วยให้คุณแปลคำพูดของมนุษย์เป็นข้อความได้อย่างง่ายดาย ได้รับการออกแบบมาเพื่อทำงานบนระบบต่างๆ: Windows, Android, Linux, Mac ด้วยความช่วยเหลือนี้ คุณสามารถแปลงคำพูดที่ได้ยินเป็นไมโครโฟนได้ (เช่น สามารถติดไว้ในแล็ปท็อปได้) รวมทั้งบันทึกเป็นไฟล์เสียงด้วย

    สามารถเข้าใจภาษาโลกได้ 13 ภาษา มีโปรแกรมรุ่นเบต้าที่ทำงานเป็นบริการออนไลน์:

    คุณต้องไปที่ลิงก์ด้านบน เลือกภาษารัสเซีย อัปโหลดไฟล์เสียงหรือวิดีโอของคุณไปยังบริการออนไลน์ และชำระค่าถอดเสียง หลังจากการถอดเสียง คุณสามารถคัดลอกข้อความผลลัพธ์ได้ ยิ่งไฟล์สำหรับการถอดเสียงมีขนาดใหญ่เท่าใด ก็จะยิ่งต้องใช้เวลาในการประมวลผลมากขึ้นเท่านั้น รายละเอียดเพิ่มเติม:

    ในปี 2560 มีตัวเลือกการถอดเสียงฟรีโดยใช้ RealSpeaker แต่ในปี 2561 ไม่มีตัวเลือกดังกล่าว เป็นเรื่องที่น่าสับสนมากที่ผู้ใช้ทุกคนสามารถดาวน์โหลดไฟล์ที่ถอดเสียงได้ บางทีนี่อาจจะได้รับการปรับปรุงให้ดีขึ้น

    รายชื่อติดต่อของผู้พัฒนา (VKontakte, Facebook, Youtube, Twitter, อีเมล, โทรศัพท์) ของโปรแกรมสามารถพบได้ในหน้าเว็บไซต์ของเขา (แม่นยำยิ่งขึ้นในส่วนท้ายของเว็บไซต์):

    4 เครื่องบันทึกคำพูด

    ทางเลือกอื่นนอกเหนือจากแอปพลิเคชันก่อนหน้าสำหรับอุปกรณ์มือถือที่ทำงานบน Android มีให้บริการฟรีใน App Store:

    ข้อความจะถูกแก้ไขโดยอัตโนมัติและเพิ่มเครื่องหมายวรรคตอน สะดวกมากสำหรับการจดบันทึกให้ตัวเองหรือทำรายการ เป็นผลให้ข้อความมีคุณภาพดีมาก

    5 การเขียนตามคำบอกมังกร

    นี่คือแอปพลิเคชันที่แจกฟรีสำหรับอุปกรณ์มือถือจาก Apple

    โปรแกรมสามารถทำงานได้ถึง 15 ภาษา ช่วยให้คุณสามารถแก้ไขผลลัพธ์และเลือกคำที่ต้องการจากรายการได้ คุณต้องออกเสียงเสียงทั้งหมดให้ชัดเจน ไม่มีการหยุดชั่วคราวโดยไม่จำเป็น และหลีกเลี่ยงน้ำเสียง บางครั้งคำลงท้ายก็มีผิดพลาด

    เจ้าของใช้แอปพลิเคชัน Dragon Dictation เพื่อกำหนดรายการช้อปปิ้งในร้านค้าขณะเคลื่อนที่ไปรอบ ๆ อพาร์ตเมนต์ เมื่อฉันไปถึงที่นั่น ฉันสามารถดูข้อความในบันทึกได้ และฉันก็ไม่จำเป็นต้องฟัง

    ไม่ว่าคุณจะใช้โปรแกรมอะไรในการฝึก ให้เตรียมตรวจสอบผลลัพธ์อีกครั้งและทำการปรับเปลี่ยนบางอย่าง นี่เป็นวิธีเดียวที่จะได้รับข้อความที่สมบูรณ์แบบโดยไม่มีข้อผิดพลาด

    บริการที่เป็นประโยชน์ด้วย:

    รับบทความเกี่ยวกับความรู้คอมพิวเตอร์ล่าสุดส่งตรงถึงกล่องจดหมายของคุณ.
    มากขึ้นแล้ว สมาชิก 3,000 ราย

    .

    ผลิตภัณฑ์และเทคโนโลยี:

    Visual Studio, C#, .NET ไลบรารีคำพูด

    บทความกล่าวถึง:

    • เพิ่มการรองรับการรู้จำเสียงให้กับแอปพลิเคชันคอนโซล
    • การประมวลผลคำพูดที่ได้รับการยอมรับ
    • การติดตั้งไลบรารีการรู้จำเสียง
    • การเปรียบเทียบ Microsoft.Speech และ System.Speech
    • การเพิ่มการสนับสนุนการรู้จำเสียงให้กับแอปพลิเคชัน Windows Forms

    ด้วยการถือกำเนิดของ Windows Phone Cortana ผู้ช่วยส่วนตัวที่สั่งงานด้วยเสียง (รวมถึงบริษัทผลไม้ที่ไม่สามารถพูดถึงอย่างไร้ประโยชน์ได้) แอพที่ใช้เสียงได้มีความโดดเด่นมากขึ้นในการพัฒนาซอฟต์แวร์ ในบทความนี้ ฉันจะแสดงวิธีเริ่มต้นใช้งานการรู้จำเสียงและการสังเคราะห์เสียงในแอปพลิเคชันคอนโซล Windows, แอปพลิเคชัน Windows Forms และ Windows Presentation Foundation (WPF)

    โปรดทราบว่าคุณยังสามารถเพิ่มความสามารถในการพูดให้กับแอป Windows Phone, เว็บแอป ASP.NET, แอป Windows Store, Windows RT และ Xbox Kinect ได้ แต่เทคนิคต่างจากที่กล่าวถึงในบทความนี้

    วิธีที่ดีในการทำความเข้าใจว่าบทความนี้จะพูดถึงอะไรกันแน่คือการดูภาพหน้าจอของโปรแกรมสาธิตสองโปรแกรมที่แตกต่างกัน ข้าว. 1และ 2 - หลังจากเปิดแอปพลิเคชันคอนโซลแล้ว ข้าว. 1พูดประโยคทันทีว่า "ฉันตื่นแล้ว" แน่นอนว่าคุณจะไม่ได้ยินแอปพลิเคชันสาธิตในขณะที่อ่านบทความนี้ ดังนั้นจึงแสดงข้อความที่คอมพิวเตอร์กำลังพูด จากนั้นผู้ใช้ก็พูดคำสั่ง "Speech on" แอปพลิเคชันสาธิตตอบสนองด้วยข้อความที่รู้จัก จากนั้นรับฟังภายในและตอบสนองต่อคำขอให้บวกตัวเลขสองตัว

    ข้าว. 1. การรู้จำและการสังเคราะห์เสียงในแอปพลิเคชันคอนโซล


    ข้าว. 2. การรู้จำเสียงในแอปพลิเคชัน Windows Forms

    ผู้ใช้ขอให้แอปเพิ่มหนึ่งและสอง จากนั้นจึงเพิ่มสองและสาม แอปพลิเคชันจดจำคำสั่งเสียงพูดและให้คำตอบด้วยเสียง ฉันจะอธิบายวิธีที่เป็นประโยชน์เพิ่มเติมในการใช้การรู้จำเสียงในภายหลัง

    จากนั้นผู้ใช้พูดว่า “Speech off” ซึ่งเป็นคำสั่งเสียงที่ปิดใช้งานการฟังคำสั่งเพิ่มเติม แต่ไม่ได้ปิดใช้งานการรู้จำเสียงอย่างสมบูรณ์ หลังจากคำสั่งด้วยวาจานี้ คำสั่งถัดไปที่เพิ่มหนึ่งและสองจะถูกละเว้น ในที่สุด ผู้ใช้เปิดคำสั่งในการฟังอีกครั้งและพูดคำสั่งที่ไม่มีความหมายว่า “Klatu barada nikto” ซึ่งแอปพลิเคชันรับรู้ว่าเป็นคำสั่งให้ปิดการใช้งานการรู้จำคำพูดโดยสมบูรณ์และยุติการทำงานของตัวเอง

    บน ข้าว. 2แสดงแอปพลิเคชัน Windows Forms ที่เปิดใช้งานคำพูดจำลอง แอปพลิเคชั่นนี้จดจำคำสั่งเสียงพูด แต่ไม่ตอบสนองต่อคำสั่งเหล่านั้นด้วยเอาต์พุตเสียง เมื่อคุณเปิดแอพครั้งแรก กล่องกาเครื่องหมายเปิดคำพูดไม่ได้ถูกเลือก แสดงว่าการรู้จำเสียงไม่ได้ทำงานอยู่ ผู้ใช้ทำเครื่องหมายในช่องนี้แล้วพูดว่า "สวัสดี" แอปพลิเคชันตอบสนองด้วยการแสดงข้อความที่รู้จักในตัวควบคุมกล่องรายการที่ด้านล่างของหน้าต่าง

    ผู้ใช้กล่าวว่า “ตั้งค่ากล่องข้อความ 1 เป็นสีแดง” แอปพลิเคชันจดจำคำพูดและตอบกลับว่า “ตั้งค่ากล่องข้อความ 1 สีแดง” ซึ่งเกือบจะ (แต่ไม่ทั้งหมด) ตรงกับสิ่งที่ผู้ใช้พูด แม้ว่าจะเปิดอยู่ก็ตาม ข้าว. 2คุณไม่สามารถมองเห็นได้ ข้อความในตัวควบคุมกล่องข้อความที่ด้านบนของหน้าต่างเป็นสีแดงจริงๆ

    จากนั้นผู้ใช้กล่าวว่า: “โปรดตั้งค่ากล่องข้อความ 1 เป็นสีขาว” แอปรับรู้สิ่งนี้ว่า "ตั้งค่ากล่องข้อความ 1 สีขาว" และทำเช่นนั้น ผู้ใช้สรุปด้วยการพูดว่า "ลาก่อน" และแอปพลิเคชันแสดงข้อความนั้น แต่ไม่ได้ทำอะไรกับ Windows Forms แม้ว่าจะสามารถล้างช่องทำเครื่องหมาย Speech On ได้แล้วก็ตาม

    การใช้วัตถุซินธิไซเซอร์นั้นค่อนข้างง่าย

    ในส่วนต่อไปนี้ ฉันจะแนะนำคุณตลอดขั้นตอนการสร้างโปรแกรมสาธิตทั้งสองโปรแกรม รวมถึงการติดตั้งไลบรารีคำพูด .NET ที่จำเป็น บทความนี้อนุมานว่าคุณมีทักษะการเขียนโปรแกรมระดับกลางเป็นอย่างน้อย แต่ไม่รู้อะไรเลยเกี่ยวกับการรู้จำและการสังเคราะห์เสียงพูด

    การเพิ่มการสนับสนุนการรู้จำเสียงให้กับแอปพลิเคชันคอนโซล

    เพื่อสร้างการสาธิตที่แสดงใน ข้าว. 1ฉันเปิดตัว Visual Studio และสร้างแอปพลิเคชันคอนโซล C# ใหม่ชื่อ ConsoleSpeech ฉันใช้เครื่องมือคำพูดกับ Visual Studio 2010 และ 2012 เรียบร้อยแล้ว แต่เวอร์ชันล่าสุดก็น่าจะใช้ได้ หลังจากโหลดโค้ดเทมเพลตลงในตัวแก้ไข ฉันเปลี่ยนชื่อไฟล์ Program.cs ในหน้าต่าง Solution Explorer เป็น ConsoleSpeechProgram.cs ที่สื่อความหมายได้มากขึ้น และ Visual Studio เปลี่ยนชื่อคลาส Program ให้ฉัน

    ต่อไป ฉันเพิ่มลิงก์ไปยังไฟล์ Microsoft.Speech.dll ซึ่งอยู่ใน C:\ProgramFiles (x86)\Microsoft SDKs\Speech\v11.0\Assembly DLL นี้หายไปจากคอมพิวเตอร์ของฉัน และฉันต้องดาวน์โหลดมัน การติดตั้งไฟล์ที่จำเป็นเพื่อเพิ่มการรู้จำเสียงและการสังเคราะห์เสียงให้กับแอปพลิเคชันนั้นไม่ใช่เรื่องเล็กน้อย ฉันจะอธิบายขั้นตอนการติดตั้งโดยละเอียดในส่วนถัดไป แต่สำหรับตอนนี้ สมมติว่า Microsoft.Speech.dll อยู่ในระบบของคุณ

    ด้วยการเพิ่มการอ้างอิงไปยังคำพูด DLL ฉันได้ลบคำสั่งการใช้งานทั้งหมดออกจากด้านบนของโค้ด ยกเว้นคำสั่งที่ชี้ไปที่เนมสเปซของระบบระดับบนสุด จากนั้น ฉันเพิ่มการใช้คำสั่งสำหรับเนมสเปซ Microsoft.Speech.Recognition, Microsoft.Speech.Synthetic และ System.Globalization สองเนมสเปซแรกถูกแมปกับคำพูด DLL โปรดทราบว่ายังมีเนมสเปซ เช่น System.Speech.Recognition และ System.Speech.Synthetic ซึ่งอาจทำให้เกิดความสับสนได้ ฉันจะอธิบายความแตกต่างระหว่างพวกเขาในไม่ช้า เนมสเปซ Globalization พร้อมใช้งานตามค่าเริ่มต้น และไม่จำเป็นต้องเพิ่มการอ้างอิงใหม่ลงในโปรเจ็กต์

    ซอร์สโค้ดทั้งหมดสำหรับแอปพลิเคชันคอนโซลสาธิตมีให้ที่ ข้าว. 3และยังมีอยู่ในแพ็คเกจต้นฉบับที่มาพร้อมกับบทความนี้ด้วย ฉันได้ลบการจัดการข้อผิดพลาดมาตรฐานทั้งหมดออกเพื่อหลีกเลี่ยงการปิดบังแนวคิดหลักให้มากที่สุด

    ข้าว. 3. ซอร์สโค้ดแอปพลิเคชันคอนโซลสาธิต

    ใช้ระบบ; ใช้ Microsoft.Speech.Recognition; ใช้ Microsoft.Speech.Synthetic; โดยใช้ System.Globalization; Namespace ConsoleSpeech (คลาส ConsoleSpeechProgram ( static SpeechSynthesizer ss = new SpeechSynthesizer(); static SpeechRecognitionEngine sre; static bool เสร็จแล้ว = false; static bool SpeechOn = true; static void Main(string args) ( ลอง ( ss.SetOutputToDefaultAudioDevice(); Console.WriteLine ("\n(กำลังพูด: ฉันตื่นแล้ว)"); ss.Speak("ฉันตื่นแล้ว"); CultureInfo ci = new CultureInfo("en-us"); sre = new SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice( ; sre.Speechrecognized += sre_Speechrecognized; ตัวเลือก ch_startstopcommands = ตัวเลือกใหม่ (); ch_startstopcommands.add ("Speech on"); ch_startstopcommands.add ("S Peech Off "); ch_startStopcommands.add (" Klatu Barada Nikto "); Grammarbuilder GB_StartStop = ใหม่ GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); ไวยากรณ์ g_StartStop = ไวยากรณ์ใหม่(gb_StartStop); ตัวเลือก ch_Numbers = ตัวเลือกใหม่(); ch_Numbers.Add("1"); ch_Numbers.Add("2"); ch_Numbers เพิ่ม("3"); ch_Numbers.Add("4"); GrammarBuilder gb_WhatIsXplusY = ใหม่ GrammarBuilder(); gb_WhatIsXplusY.Append("คืออะไร"); gb_WhatIsXplusY.ผนวก(ch_Numbers); gb_WhatIsXplusY.ผนวก("บวก"); gb_WhatIsXplusY.ผนวก(ch_Numbers); ไวยากรณ์ g_WhatIsXplusY = ไวยากรณ์ใหม่ (gb_WhatIsXplusY); sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.หลายรายการ); ในขณะที่ (เสร็จสิ้น == false) ( ; ) Console.WriteLine("\nHit< enter >เพื่อปิดเชลล์\n"); Console.ReadLine(); ) catch (ข้อยกเว้น เช่น) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Main static void sre_SpeechRecognized(ผู้ส่งวัตถุ, SpeechRecognizedEventArgs e ) ( string txt = e.Result.Text; float Confidence; Console.WriteLine("\nRecognized: " + txt); if (ความมั่นใจ< 0.60) return; if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("Speech is now ON");คำพูดOn = true; ) if (txt.IndexOf("speech off") >= 0) ( Console.WriteLine("Speech is off"); SpeechOn = false; ) ถ้า (speechOn == false) กลับมา; if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) ( ((SpeechRecognitionEngine)ผู้ส่ง) RecognizeAsyncCancel(); done = true; Console.WriteLine("(พูด: ลาก่อน)"); ss.Speak("อำลา"); ) if (txt.IndexOf("What") >= 0 && txt.IndexOf("plus") >= 0) ( คำสตริง = txt.Split(" "); int num1 = int.Parse(คำ); int num2 = int.Parse(คำ); int sum = num1 + num2; Console.WriteLine("(การพูด: " + คำ + " บวก " + คำ + " เท่ากับ " + sum + ")"); ss.SpeakAsync (คำ + " บวก " + คำ + " เท่ากับ " + ผลรวม); ) ) // sre_SpeechRecognized ) // โปรแกรม ) // ns

    หลังจากใช้คำสั่ง โค้ดสาธิตจะเริ่มต้นดังนี้:

    Namespace ConsoleSpeech (คลาส ConsoleSpeechProgram ( static SpeechSynthesizer ss = new SpeechSynthesizer(); static SpeechRecognitionEngine sre; static bool เสร็จแล้ว = false; static bool SpeechOn = true; static void Main(string args) ( ...

    อ็อบเจ็กต์ SpeechSynthesizer ในระดับชั้นเรียน ช่วยให้แอปพลิเคชันสามารถสังเคราะห์คำพูดได้ ออบเจ็กต์ SpeechRecognitionEngine อนุญาตให้แอปพลิเคชันฟังและจดจำคำพูดหรือวลี ตัวแปรบูลีนที่ทำเสร็จแล้วจะกำหนดว่าเมื่อใดที่แอปพลิเคชันทั้งหมดสิ้นสุดลง ตัวแปร SpeechOn Boolean จะควบคุมว่าแอปพลิเคชันจะฟังคำสั่งใดๆ นอกเหนือจากคำสั่งเพื่อออกจากโปรแกรมหรือไม่

    แนวคิดก็คือแอปพลิเคชันคอนโซลไม่ยอมรับการป้อนข้อมูลด้วยแป้นพิมพ์ ดังนั้นจึงคอยฟังคำสั่งอยู่เสมอ อย่างไรก็ตาม หาก SpeechOn เป็นเท็จ ระบบจะรับรู้และดำเนินการเฉพาะคำสั่งให้ออกจากโปรแกรมเท่านั้น คำสั่งอื่นๆ จะถูกรับรู้แต่ถูกละเลย

    วิธีการหลักเริ่มต้นดังนี้:

    ลอง ( ss.SetOutputToDefaultAudioDevice(); Console.WriteLine("\n(พูด: ฉันตื่นแล้ว)"); ss.Speak("ฉันตื่นแล้ว");

    อินสแตนซ์ของวัตถุ SpeechSynthesizer ถูกสร้างขึ้นเมื่อมีการประกาศ การใช้วัตถุซินธิไซเซอร์นั้นค่อนข้างง่าย เมธอด SetOutputToDefaultAudioDevice ส่งสัญญาณเอาต์พุตไปยังลำโพงที่เชื่อมต่อกับคอมพิวเตอร์ของคุณ (คุณยังสามารถส่งสัญญาณเอาต์พุตไปยังไฟล์ได้ด้วย) วิธีการพูดใช้สตริงแล้วพูด นั่นเป็นวิธีที่ง่าย

    การรู้จำเสียงมีความซับซ้อนมากกว่าการสังเคราะห์เสียงพูดมาก วิธีการหลักดำเนินต่อไปโดยการสร้างวัตถุตัวแก้ไข:

    CultureInfo ci = ใหม่ CultureInfo("en-us"); sre = SpeechRecognitionEngine ใหม่ (ci); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized;

    ขั้นแรก ออบเจ็กต์ CultureInfo ระบุภาษาที่จะจดจำ ในกรณีนี้คือ United States English ออบเจ็กต์ CultureInfo อยู่ในเนมสเปซ Globalization ซึ่งเราอ้างอิงด้วยคำสั่ง การใช้ จากนั้น หลังจากเรียกตัวสร้าง SpeechRecognitionEngine แล้ว การป้อนข้อมูลด้วยเสียงจะถูกกำหนดให้กับอุปกรณ์เสียงเริ่มต้น ซึ่งส่วนใหญ่มักจะเป็นไมโครโฟน โปรดทราบว่าแล็ปท็อปส่วนใหญ่มีไมโครโฟนในตัว แต่เดสก์ท็อปจะต้องใช้ไมโครโฟนภายนอก (มักใช้ร่วมกับหูฟังในปัจจุบัน)

    วิธีการหลักสำหรับวัตถุตัวจดจำคือตัวจัดการเหตุการณ์ SpeechRecognized เมื่อใช้ Visual Studio หากคุณพิมพ์ "sre.SpeechRecognized +=" และรอสักครู่ IntelliSense จะสิ้นสุดนิพจน์ของคุณด้วยชื่อตัวจัดการเหตุการณ์ - sre_SpeechRecognized โดยอัตโนมัติ ฉันขอแนะนำให้คุณกดแป้น Tab เพื่อยอมรับข้อเสนอแนะและใช้ชื่อนี้เป็นค่าเริ่มต้น

    ตัวเลือก ch_Numbers = ตัวเลือกใหม่ (); ch_Numbers.Add("1"); ch_Numbers.Add("2"); ch_Numbers.Add("3"); ch_Numbers.Add("4"); // จากมุมมองทางเทคนิค // นี่คือ Add(สตริงใหม่ ( "4" )); GrammarBuilder gb_WhatIsXplusY = ใหม่ GrammarBuilder(); gb_WhatIsXplusY.Append("คืออะไร"); gb_WhatIsXplusY.ผนวก(ch_Numbers); gb_WhatIsXplusY.ผนวก("บวก"); gb_WhatIsXplusY.ผนวก(ch_Numbers); ไวยากรณ์ g_WhatIsXplusY = ไวยากรณ์ใหม่ (gb_WhatIsXplusY);

    ออบเจ็กต์หลักสามออบเจ็กต์ที่นี่คือชุดตัวเลือก เทมเพลต GrammarBuilder และตัวควบคุมไวยากรณ์ เมื่อฉันสร้างไวยากรณ์เพื่อการจดจำ ฉันจะเริ่มต้นด้วยการยกตัวอย่างสิ่งที่ฉันจำเป็นต้องจดจำ สมมุติว่า "หนึ่งบวกสองเป็นเท่าใด" และ “สามบวกสี่คืออะไร”

    จากนั้น ฉันจะกำหนดเทมเพลตทั่วไปที่เกี่ยวข้อง เช่น "คืออะไร บวก - เทมเพลตคือ GrammarBuilder และค่าเฉพาะที่ส่งไปยังเทมเพลตคือชุดของตัวเลือก ออบเจ็กต์ไวยากรณ์สรุปเทมเพลตและตัวเลือก

    ในโปรแกรมสาธิต ฉันจำกัดการเพิ่มไว้ที่ 1 ถึง 4 และเพิ่มเป็นสตริงในชุดตัวเลือก แนวทางที่มีประสิทธิภาพมากขึ้น:

    หมายเลขสตริง = สตริงใหม่ ("1", "2", "3", "4" ); ตัวเลือก ch_Numbers = ตัวเลือกใหม่ (ตัวเลข);

    ฉันกำลังนำเสนอแนวทางที่มีประสิทธิภาพน้อยกว่าในการสร้างชุดตัวเลือกด้วยเหตุผลสองประการ ประการแรก การเพิ่มทีละบรรทัดเป็นวิธีเดียวที่ฉันเคยเห็นในตัวอย่างการรู้จำเสียงอื่นๆ ประการที่สอง คุณอาจคิดว่าการเพิ่มทีละแถวไม่ควรทำงานเลย Visual Studio IntelliSense แสดงแบบเรียลไทม์ว่าหนึ่งในการเพิ่มโอเวอร์โหลดยอมรับพารามิเตอร์ของวลีสตริงประเภทพารามิเตอร์ หากคุณไม่ได้สังเกตเห็นคีย์เวิร์ด params คุณอาจสันนิษฐานว่าเมธอด Add ยอมรับเฉพาะอาร์เรย์ของสตริงเท่านั้น ไม่ใช่สตริงเดียว แต่กลับไม่เป็นเช่นนั้น เขายอมรับทั้งสองอย่าง ฉันแนะนำให้ผ่านอาร์เรย์

    การสร้างชุดตัวเลือกจากตัวเลขตามลำดับถือเป็นกรณีพิเศษและอนุญาตให้ใช้แนวทางทางโปรแกรม เช่น:

    หมายเลขสตริง = สตริงใหม่; สำหรับ (int i = 0; i< 100; ++i) numbers[i] = i.ToString(); Choices ch_Numbers = new Choices(numbers);

    หลังจากสร้างตัวเลือกเพื่อเติมช่อง GrammarBuilder แล้ว โปรแกรมสาธิตจะสร้าง GrammarBuilder จากนั้นจึงสร้างไวยากรณ์ควบคุม:

    GrammarBuilder gb_WhatIsXplusY = ใหม่ GrammarBuilder(); gb_WhatIsXplusY.Append("คืออะไร"); gb_WhatIsXplusY.ผนวก(ch_Numbers); gb_WhatIsXplusY.ผนวก("บวก"); gb_WhatIsXplusY.ผนวก(ch_Numbers); ไวยากรณ์ g_WhatIsXplusY = ไวยากรณ์ใหม่ (gb_WhatIsXplusY);

    โปรแกรมสาธิตใช้เทมเพลตที่คล้ายกันเพื่อสร้างไวยากรณ์สำหรับคำสั่งเริ่มและหยุด:

    ตัวเลือก ch_StartStopCommands = ตัวเลือกใหม่ (); ch_StartStopCommands.Add("คำพูดบน"); ch_StartStopCommands.Add("ปิดคำพูด"); ch_StartStopCommands.Add("กลุ่มเพื่อน"); GrammarBuilder gb_StartStop = ใหม่ GrammarBuilder(); gb_StartStop.ผนวก(ch_StartStopCommands); ไวยากรณ์ g_StartStop = ไวยากรณ์ใหม่ (gb_StartStop);

    ไวยากรณ์สามารถกำหนดได้อย่างยืดหยุ่นมาก คำสั่ง "speech on", "speech off" และ "klatu barada nikto" อยู่ในไวยากรณ์เดียว เนื่องจากมีความเกี่ยวข้องกันในเชิงตรรกะ คำสั่งทั้งสามนี้สามารถกำหนดได้ด้วยไวยากรณ์สามแบบที่แตกต่างกัน หรือคำสั่ง "speech on" และ "speech off" สามารถวางไว้ในไวยากรณ์เดียวและคำสั่ง "klatu barada nikto" ได้ในวินาทีเดียว

    เมื่อคุณสร้างออบเจ็กต์ไวยากรณ์ทั้งหมดแล้ว คุณใส่วัตถุเหล่านั้นลงในโปรแกรมรู้จำเสียงพูดและการรู้จำเสียงจะเปิดใช้งาน:

    sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.หลายรายการ);

    อาร์กิวเมนต์ RecognizeMode.Multiple จำเป็นเมื่อคุณมีไวยากรณ์มากกว่าหนึ่งรายการ ซึ่งจะเป็นเช่นนั้นในทุกโปรแกรม ยกเว้นโปรแกรมที่ง่ายที่สุด วิธีการหลักเสร็จสิ้นดังนี้:

    ในขณะที่ (เสร็จสิ้น == false) ( ; ) Console.WriteLine("\nHit< enter >เพื่อปิดเชลล์\n"); Console.ReadLine(); ) catch (ข้อยกเว้น เช่น) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Main

    การวนซ้ำ while ที่ดูแปลกตาทำให้คุณสามารถเก็บเชลล์ของแอปพลิเคชันคอนโซลไว้ได้ การวนซ้ำจะเสร็จสมบูรณ์เมื่อตัวแปรบูลีนระดับชั้นเรียนถูกตั้งค่าเป็นจริงโดยตัวจัดการเหตุการณ์การรู้จำเสียง

    การประมวลผลคำพูดที่ได้รับการยอมรับ

    รหัสสำหรับจัดการเหตุการณ์การรู้จำเสียงเริ่มต้นดังนี้:

    โมฆะคงที่ sre_SpeechRecognized (ผู้ส่งวัตถุ, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float Confidence = e.Result.Confidence; Console.WriteLine("\nRecognized: " + txt); if (ความมั่นใจ< 0.60) return; ...

    ข้อความที่รู้จักจะถูกเก็บไว้ในคุณสมบัติ Result.Text ของวัตถุ SpeechRecognizedEventArgs หรือคุณสามารถใช้ชุด Result.Words ได้ คุณสมบัติ Result.Confidence จะเก็บค่าระหว่าง 0.0 ถึง 1.0 ซึ่งเป็นค่าประมาณคร่าวๆ ว่าข้อความที่พูดตรงกับไวยากรณ์ใดๆ ที่เกี่ยวข้องกับตัวจดจำได้ดีเพียงใด โปรแกรมสาธิตจะสั่งให้ตัวจัดการเหตุการณ์ละเว้นข้อความโดยมีความมั่นใจต่ำในข้อความที่รู้จัก

    ค่าความเชื่อมั่นจะแตกต่างกันอย่างมากขึ้นอยู่กับความซับซ้อนของไวยากรณ์ คุณภาพไมโครโฟน และปัจจัยอื่นๆ ตัวอย่างเช่น หากโปรแกรมสาธิตต้องจดจำตัวเลข 1 ถึง 4 เท่านั้น ค่าความเชื่อมั่นในคอมพิวเตอร์ของฉันจะอยู่ที่ประมาณ 0.75 แต่ถ้าไวยากรณ์ต้องจดจำตัวเลขตั้งแต่ 1 ถึง 100 ค่าความเชื่อมั่นจะลดลงเหลือประมาณ 0.25 โดยสรุป โดยทั่วไปคุณควรทดสอบด้วยค่าความมั่นใจเพื่อให้ได้ผลลัพธ์การรู้จำเสียงที่ดี

    if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("Speech is now ON"); SpeechOn = true; ) if (txt.IndexOf("speech off") >= 0) ( คอนโซล .WriteLine("Speech is now OFF"); SpeechOn = false; ) ถ้า (speechOn == false) กลับมา;

    แม้ว่าในตอนแรกอาจไม่ชัดเจนนัก แต่ตรรกะนี้ก็น่าจะสมเหตุสมผลหากคุณลองคิดดู คำสั่ง Secret Exit จะถูกประมวลผล:

    if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) ( ((SpeechRecognitionEngine)sender).RecognizeAsyncCancel(); เสร็จสิ้น = true; Console.WriteLine("(พูด: ลาก่อน)"); ss.Speak("อำลา"); )

    โปรดทราบว่ากลไกการรู้จำเสียงพูดสามารถจดจำคำที่ไร้สาระได้จริง หากออบเจ็กต์ไวยากรณ์มีคำที่ไม่ได้อยู่ในพจนานุกรมในตัวของออบเจ็กต์ ไวยากรณ์จะพยายามระบุคำเหล่านั้นโดยใช้การวิเคราะห์พฤติกรรมเชิงความหมายหากเป็นไปได้ และมักจะค่อนข้างประสบความสำเร็จ นั่นเป็นเหตุผลที่ฉันใช้ "klatu" แทน "klaatu" ที่ถูกต้อง (จากภาพยนตร์ไซไฟเก่า)

    โปรดทราบว่าคุณไม่จำเป็นต้องประมวลผลข้อความทั้งหมดที่ไวยากรณ์รู้จัก (“klatu barada nikto”) คุณเพียงแค่ต้องมีข้อมูลเพียงพอที่จะระบุวลีทางไวยากรณ์ (“klatu” และ “barada”) โดยไม่ซ้ำกัน

    If (txt.IndexOf("What") >= 0 && txt.IndexOf("plus") >= 0) ( คำสตริง = txt.Split(" "); int num1 = int.Parse(words); int num2 = int.Parse(words); int sum = num1 + num2; Console.WriteLine("(พูด: " + คำ + " บวก " + คำ + " เท่ากับ " + ผลรวม + ")"); ss.SpeakAsync (คำ + " บวก " + คำ + " เท่ากับ " + ผลรวม); ) ) // sre_SpeechRecognized ) // โปรแกรม ) // ns

    โปรดทราบว่าข้อความใน Results.Text คำนึงถึงขนาดตัวพิมพ์ ("อะไร" และ "อะไร") เมื่อจดจำวลีได้แล้ว ก็สามารถแยกวิเคราะห์เป็นคำเฉพาะได้ ในกรณีนี้ ข้อความที่รู้จักจะอยู่ในรูปแบบ “x บวก y คืออะไร” ดังนั้น “อะไร” จึงถูกวางไว้เป็นคำ และตัวเลขที่บวกทั้งสอง (เป็นสตริง) จะถูกเก็บไว้ในคำและคำ

    การติดตั้งไลบรารี

    คำอธิบายของโปรแกรมสาธิตถือว่ามีการติดตั้งไลบรารีคำพูดที่จำเป็นทั้งหมดบนคอมพิวเตอร์ของคุณ ในการสร้างและรันโปรแกรมสาธิต คุณต้องติดตั้งแพ็คเกจสี่แพ็คเกจ: SDK (ให้ความสามารถในการสร้างการสาธิตใน Visual Studio), รันไทม์ (รันการสาธิตหลังจากที่สร้างขึ้นแล้ว) และภาษาที่รู้จักและสังเคราะห์ (ออกเสียง)

    หากต้องการติดตั้ง SDK ให้ค้นหา "Speech Platform 11 SDK" ในอินเทอร์เน็ต ซึ่งจะนำคุณไปยังหน้าที่ถูกต้องในศูนย์ดาวน์โหลดของ Microsoft ( ข้าว. 4- เมื่อคลิกปุ่มดาวน์โหลด คุณจะเห็นตัวเลือกต่างๆ ปรากฏขึ้น ข้าว. 5- SDK มีเวอร์ชัน 32 และ 64 บิต ฉันขอแนะนำอย่างยิ่งให้ใช้เวอร์ชัน 32 บิต โดยไม่คำนึงถึงขนาดบิตของระบบของคุณ เวอร์ชัน 64 บิตใช้ไม่ได้กับบางแอปพลิเคชัน


    ข้าว. 4. หน้าการติดตั้ง SDK หลักใน Microsoft Download Center


    ข้าว. 5. ติดตั้งคำพูด SDK

    คุณไม่จำเป็นต้องมีอะไรมากไปกว่าไฟล์ .msi ไฟล์เดียวภายใต้ x86 (สำหรับระบบ 32 บิต) เมื่อเลือกไฟล์นี้แล้วคลิกถัดไป คุณสามารถเรียกใช้โปรแกรมติดตั้งได้โดยตรงจากที่นี่ ไลบรารีคำพูดไม่ได้ให้ผลตอบรับมากนักว่าการติดตั้งเสร็จสมบูรณ์เมื่อใด ดังนั้นอย่ามองหาข้อความแสดงความสำเร็จใดๆ


    ข้าว. 6. การติดตั้งสภาพแวดล้อมรันไทม์

    สิ่งสำคัญอย่างยิ่งคือต้องเลือกเวอร์ชันแพลตฟอร์มเดียวกัน (11 ในการสาธิต) และความลึกบิต (32 หรือ 64) เป็น SDK ฉันขอแนะนำเวอร์ชัน 32 บิตอีกครั้ง แม้ว่าคุณจะใช้งานระบบ 64 บิตก็ตาม

    จากนั้นคุณสามารถตั้งค่าภาษาการจดจำได้ หน้าดาวน์โหลดมีให้ที่ ข้าว. 7- โปรแกรมสาธิตใช้ไฟล์ MSSpeech_SR_en-us_TELE.msi (ภาษาอังกฤษ-สหรัฐอเมริกา) SR ย่อมาจากการรู้จำเสียง และ TELE ย่อมาจากระบบโทรศัพท์ ซึ่งหมายความว่าภาษาที่รู้จักได้รับการออกแบบให้ทำงานกับอินพุตเสียงคุณภาพต่ำ เช่น จากโทรศัพท์หรือไมโครโฟนตั้งโต๊ะ


    ข้าว. 7. การตั้งค่าภาษาที่รู้จัก

    สุดท้าย คุณสามารถตั้งค่าภาษาและเสียงสำหรับการสังเคราะห์เสียงพูดได้ หน้าดาวน์โหลดมีให้ที่ ข้าว. 8- โปรแกรมสาธิตใช้ไฟล์ MSSpeech_TTS_en-us_Helen.msi TTS (การแปลงข้อความเป็นคำพูด) มีความหมายเหมือนกันกับการสังเคราะห์เสียงพูด สังเกตเสียงทั้งสองที่มีอยู่เป็นภาษาอังกฤษสหรัฐอเมริกา มีเสียงภาษาอังกฤษอื่นๆ แต่ไม่ใช่เสียง U.S. การสร้างไฟล์ภาษาสังเคราะห์เป็นงานที่ยากมาก อย่างไรก็ตาม คุณสามารถซื้อและติดตั้งเสียงอื่นๆ จากบริษัทต่างๆ ได้


    ข้าว. 8. การตั้งค่าเสียงและภาษาสังเคราะห์

    สิ่งที่น่าสนใจคือ แม้ว่าภาษาการรู้จำเสียงพูดและภาษาสังเคราะห์เสียงพูด/เสียงพูดจะมีความแตกต่างกันโดยสิ้นเชิง แต่ทั้งสองแพ็คเกจก็เป็นตัวเลือกในหน้าดาวน์โหลดเดียวกัน UI ของศูนย์ดาวน์โหลดช่วยให้คุณตรวจสอบทั้งภาษาการจดจำและภาษาสังเคราะห์ได้ แต่การพยายามติดตั้งพร้อมกันนั้นถือเป็นหายนะสำหรับฉัน ดังนั้นฉันขอแนะนำให้ติดตั้งแยกกัน

    เปรียบเทียบ Microsoft.Speech กับ System.Speech

    หากคุณยังใหม่กับการรู้จำและการสังเคราะห์เสียงพูดสำหรับแอปพลิเคชัน Windows คุณอาจสับสนกับเอกสารประกอบได้ง่ายเนื่องจากมีแพลตฟอร์มเสียงพูดหลายแบบ โดยเฉพาะ นอกเหนือจากไลบรารี Microsoft.Speech.dll ที่ใช้โดยโปรแกรมสาธิตในบทความนี้ ยังมีไลบรารีชื่อ System.Speech.dll ซึ่งเป็นส่วนหนึ่งของระบบปฏิบัติการ Windows ไลบรารีทั้งสองมีความคล้ายคลึงกันในแง่ที่ว่า API เกือบจะเหมือนกันแต่ไม่สมบูรณ์ทั้งหมด ดังนั้น หากคุณค้นหาตัวอย่างการประมวลผลคำพูดบนอินเทอร์เน็ต และดูส่วนย่อยของโค้ดแทนที่จะดูโปรแกรมทั้งหมด จะไม่ชัดเจนว่าตัวอย่างดังกล่าวคือ System.Speech หรือ Microsoft.Speech

    หากคุณยังใหม่ต่อการประมวลผลคำพูด ให้ใช้ไลบรารี Microsoft.Speech แทน System.Speech เพื่อเพิ่มการสนับสนุนคำพูดให้กับแอปพลิเคชัน .NET ของคุณ

    แม้ว่าไลบรารีทั้งสองจะใช้ฐานโค้ดหลักร่วมกันและ API ที่คล้ายกัน แต่ก็มีความแตกต่างกันอย่างแน่นอน สรุปความแตกต่างที่สำคัญบางประการได้ดังนี้ โต๊ะ 1.

    โต๊ะ 1. ความแตกต่างหลักระหว่าง Microsoft.Speech และ System.Speech

    System.Speech DLL เป็นส่วนหนึ่งของระบบปฏิบัติการ ดังนั้นจึงได้รับการติดตั้งบนระบบ Windows ทุกระบบ ต้องดาวน์โหลดและติดตั้ง Microsoft.Speech DLL (รวมถึงรันไทม์และภาษาที่เกี่ยวข้อง) ในระบบ การจดจำโดยใช้ System.Speech มักจะต้องมีการฝึกอบรมสำหรับผู้ใช้เฉพาะ เมื่อผู้ใช้อ่านข้อความบางส่วน และระบบเรียนรู้ที่จะเข้าใจลักษณะการออกเสียงของผู้ใช้รายนี้ การจดจำโดยใช้ Microsoft.Speech ใช้งานได้ทันทีสำหรับผู้ใช้ทุกคน System.Speech สามารถจดจำคำได้เกือบทุกคำ (ซึ่งเรียกว่าการเขียนตามคำบอกฟรี) Microsoft.Speech จะจดจำเฉพาะคำและวลีที่อยู่ในวัตถุไวยากรณ์ที่กำหนดไว้ในโปรแกรมเท่านั้น

    การเพิ่มการสนับสนุนการรู้จำเสียงให้กับแอปพลิเคชัน Windows Forms

    กระบวนการในการเพิ่มการสนับสนุนการรู้จำเสียงและการสังเคราะห์เสียงให้กับแอปพลิเคชัน Windows Forms หรือ WPF นั้นคล้ายคลึงกับกระบวนการสำหรับแอปพลิเคชันคอนโซล เพื่อสร้างโปรแกรมสาธิตที่แสดงใน ข้าว. 2ฉันเปิดตัว Visual Studio สร้างแอปพลิเคชัน C# Windows Forms ใหม่และเปลี่ยนชื่อเป็น WinFormSpeech

    หลังจากโหลดโค้ดเทมเพลตลงในตัวแก้ไข ฉันได้เพิ่มลิงก์ไปยังไฟล์ Microsoft.Speech.dll ในหน้าต่าง Solution Explorer เช่นเดียวกับที่ฉันทำในโปรแกรมคอนโซล ที่ด้านบนของซอร์สโค้ด ฉันลบคำสั่งการใช้ที่ไม่จำเป็นออกไป เหลือเพียงการอ้างอิงถึงเนมสเปซระบบ ข้อมูล การวาด และแบบฟอร์ม จากนั้นฉันเพิ่มสองคำสั่งโดยใช้สำหรับเนมสเปซ Microsoft.Speech.Recognition และ System.Globalization

    การสาธิตที่ใช้ Windows Forms ไม่ได้ใช้การสังเคราะห์เสียง ดังนั้นฉันจึงไม่เชื่อมโยงไปยังไลบรารี Microsoft.Speech.Synthetic การเพิ่มการสังเคราะห์เสียงลงในแอปพลิเคชัน Windows Forms จะเหมือนกับในแอปพลิเคชันคอนโซล

    ใน Visual Studio ในโหมดออกแบบ ฉันลากตัวควบคุมกล่องข้อความ กล่องกาเครื่องหมาย และกล่องรายการไปยังแบบฟอร์ม คลิกสองครั้งที่ช่องทำเครื่องหมายและ Visual Studio จะสร้างวิธีจัดการเหตุการณ์ CheckChanged โครงกระดูกโดยอัตโนมัติ

    โปรดจำไว้ว่าโปรแกรมคอนโซลสาธิตเริ่มฟังคำสั่งเสียงทันทีและฟังต่อไปจนกว่าจะสิ้นสุด วิธีการนี้สามารถใช้ในแอปพลิเคชัน Windows Forms ได้ แต่ฉันตัดสินใจอนุญาตให้ผู้ใช้เปิดและปิดการรู้จำเสียงโดยใช้ตัวควบคุมกล่องกาเครื่องหมายแทน (เช่น กล่องกาเครื่องหมาย)

    ซอร์สโค้ดในไฟล์ Form1.cs ของโปรแกรมสาธิต ซึ่งมีการกำหนดคลาสบางส่วนไว้จะแสดงอยู่ที่ ข้าว. 9- มีการประกาศวัตถุกลไกการรู้จำเสียง และสร้างเป็นสมาชิกแบบฟอร์ม ในตัวสร้างแบบฟอร์ม ฉันขอตัวจัดการเหตุการณ์ SpeechRecognized จากนั้นสร้างและโหลดวัตถุ Grammars สองรายการ:

    Form1() สาธารณะ ( InitializeComponent(); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized; ไวยากรณ์ g_HelloGoodbye = GetHelloGoodbyeGrammar(); ไวยากรณ์ g_SetTextBox = GetTextBox1TextGrammar(); sre.LoadGrammarAsync(g_HelloGoodby e);sre.LoadGrammarAsync (g_SetTextBox) ; // sre.RecognizeAsync() คือ // ในตัวจัดการเหตุการณ์ช่องทำเครื่องหมาย)

    ข้าว. 9. เพิ่มการสนับสนุนการรู้จำเสียงให้กับ Windows Forms

    ใช้ระบบ; ใช้ System.Data; โดยใช้ระบบการวาดภาพ; โดยใช้ System.Windows.Forms; ใช้ Microsoft.Speech.Recognition; โดยใช้ System.Globalization; เนมสเปซ WinFormSpeech (คลาสสาธารณะบางส่วน Form1: แบบฟอร์ม ( คงที่ CultureInfo ci = ใหม่ CultureInfo ("en-us"); คงที่ SpeechRecognitionEngine sre = ใหม่ SpeechRecognitionEngine (ci); สาธารณะ Form1 () ( InitializeComponent (); sre.SetInputToDefaultAudioDevice (); sre .SpeechRecognized += sre_SpeechRecognized; Grammar g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammar g_SetTextBox = GetTextBox1TextGrammar(); sre.LoadGrammarAsync(g_HelloGoodbye); sre.LoadGrammarAsync(g_SetTextBox); // sre.Recognize Async() คือ // ในตัวจัดการเหตุการณ์ CheckBox ร ) ไวยากรณ์คงที่ GetHelloGoodbyeGrammar() ( Choices ch_HelloGoodbye = new Choices(); ch_HelloGoodbye.Add("hello"); ch_HelloGoodbye.Add("goodbye"); GrammarBuilder gb_result = new GrammarBuilder(ch_HelloGoodbye); ไวยากรณ์ g_result = ไวยากรณ์ใหม่ (gb_result) ; return g_result; ) ไวยากรณ์คงที่ GetTextBox1TextGrammar() ( Choices ch_Colors = new Choices(); ch_Colors.Add(สตริงใหม่ ( "red", "white", "blue" )); GrammarBuilder gb_result = new GrammarBuilder(); gb_result.Append("ตั้งค่ากล่องข้อความ 1"); gb_result.ผนวก(ch_Colors); ไวยากรณ์ g_result = ไวยากรณ์ใหม่ (gb_result); กลับ g_result; ) โมฆะส่วนตัว checkBox1_CheckedChanged (ผู้ส่งวัตถุ EventArgs e) ( ถ้า (checkBox1.Checked == จริง) sre.RecognizeAsync (RecognizeMode.Multiple); else if (checkBox1.Checked == false) // ปิดการใช้งาน sre.RecognizeAsyncCancel(); ) เป็นโมฆะ sre_SpeechRecognized (ผู้ส่งวัตถุ SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; if (conf< 0.65) return; this.Invoke(new MethodInvoker(() =>( listBox1.Items.Add("ฉันได้ยินคุณพูดว่า: " + txt); ))); // ข้อมูลเฉพาะของ WinForm if (txt.IndexOf("text") >= 0 && txt.IndexOf("box") >= 0 && txt.IndexOf("1")>= 0) ( string word = txt.Split( " "); this.Invoid(new MethodInviver(() => ( textBox1.Text = word; ))); // ข้อมูลเฉพาะของ WinForm ) ) ) // แบบฟอร์ม ) // ns

    ฉันสามารถสร้างออบเจ็กต์ไวยากรณ์สองตัวได้โดยตรง เช่นเดียวกับในโปรแกรมคอนโซล แต่เพื่อให้โค้ดชัดเจนขึ้นเล็กน้อย ฉันจึงกำหนดวิธีตัวช่วยสองวิธี (GetHelloGoodbyeGrammar และ GetTextBox1TextGrammar) ที่ทำงานแทน

    ไวยากรณ์คงที่ GetTextBox1TextGrammar() ( Choices ch_Colors = new Choices(); ch_Colors.Add(สตริงใหม่ ( "red", "white", "blue" )); GrammarBuilder gb_result = new GrammarBuilder(); gb_result.Append("set text กล่อง 1"); gb_result.Append(ch_Colors); ไวยากรณ์ g_result = ไวยากรณ์ใหม่ (gb_result); return g_result; )

    วิธีการช่วยเหลือนี้จะจดจำวลี "set text box 1 red" อย่างไรก็ตาม ผู้ใช้ไม่จำเป็นต้องออกเสียงวลีนี้ทุกประการ ตัวอย่างเช่น เขาอาจพูดว่า "โปรดตั้งค่าข้อความในกล่องข้อความ 1 เป็นสีแดง" และกลไกการรู้จำเสียงจะยังคงจดจำวลีดังกล่าวเป็น "ตั้งค่ากล่องข้อความ 1 สีแดง" แม้ว่าจะมีค่าความเชื่อมั่นต่ำกว่าการจับคู่แบบตรงทั้งหมดกับไวยากรณ์ แม่แบบ กล่าวอีกนัยหนึ่ง เมื่อสร้างออบเจ็กต์ไวยากรณ์ คุณไม่จำเป็นต้องคำนึงถึงรูปแบบวลีทั้งหมด สิ่งนี้ทำให้การใช้การรู้จำเสียงง่ายขึ้นอย่างมาก

    ตัวจัดการเหตุการณ์สำหรับ CheckBox ถูกกำหนดดังนี้:

    โมฆะส่วนตัว checkBox1_CheckedChanged (ผู้ส่งวัตถุ EventArgs e) ( ถ้า (checkBox1.Checked == จริง) sre.RecognizeAsync (RecognizeMode.Multiple); else if (checkBox1.Checked == false) // ปิดการใช้งาน sre.RecognizeAsyncCancel(); )

    ออบเจ็กต์กลไกการรู้จำเสียง sre (เครื่องมือรู้จำเสียง) จะมีอยู่เสมอตลอดอายุของแอปพลิเคชัน Windows Forms วัตถุนี้ถูกเปิดใช้งานและปิดใช้งานโดยการเรียกไปยังเมธอด RecognizeAsync และ RecognizeAsyncCancel เมื่อผู้ใช้สลับกล่องกาเครื่องหมายตามลำดับ

    ข้อกำหนดตัวจัดการเหตุการณ์ SpeechRecognized เริ่มต้นด้วย:

    เป็นโมฆะ sre_SpeechRecognized (ผู้ส่งวัตถุ SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; if (conf< 0.65) return; ...

    นอกจากคุณสมบัติ Result.Text และ Result.Confidence ที่ใช้อย่างต่อเนื่องไม่มากก็น้อย ออบเจ็กต์ Result ยังมีคุณสมบัติที่มีประโยชน์แต่ซับซ้อนกว่าอีกหลายรายการที่คุณอาจต้องการสำรวจ ตัวอย่างเช่น คำพ้องเสียง และ ReplacementWordUnits นอกจากนี้ กลไกการรู้จำเสียงยังมีกิจกรรมที่เป็นประโยชน์หลายอย่าง เช่น SpeechHypothesized

    this.Invoke((Action)(() => listBox1.Items.Add("ฉันได้ยินคุณพูดว่า: " + txt)));

    ตามทฤษฎี การใช้ผู้รับมอบสิทธิ์ MethodInviver จะมีประสิทธิภาพมากกว่าการดำเนินการเล็กน้อยในสถานการณ์นี้ เนื่องจาก MethodInviver เป็นส่วนหนึ่งของเนมสเปซ Windows.Forms และดังนั้นจึงเฉพาะเจาะจงกับแอปพลิเคชัน Windows Forms ผู้รับมอบสิทธิ์การดำเนินการมีความหลากหลายมากขึ้น ตัวอย่างนี้แสดงให้เห็นว่าคุณสามารถจัดการแอปพลิเคชัน Windows Forms ได้อย่างสมบูรณ์ผ่านกลไกการรู้จำเสียง - นี่เป็นคุณสมบัติที่ทรงพลังและมีประโยชน์อย่างเหลือเชื่อ

    บทสรุป

    ข้อมูลที่นำเสนอในบทความนี้ควรช่วยให้คุณเริ่มต้นได้ทันที หากคุณต้องการสำรวจการสังเคราะห์เสียงและการจดจำคำพูดในแอปพลิเคชัน .NET การเรียนรู้เทคโนโลยีนั้นเป็นเรื่องง่ายเมื่อคุณผ่านช่วงการเรียนรู้เริ่มต้นและการติดตั้งส่วนประกอบไปแล้ว ความท้าทายที่แท้จริงในการสังเคราะห์เสียงพูดและการรู้จำคือการทำความเข้าใจว่าเมื่อใดจะมีประโยชน์จริง

    ด้วยโปรแกรมคอนโซล คุณสามารถสร้างการสนทนากลับไปกลับมาที่น่าสนใจโดยที่ผู้ใช้ถามคำถามและคำตอบของโปรแกรม ส่งผลให้เกิดสภาพแวดล้อมที่คล้ายกับ Cortana คุณต้องใช้ความระมัดระวัง เนื่องจากเมื่อคำพูดออกมาจากลำโพงของคอมพิวเตอร์ ไมโครโฟนจะรับคำพูดนั้นและอาจจดจำได้อีกครั้ง ฉันพบว่าตัวเองอยู่ในสถานการณ์ที่ค่อนข้างตลกเมื่อฉันถามคำถาม แอปจดจำและตอบกลับ แต่คำตอบที่พูดจะกระตุ้นให้เกิดเหตุการณ์การจดจำครั้งต่อไป และฉันก็จบลงด้วยคำพูดที่ตลกไม่รู้จบ

    การใช้คำพูดที่เป็นไปได้อีกอย่างหนึ่งในโปรแกรมคอนโซลคือการจดจำคำสั่งเช่น "Launch Notepad" และ "Launch Word" กล่าวอีกนัยหนึ่งโปรแกรมคอนโซลดังกล่าวสามารถใช้บนคอมพิวเตอร์ของคุณเพื่อดำเนินการที่อาจต้องใช้การจัดการแป้นพิมพ์และเมาส์เป็นจำนวนมาก

    เจมส์ แมคคาฟฟรีย์(ดร.เจมส์ แมคคาฟฟรีย์) ทำงานให้กับ Microsoft Research ในเมืองเรดมอนด์ รัฐวอชิงตัน เขามีส่วนร่วมในการสร้างผลิตภัณฑ์ Microsoft หลายอย่าง รวมถึง Internet Explorer และ Bing เขาสามารถติดต่อได้ที่ [ป้องกันอีเมล].

    ขอขอบคุณผู้เชี่ยวชาญด้านการวิจัยของ Microsoft Rob Gruen, Mark Marron และ Curtis von Veh สำหรับการตรวจทานบทความนี้