@@ -19,6 +19,7 @@ const Home = () => {
19
19
const [ detecting , setDetecting ] = useState ( false ) ; // 音声認識ステータス
20
20
const [ finalText , setFinalText ] = useState ( "" ) ; // 確定された文章
21
21
const [ transcript , setTranscript ] = useState ( "ボタンを押して検知開始" ) ; // 認識中の文章
22
+ const [ android , setAndroid ] = useState ( false ) ; // Android chrome用のフラグ
22
23
// 単語検知
23
24
const initialTagValues = [ "年収" ] ; // デフォルト検知単語
24
25
const candidates = [ "年収" , "自由" , "成功" ] ; // 検知単語候補
@@ -35,6 +36,12 @@ const Home = () => {
35
36
alert ( "お使いのブラウザには未対応です" ) ;
36
37
return ;
37
38
}
39
+
40
+ // Androidのためのプラグ
41
+ if ( / A n d r o i d / i. test ( navigator . userAgent ) ) {
42
+ setAndroid ( true ) ;
43
+ } ;
44
+
38
45
// NOTE: 将来的にwebkit prefixが取れる可能性があるため
39
46
const SpeechRecognition =
40
47
window . SpeechRecognition || window . webkitSpeechRecognition ;
@@ -47,24 +54,27 @@ const Home = () => {
47
54
} ;
48
55
recognizerRef . current . onend = ( ) => {
49
56
setDetecting ( false ) ;
57
+ if ( android && ! alertOpen ) {
58
+ recognizerRef . current . start ( ) ;
59
+ }
50
60
} ;
51
61
recognizerRef . current . onresult = event => {
52
62
[ ...event . results ] . slice ( event . resultIndex ) . forEach ( result => {
53
63
const transcript = result [ 0 ] . transcript ;
64
+ setTranscript ( transcript ) ;
54
65
if ( result . isFinal ) {
55
- // 音声認識が完了して文章が確定
56
- setFinalText ( prevState => {
57
- return prevState + transcript ;
58
- } ) ;
59
- setTranscript ( "" ) ;
60
- } else {
61
- // 音声認識の途中経過
62
66
if ( tagValues . some ( value => transcript . includes ( value ) ) ) {
63
67
// NOTE: ユーザーが効果音を追加しなければデフォルトを鳴らす
64
68
( userMusic || music ) . play ( ) ;
65
69
setAlertOpen ( true ) ;
66
70
}
67
- setTranscript ( transcript ) ;
71
+ // 音声認識が完了して文章が確定
72
+ setFinalText ( prevState => {
73
+ // Android chromeなら値をそのまま返す
74
+ return android ? transcript : ( prevState + transcript ) ;
75
+ } ) ;
76
+ // 文章確定したら候補を削除
77
+ setTranscript ( "" ) ;
68
78
}
69
79
} ) ;
70
80
} ;
0 commit comments