index.html 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>在线语音识别</title>
  6. <link rel="stylesheet" href="../static/css/style.css">
  7. <script src="../static/js/jquery-3.1.1.min.js"></script>
  8. <meta chrset="utf-8" name="viewport"
  9. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
  10. <link rel="stylesheet" type="text/css" href="../static/css/font-awesome.min.css">
  11. </head>
  12. <body>
  13. <div id="View-center">
  14. <div class="head-box"></div>
  15. <div class="view">
  16. <button class="fa fa-microphone" id="record-button"></button>
  17. <audio id="audio-player" controls></audio>
  18. </div>
  19. <hr>
  20. <p id="result-text"></p>
  21. <hr>
  22. <label for="file" class="custom-file-upload">
  23. <p3 style="font-weight: bold; font-size: 17px;">上传音频</p3>
  24. </label>
  25. <a href="../static/src/API.pdf" class="custom-file-upload"
  26. style="font-weight: bold; font-size: 17px; text-decoration: none;" target="_blank">API文档</a>
  27. <input type="file" id="file" name="file" accept=".wav" style="display:none;">
  28. <div id="go-view">
  29. <pre class="code-Attr"
  30. role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">package</span> <span class="cm-variable">main</span></span></pre>
  31. <br>
  32. <pre class="code-Attr"
  33. role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-string">"fmt"</span></span></pre>
  34. <br>
  35. <pre class="code-Attr"
  36. role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">func</span> <span class="cm-variable">main</span><span class="cm-variable">() {</span></span></pre>
  37. <pre class="code-Attr"
  38. role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">fmt</span><span class="cm-number"><span class="cm-variable">.</span></span><span class="cm-variable">Printf</span><span class="cm-variable">(</span><span class="cm-string">"Hello world\n"</span><span class="cm-variable">)</span></span></pre>
  39. <pre class="code-Attr"
  40. role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">}</span></span></pre>
  41. </div>
  42. <audio id="start-audio" src="../static/src/audio/on.flac"></audio>
  43. <script>
  44. let mediaRecorder;
  45. const chunks = [];
  46. const recordButton = document.querySelector('#record-button');
  47. const audioPlayer = document.querySelector('#audio-player');
  48. const resultText = document.querySelector('#result-text');
  49. const inputElement = document.getElementById("file");
  50. inputElement.addEventListener("change", handleFiles, false);
  51. navigator.mediaDevices.getUserMedia({ audio: true })
  52. .then(stream => {
  53. mediaRecorder = new MediaRecorder(stream);
  54. mediaRecorder.ondataavailable = event => chunks.push(event.data);
  55. mediaRecorder.onstop = () => {
  56. const blob = new Blob(chunks, { type: 'audio/wav' });
  57. const url = URL.createObjectURL(blob);
  58. audioPlayer.src = url;
  59. recordButton.style.cssText = 'color: #a1a1a1; background-color: #2b2b2b;';
  60. recordButton.disabled = false;
  61. const formData = new FormData();
  62. formData.append('file', blob, 'source.wav');
  63. fetch('/voice', {
  64. method: 'POST',
  65. body: formData,
  66. })
  67. .then(response => response.json())
  68. .then(data => {
  69. if (data.message != "") {
  70. resultText.textContent = "结果:" + data.message;
  71. } else {
  72. resultText.textContent = "结果:什么也没听出来."
  73. console.log("什么也没听出来.");
  74. }
  75. })
  76. .catch(error => {
  77. console.error('上传音频失败:', error);
  78. });
  79. chunks.length = 0;
  80. };
  81. })
  82. .catch(err => console.error('无法访问麦克风:', err));
  83. recordButton.addEventListener('click', () => {
  84. if (mediaRecorder.state === 'inactive') {
  85. resultText.textContent = '';
  86. audioPlayer.src = '';
  87. mediaRecorder.start();
  88. recordButton.style.cssText = 'color: #ffffff; background-color: #444444;';
  89. const startAudio = document.querySelector('#start-audio');
  90. startAudio.currentTime = 0;
  91. startAudio.play();
  92. } else {
  93. mediaRecorder.stop();
  94. recordButton.disabled = true;
  95. }
  96. });
  97. function handleFiles() {
  98. const fileList = this.files;
  99. if (fileList.length) {
  100. const xhr = new XMLHttpRequest();
  101. const formData = new FormData();
  102. formData.append("file", fileList[0], fileList[0].name);
  103. xhr.open("POST", "/voice", true);
  104. xhr.onreadystatechange = function () {
  105. if (xhr.readyState === 4 && xhr.status === 200) {
  106. const result = JSON.parse(xhr.responseText);
  107. if (result['message'] != "") {
  108. resultText.textContent = "结果:" + result['message'];
  109. } else {
  110. resultText.textContent = "结果:什么也没听出来."
  111. console.log("什么也没听出来.");
  112. }
  113. }
  114. };
  115. xhr.send(formData);
  116. }
  117. }
  118. </script>
  119. </body>
  120. </html>