해당 패키지를 이용한 구현 자체는 빠르게 해결됐지만 나는 남자 목소리를 원하는데 여자 목소리만 실행되는 문제가 있었다. setVoice가 있으니 목소리 설정은 가능할텐데 공식 문서와 github을 살펴봐도 가능한 목소리의 리스트가 존재하지 않았다.
보아하니 TTS 엔진 자체를 각 플랫폼에서 가져와서 사용하기 때문에 귀찮아서 리스트를 안 제공하는 것으로 추측된다.
내가 원하는 음성은 일본어 화자 남성의 목소리였다. 처음에는 그냥 getVoices로 나오는 목소리 리스트를 모두 print 했으나 너무 길어서 짤리는 문제가 발생했다. 그래서 반복문을 이용해 locale 값이 ja로 시작되는 값들을 가져와서 배열로 리턴해서 추출했다.
List<dynamic> voices = await tts.getVoices;
List<dynamic> japaneseVoices = [];
for (var voice in voices) {
if (voice['locale'].toString().startsWith('ja')) {
japaneseVoices.add(voice);
}
}
print('일본어 목소리 목록: $japaneseVoices');
아래는 결과값이다. 일단 안드로이드 엔진만 처리하고 추후에 iOS의 값을 추출해 남자 버전을 넣을 생각이었지만 확인한 결과 iOS에서는 TTS 엔진이 Kyoko라고 하는 여성 목소리 하나밖에 없었다..
// Android 목소리
{name: ja-JP-language, locale: ja-JP}, // 디폴트 여성
{name: ja-jp-x-jab-local, locale: ja-JP}, // 여자 로컬 ver
{name: ja-jp-x-jab-network, locale: ja-JP}, // 여자 구글 클라우드 ver
{name: ja-jp-x-jad-local, locale: ja-JP}, // 남자 로컬
{name: ja-jp-x-jad-network, locale: ja-JP}, // 남자 클라우드 ver
{name: ja-jp-x-jac-local, locale: ja-JP}, // 조금 더 톤이 높은 남자
{name: ja-jp-x-jac-network, locale: ja-JP},
{name: ja-jp-x-htm-local, locale: ja-JP}, // 이상한 여자 목소리
{name: ja-jp-x-htm-network, locale: ja-JP}
--------------------------------------------------------------
// iOS 목소리
{locale: ja-JP, name: Kyoko}
안드로이드의 경우엔 만약 인터넷이 연결이 가정된 환경이라면 클라우드 버전을 쓰는게 발음이 더 좋다.