Flutterã§é³å£°ã¡ã¢ã¢ããªã®ãããªãã®ãäœãããšããŠããŠãé²é³ããé³å£°ãæåã«å€ããæ¹æ³ã調ã¹ãŠããŸããã
ãã®äžã§èŠã€ããã®ã sherpa-onnx ã§ãã
æåã¯ãé³å£°èªèã®ã©ã€ãã©ãªããªïŒããããã«æã£ãŠããã®ã§ããã調ã¹ãŠã¿ããšãé³å£°èªèã ãã§ãªããVADãTTSã話è èå¥ãããŒã¯ãŒãæ€åºãªã©ãé³å£°ãŸããã®AIæ©èœãããããæ±ããã©ã€ãã©ãªã§ããã
ãã£ããèšããšãsherpa-onnx 㯠é³å£°AIã¢ãã«ãã¢ããªã®äžã§åããããã®éå
·ç®± ã®ãããªãã®ã§ãã
ãã®èšäºã§ã¯ãFlutterã§ sherpa-onnx ã䜿ãããã«èª¿ã¹ãããšããåèŠã®äººã«ãåããããã«æŽçããŠã¿ãŸãã
30ç§ã§ãããš
sherpa-onnx ã¯ãé³å£°ãŸããã®AIæ©èœãã¢ããªå
ã§åããããã®ã©ã€ãã©ãªã§ãã
ã§ããããšã¯ãããšãã°ä»¥äžã®ãããªãã®ã§ãã
- é³å£°ãæåã«ãã
- 話ããŠããéšåã ããæ€åºãã
- æåãé³å£°ã§èªã¿äžãã
- 誰ã話ããŠããããå€å®ãã
- èªèçµæã«å¥èªç¹ãä»ãã
- é³å£°ãããã€ãºãæžãã
倧äºãªã®ã¯ãsherpa-onnx èªäœããã¹ãŠã®æ©èœãçŽæ¥æã£ãŠãããšãããããé³å£°èªèã¢ãã«ãèªã¿äžãã¢ãã«ãªã©ãåããããã®åå°ã«ãªã£ãŠããããšããç¹ã§ãã
ã²ãŒã æ©æ¬äœã«ãœãããå
¥ããŠéã¶ããã«ãsherpa-onnx ã«äœ¿ãããã¢ãã«ãçµã¿åãããããšã§ãé³å£°èªèã«ããèªã¿äžãã«ããVADã«ã䜿ããããšããã€ã¡ãŒãžã§ãã
sherpa-onnx ã£ãŠäœïŒ
sherpa-onnx ã¯ãé³å£°ç³»ã®AIã¢ãã«ããªãã©ã€ã³ã§åããããã®ã©ã€ãã©ãªã§ãã
ããå°ãå
·äœçã«èšããšãONNX ãšãã圢åŒã®AIã¢ãã«ããã¹ãããPCã®äžã§åãããããã«ããŠããããã®ã§ãã
ããªããã£ããæŽçãããšããããªæãã§ãã
-
ONNXã¯ãAIã¢ãã«ããããããªç°å¢ã§åãããããããããã®å ±éãã©ãŒããã -
sherpa-onnxã¯ããã®ONNX圢åŒã®é³å£°AIã¢ãã«ãåããããã®ã©ã€ãã©ãª - Flutter ãã䜿ãå Žåã¯ã
sherpa_onnxãšããããã±ãŒãžã䜿ã
ãªã®ã§ãsherpa-onnx ã¯ãé³å£°ãæåã«ããæ©èœãã®ãã®ããšãããããé³å£°AIã¢ãã«ãåããããã®å®è¡ç°å¢ã«è¿ãã§ãã
ã²ãŒã æ©æ¬äœãšãœããã§èãããšåããããã
å人çã«ã¯ãsherpa-onnx ã¯ã²ãŒã æ©æ¬äœã®ããã«èãããšåããããããšæããŸããã
ã²ãŒã æ©æ¬äœã ãããã£ãŠããã²ãŒã ã¯ã§ããŸããã
ã²ãŒã ãããã«ã¯ãããã«ãœãããå ¥ããå¿ èŠããããŸãã
ãããšåãã§ãsherpa-onnx ã ããå
¥ããŠããããã«æ¥æ¬èªã®é³å£°èªèãã§ããããã§ã¯ãããŸããã
å¥éãé³å£°èªèçšã®AIã¢ãã«ãçšæããå¿ èŠããããŸãã
ã€ã¡ãŒãžãšããŠã¯ããã§ãã
| ããšã | sherpa-onnx ã®äžç |
|---|---|
| ã²ãŒã æ©æ¬äœ | sherpa-onnx |
| ã²ãŒã ãœãã | AIã¢ãã« |
| é³å£°èªèçšã®ãœãã | é³å£°ãæåã«ããã¢ãã« |
| èªã¿äžãçšã®ãœãã | æåãé³å£°ã«ããã¢ãã« |
| VADçšã®ãœãã | 話ããŠããéšåãæ€åºããã¢ãã« |
åãã²ãŒã æ©ã§ããå ¥ãããœããã«ãã£ãŠã§ããããšãå€ãããŸãã
ãããšåãããã«ãsherpa-onnx ããçµã¿åãããã¢ãã«ã«ãã£ãŠã§ããããšãå€ãããŸãã
æ¥æ¬èªã®é³å£°èªèã¢ãã«ã䜿ãã°ãæ¥æ¬èªã®æåèµ·ãããã§ããŸãã
èªã¿äžãçšã®ã¢ãã«ã䜿ãã°ãããã¹ããé³å£°ã§èªã¿äžããããšãã§ããŸãã
VADçšã®ã¢ãã«ã䜿ãã°ãé³å£°ã®äžããã人ã話ããŠããéšåãã ããæ€åºã§ããŸãã
ã€ãŸããsherpa-onnx ã¯ã
é³å£°AIã¢ãã«ãåããããã®æ¬äœ
ã§ãããå®éã«äœããããã¯ã
ã©ã®ã¢ãã«ã䜿ãã
ã«ãã£ãŠæ±ºãŸããŸãã
äœãã§ããã®ã
sherpa-onnx ã§æ±ããé³å£°ãŸããã®æ©èœã«ã¯ããããããªãã®ããããŸãã
代衚çãªãã®ããã£ããæŽçãããšããããªæãã§ãã
| ã§ããããš | ãã£ããèšããš | çšéã®äŸ |
|---|---|---|
| é³å£°èªè | é³å£°ãæåã«ãã | é³å£°ã¡ã¢ãæåèµ·ãã |
| VAD | 話ããŠããéšåã ããæ€åºãã | ç¡é³éšåãé€ããçºè©±ããšã«åºåã |
| èªã¿äžã | æåãé³å£°ã«ãã | ããé³å£°ãæç« èªã¿äžã |
| 話è èå¥ | ãã®å£°ã誰ããå€å®ãã | æ¬äººç¢ºèªã話è ã®åºå¥ |
| 話è ãã€ã¢ã©ã€ãŒãŒã·ã§ã³ | ãã€èª°ã話ããããåãã | äŒè°ã®è°äºé² |
| ããŒã¯ãŒãæ€åº | ç¹å®ã®èšèãæ€åºãã | ãŠã§ã€ã¯ã¯ãŒã |
| èšèªå€å® | äœèªã§è©±ããŠããããå€å®ãã | å€èšèªã¢ã㪠|
| å¥èªç¹ä»äž | èªèçµæã«å¥èªç¹ãä»ãã | æåèµ·ããçµæãèªã¿ããããã |
| ãã€ãºé€å» | é³å£°ããéé³ãæžãã | é²é³é³å£°ã®æ¹å |
| é³ã¿ã°ä»ã | é³ã®çš®é¡ãå€å®ãã | ææãç¬ã®é³Žã声ãªã©ã®åé¡ |
åãæåã«å¿ èŠã ã£ãã®ã¯ãäž»ã«æ¬¡ã®2ã€ã§ããã
- é³å£°èªè
- VAD
é³å£°èªèã¯ãé²é³ãã声ãæåã«å€ããããã«å¿ èŠã§ãã
VADã¯ãé²é³ããé³å£°ã®äžããã人ã話ããŠããéšåãã ããåãåºãããã«å¿ èŠã§ãã
ããšãã°ãé²é³ããŒã¿ã®äžã«ã¯ç¡é³éšåãéããããŸãã
ããããã®ãŸãŸé³å£°èªèã«æž¡ããããã
ããããããããŸã§ã1ã€ã®çºè©±ã§ãã
ãšåãåºããŠããèªèããæ¹ããæ±ãããããªããŸãã
ãã®ãçºè©±ã®åºåãããæ€åºããã®ã VAD ã§ãã
åã®å Žåãé³å£°èªèãšVADãå¥ã
ã®ã©ã€ãã©ãªã§çšæããå¿
èŠãããã®ããªãšæã£ãŠããã®ã§ãããsherpa-onnx ã®äžã§äž¡æ¹æ±ãããã ãšåãããŸããã
ããã¯ããªã䟿å©ããã ãªãšæããŸããã
ãªãã©ã€ã³ã§åãã®ã倧ãã
sherpa-onnx ã®å€§ããªç¹åŸŽã®1ã€ã¯ããªãã©ã€ã³ã§åãããããšã§ãã
ã€ãŸããé³å£°ããŒã¿ãå€éšã®ãµãŒããŒã«éããã«ãã¹ãããPCã®äžã ãã§åŠçã§ããŸãã
ããã¯é³å£°ã¢ããªã§ã¯ããªã倧ããã§ãã
é³å£°ããŒã¿ã«ã¯ãå人çãªäŒè©±ãã¡ã¢ãå«ãŸããããšããããŸãã
ãã®ãããæ¯åãµãŒããŒã«éã£ãŠåŠçããæ¹åŒã ãšããã©ã€ãã·ãŒãéä¿¡ç°å¢ãæ°ã«ãªããŸãã
äžæ¹ã§ã端æ«å ã§åŠçã§ããã°ã
- ãããããªããŠãåã
- é³å£°ããŒã¿ãå€ã«éããªããŠãã
- APIå©çšæãããããªã
- ã¬ã¹ãã³ã¹ãéãå Žåããã
ãšããã¡ãªããããããŸãã
ãã¡ããã端æ«ã®æ§èœãã¢ãã«ãµã€ãºã«ãã£ãŠå¶çŽã¯ãããŸãã
ãã ãã¹ããã¢ããªã®äžã§é³å£°èªèãVADãå®çµã§ããå¯èœæ§ãããã®ã¯ãããªãé åçã§ãã
Flutter ã§äœ¿ãã«ã¯äœãå¿ èŠã
Flutter ã§ sherpa-onnx ã䜿ãå Žåã倧ããªæµãã¯æ¬¡ã®3ã¹ãããã§ãã
-
sherpa_onnxããã±ãŒãžãå ¥ãã - 䜿ãããAIã¢ãã«ãçšæãã
- Dartã®ã³ãŒãããåŒã³åºã
ããã§å€§äºãªã®ã¯ãããã±ãŒãžãå ¥ããã ãã§ã¯å®çµããªããšããããšã§ãã
sherpa_onnx ããã±ãŒãžã¯ããããŸã§AIã¢ãã«ãåããããã®ä»çµã¿ã§ãã
å®éã«æ¥æ¬èªã®é³å£°èªèãããããªããæ¥æ¬èªé³å£°èªèçšã®ã¢ãã«ãå¥éçšæããå¿ èŠããããŸãã
ãã®ç¹ã¯ãæåã«å°ããããããããšããã ãšæããŸãã
ã¹ããã1ïŒããã±ãŒãžãå ¥ãã
ãŸã㯠Flutter ãããžã§ã¯ãã« sherpa_onnx ã远å ããŸãã
dependencies:
sherpa_onnx: ^1.13.2
ãŸãã¯ãã³ãã³ãã§è¿œå ããŸãã
flutter pub add sherpa_onnx
ããã§ãFlutter ãã sherpa_onnx ãåŒã³åºããããã«ãªããŸãã
ãã ããããã ãã§é³å£°èªèãã§ããããã§ã¯ãããŸããã
次ã«ãå®éã«äœ¿ãã¢ãã«ãçšæããå¿ èŠããããŸãã
ã¹ããã2ïŒã¢ãã«ãçšæãã
sherpa-onnx ã§ã¯ãç®çã«å¿ããŠã¢ãã«ãçšæããŸãã
ããšãã°ã
- æ¥æ¬èªã®é³å£°èªèãããããªããæ¥æ¬èªé³å£°èªèã¢ãã«
- VADã䜿ããããªããVADçšã¢ãã«
- èªã¿äžããããããªããTTSçšã¢ãã«
ãå¿ èŠã«ãªããŸãã
ã¢ãã«ã¯ãå ¬åŒãé åžããŠãããã®ã䜿ãããšãã§ããŸãã
ãã ããã¢ãã«ãã¡ã€ã«ã¯ãµã€ãºã倧ããããšããããŸãã
æ°MBã§æžããã®ãããã°ãæ°åMBãæ°çŸMBã«ãªããã®ããããŸãã
ãã®ãããå®éã®ã¢ããªã«çµã¿èŸŒãå Žåã¯ã
- ã¢ããªã«æåãã忢±ããã®ã
- ååèµ·åæã«ããŠã³ããŒãããã®ã
- ã©ã®ã¢ãã«ã䜿ãã®ã
- iOS / Android ã®äž¡æ¹ã§ã©ãé 眮ããã®ã
ãèããå¿ èŠããããŸãã
ããã¯ãå®è£ äžããªãéèŠãªãã€ã³ãã«ãªãããã§ãã
ã¹ããã3ïŒã³ãŒãããåŒã³åºã
å®éã®ã³ãŒãã§ã¯ããã£ããæ¬¡ã®ãããªæµãã«ãªããŸãã
- æåã«åæåãã
- ã©ã®ã¢ãã«ã䜿ããèšå®ãã
- é³å£°ããŒã¿ãæž¡ã
- çµæãåãåã
é³å£°èªèã®å Žåãã€ã¡ãŒãžã¯ãããªæãã§ãã
import 'package:sherpa_onnx/sherpa_onnx.dart' as sherpa;
// æåã«1åã ãåæå
sherpa.initBindings();
// èªèåšãäœã
final recognizer = sherpa.OfflineRecognizer(
sherpa.OfflineRecognizerConfig(
model: sherpa.OfflineModelConfig(
nemoCtc: sherpa.OfflineNemoEncDecCtcModelConfig(
model: '/path/to/model.int8.onnx',
),
tokens: '/path/to/tokens.txt',
),
),
);
// é³å£°ããŒã¿ãæž¡ã
final stream = recognizer.createStream();
stream.acceptWaveform(
samples: samples,
sampleRate: 16000,
);
recognizer.decode(stream);
// çµæãåãåã
final text = recognizer.getResult(stream).text;
stream.free();
ããã§ã¯çްããèšå®ã¯çç¥ããŠããŸããã倧ãŸããªæµãã¯ã
åæåãã â ã¢ãã«ãæå®ãã â é³å£°ãæž¡ã â çµæãåãåã
ã§ãã
ãã®æµãã¯ãé³å£°èªè以å€ã®æ©èœã§ã䌌ãŠããŸãã
VADãªãVADçšã®ãªããžã§ã¯ããäœããTTSãªãTTSçšã®ãªããžã§ã¯ããäœãããšããæãã§ãã
VADãåãããã«äœ¿ãã
åãç¹ã«äŸ¿å©ããã ãšæã£ãã®ã¯ãVADãåã sherpa-onnx ã®äžã§æ±ããããšã§ãã
VADã¯ãé³å£°ã®äžããã人ã話ããŠããéšåããæ€åºããæ©èœã§ãã
ããšãã°ãé²é³ããŒã¿ã次ã®ããã«ãªã£ãŠãããšããŸãã
ç¡é³ â çºè©± â ç¡é³ â çºè©± â ç¡é³
ãã®ãšããVADã䜿ããšã
çºè©±1
çºè©±2
ã®ããã«ã人ã話ããŠããéšåã ããåãåºãããšãã§ããŸãã
é³å£°èªèã¢ããªãäœãå Žåããã®æ©èœã¯ããªãéèŠã§ãã
ãã£ãšé²é³ãç¶ããé³å£°ããã®ãŸãŸèªèã«ãããããããçºè©±åäœã§åºåã£ãŠåŠçããæ¹ãæ±ããããããã§ãã
sherpa-onnx ã§ã¯ãVADçšã®ã¢ãã«ãæå®ããŠã次ã®ãããªã€ã¡ãŒãžã§äœ¿ããŸãã
final vad = sherpa.VoiceActivityDetector(
config: sherpa.VadModelConfig(
sileroVad: sherpa.SileroVadModelConfig(
model: '/path/to/silero_vad.onnx',
),
),
bufferSizeInSeconds: 30,
);
vad.acceptWaveform(samples);
while (!vad.isEmpty()) {
final segment = vad.front();
vad.pop();
// segment ãé³å£°èªèã«æž¡ã
}
ããã«ãã£ãŠã
é²é³ãã â 話ããŠããéšåãåãåºã â æåã«ãã
ãšããæµããäœããŸãã
é³å£°èªèãšVADãåãã©ã€ãã©ãªå ã§æ±ããã®ã¯ãæ§æãã·ã³ãã«ã«ãªãã®ã§ãããããã§ãã
å®éã«è©ŠããŠã¿ãææ³
æå ã® iPhone 15 ã§ãæ¥æ¬èªé³å£°èªèã¢ãã«ãå ¥ããŠè©ŠããŠã¿ãŸããã
ãŸã 軜ãè§Šã£ã段éã§ãããçãæ¥æ¬èªã®æç« ã§ããã°ãããªãéãèªèãããŸããã
ããšãã°ã
ãããã«ã¡ã¯ã
ã®ãããªçãçºè©±ã¯ãã»ãšãã©åŸ ããã«ããã¹ããšããŠè¿ã£ãŠããŸãã
ãåã話ããããŠããŸãã
ã®ãããªæç« ããããªãèªç¶ã«èªèãããŸããã
ãã¡ãããããã¯äœ¿ãã¢ãã«ãç«¯æ«æ§èœãé²é³ç°å¢ã«ãã£ãŠå€ãããšæããŸãã
éé³ãå€ãå Žæããé·ãæç« ãè€æ°äººã®äŒè©±ã§ã¯ããŸãéãæ€èšŒãå¿ èŠã§ãã
ãã ãå°ãªããšãã
ãªãã©ã€ã³ã§ãããŸã§åãã®ã
ãšããé©ãã¯ãããŸããã
å®éã®ã¢ããªã§äœ¿ããšãã«æ°ã«ãªããããªããš
䟿å©ãããªäžæ¹ã§ãå®éã®ã¢ããªã«çµã¿èŸŒããªãèããããšãå€ããã§ãã
ç¹ã«æ°ã«ãªã£ãã®ã¯ã次ã®ãããã§ãã
ã¢ãã«ãµã€ãº
é³å£°èªèã¢ãã«ã¯ãµã€ãºã倧ãããªããã¡ã§ãã
ã¢ããªã«å梱ãããšãã¢ããªæ¬äœã®ãµã€ãºã倧ãããªããŸãã
äžæ¹ã§ãããšããããŠã³ããŒãããæ¹åŒã«ãããšãååèµ·åæã®èšèšãããŠã³ããŒã管çãå¿ èŠã«ãªããŸãã
ç«¯æ«æ§èœ
ãªãã©ã€ã³ã§åããšããããšã¯ãåŠçã¯ç«¯æ«åŽã§è¡ãããŸãã
ãã®ãããå€ã端æ«ã§ã¯åŠçãéããªãå¯èœæ§ããããŸãã
å®éã«äœ¿ããªããiPhone / Android ã®è€æ°ç«¯æ«ã§æ€èšŒããæ¹ãè¯ãããã§ãã
ã¢ãã«éžã³
sherpa-onnx ã§ã¯ãç®çã«å¿ããŠãããããªã¢ãã«ãéžã¹ãŸãã
ããã¯äŸ¿å©ãªåé¢ãæåã¯ã©ããéžã¹ã°ããã®ãåããã«ããã§ãã
æ¥æ¬èªèªèã«åããŠããã¢ãã«ã軜ãã¢ãã«ã粟床ãé«ãã¢ãã«ãªã©ãçšéã«å¿ããéžå®ãå¿ èŠã«ãªããŸãã
iOS / Android ã®é 眮
Flutterã§äœ¿ãå Žåã§ããã¢ãã«ãã¡ã€ã«ãã©ãã«çœ®ãããã©ãèªã¿èŸŒããã¯èããå¿ èŠããããŸãã
éçºäžã¯ããŒã«ã«ã«çœ®ãã°ãããŠããæ¬çªã¢ããªã§ã¯é åžæ¹æ³ãŸã§å«ããŠèšèšããå¿ èŠããããŸãã
ãŸãšã
sherpa-onnx ã¯ãæåã«èŠããšå°ãåããã«ããã©ã€ãã©ãªã§ãã
ååããšã£ã€ãã«ããã§ãããã§ããããšãå€ãã®ã§ãåèŠã ãšãçµå±ããã¯äœãªã®ïŒããšãªããããã§ãã
ãã ããã£ããçè§£ãããšãããªã䟿å©ãããªãã®ã ãšåãããŸããã
äžèšã§èšããªããsherpa-onnx ã¯ã
é³å£°ãŸããã®AIã¢ãã«ãã¢ããªã®äžã§åããããã®éå ·ç®±
ã§ãã
é³å£°èªèã ãã§ã¯ãªããVADãèªã¿äžãã話è èå¥ãå¥èªç¹ä»äžããã€ãºé€å»ãªã©ãé³å£°ã«é¢ãããããããªæ©èœãæ±ããŸãã
Flutter ãã䜿ãå Žåã¯ãsherpa_onnx ããã±ãŒãžãå
¥ããŠã䜿ãããã¢ãã«ãçšæããã³ãŒãããåŒã³åºãããšããæµãã«ãªããŸãã
åèªèº«ããŸã æ€èšŒäžã§ãããé³å£°ã¡ã¢ã¢ããªãæåèµ·ããã¢ããªã®ãããªãã®ãäœããªããããªãæåãªéžæè¢ã«ãªãããã ãšæããŸããã
ç¹ã«ã
- ãªãã©ã€ã³ã§åã
- é³å£°ããŒã¿ãå€ã«éããªããŠãã
- é³å£°èªèãšVADãåãä»çµã¿ã§æ±ãã
- Flutter ããåŒã³åºãã
ãšããç¹ã¯ããªãé åçã§ãã
ãŸã åãã£ãŠããªãéšåãå€ãã§ããããŸãã¯ãFlutterã§é³å£°ãŸããããããªããsherpa-onnx ã¯äžåºŠèŠãŠãã䟡å€ãããããããšããã®ããçŸæç¹ã§ã®ææ³ã§ãã