20.5 음성 합성(바 이 두 2016 년 2 월 29 일 발표 한 tts 엔진)
모 바 일 앱 을 작성 할 때 는 운전 중 받 은 문자 읽 기,내 비게 이 션 음성 알림,인터페이스 에서 중요 한 정 보 를 음성 으로 강조 하 는 등 문자 음성 변환(Text to Speech)기능 을 사용 해 야 할 때 도 있 습 니 다.
Android 가 자체 적 으로 가지 고 있 는 Pico TTS 는 중국 어 를 지원 하지 않 기 때문에 중국어 텍스트 도 읽 을 수 있 고 영어 텍스트 도 읽 을 수 있 으 려 면 제3자 가 제공 하 는 중국어 할 수 있 는 음성 패 키 지 를 다운로드 해 야 합 니 다.
2.바 이 두 tts 권한 수여 신청
이 절 은 바 이 두 가 2016 년 2 월 29 일 발표 한'오프라인 융합 음성 합성 SDKAndroid 2.2.3 버 전 은 C\#로 음성 합성 을 실현 하 는 기본 적 인 용법 을 설명 합 니 다.바 이 두 음성 합성 을 선택 한 것 은 바 이 두 홈 페이지 에 따 르 면 이 개발 가방 은'영구 무료'라 고 밝 혔 기 때문이다.사이트 주 소 는 다음 과 같 습 니 다.
http://yuyin.baidu.com/tts/
원래 MyDemos 의 권한 수 여 를 신 청 했 기 때문에 tts 권한 수 여 를 계속 신청 하면 비교적 간단 합 니 다.신청 과 설정 절 차 는 다음 과 같 습 니 다.
1.권한 수여 신청
들어가다http://yuyin.baidu.com/tts/ 의 첫 페이지:
【즉시 사용】을 클릭 하여"음성 합성 서비스 개통"페이지 에 들 어 갑 니 다:
드 롭 다운 상자 에서 원래 신청 한 애플 리 케 이 션 을 선택 하고[다음 단계]를 클릭 한 다음 알림 에 따라 오프라인 서 비 스 를 개통 하면 됩 니 다.
2.BdMapV 371 bingLib 프로젝트 에서 JAR 파일 변환
먼저 통과 하 다http://yuyin.baidu.com/tts/ 첫 페이지 에 있 는[관련 다운로드]는 해당 하 는 개발 패 키 지 를 다운로드 한 후 다음 절 차 를 따라 조작 합 니 다.
1.예시 중의 com.baidu.tts2.2.3.20160229_359d952_release.jar,galaxy-v 2.0.jar 를 Jars 폴 더 에 추가 합 니 다.다음 그림 에서 보 듯 이[생 성 작업]속성 을 모두"EmbeddedJar"로 설정 합 니 다.
2.Metadata.xml 파일 에 다음 문 구 를 추가 합 니 다.
<remove-node path="/api/package[@name='com.baidu.tts.aop']/interface[@name='IProxyFactory']/method[@name='createProxied' and count(parameter)=0]" />
3.항목 을 다시 생 성 하 는 데 오류 가 없 을 것 입 니 다.이 세 단 계 를 거 쳐 tts 의 Jar 패키지 가 져 오기 와.cs 파일 로 변환 하 는 과정 을 마 쳤 습 니 다.
3.MyDemos 프로젝트 에.so 파일 추가
tts 와 관련 된 4 개의.so 파일 을 MyDemos 프로젝트 의 x86 폴 더 에 추가 합 니 다.다음 그림 과 같이[생 성 작업]속성 을 모두"AndroidNative Library"로 설정 합 니 다.
4..dat 파일 을 sd 카드 의 BaiduTTS 폴 더 에 추가 합 니 다.
구체 적 인 추가 방법 은[흔히 볼 수 있 는 문제 풀이]를 참조 하고 여 기 는 더 이상 캡 처 하지 않 습 니 다.
이 파일 들 을 Assets 폴 더 에 추가 한 다음 코드 를 통 해 sd 카드 폴 더 에 복사 할 수도 있 습 니 다.간소화 하기 위해 서 이곳 은 수공 으로 직접 복사 되 었 다.
OK,위의 4 단 계 를 거 쳐 MyDemos 프로젝트 의 모든 모듈 에서 바 이 두 tts 를 쉽게 이용 하여 음성 읽 기 기능 을 실현 할 수 있 습 니 다.
예시
1.캡 처 실행
[읽 기]를 누 르 면 텍스트 상자 의 내용 을 자동 으로 여성 음 으로 읽 고[대량 읽 기]를 누 르 면 대기 열 에 추 가 된 텍스트 세그먼트(주로 다양한 중 영문 단문 을 읽 는 것 을 보 여주 기 위해 서 입 니 다)를 순서대로 읽 습 니 다.
2.설계 절차
(1)ch2005 Main.xml 추가
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:weightSum="4">
<Button
android:id="@+id/speak"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:lines="2"
android:text=" "
android:textSize="12dp" />
<Button
android:id="@+id/pause"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:lines="2"
android:text=" "
android:textSize="12dp" />
<Button
android:id="@+id/resume"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:lines="2"
android:text=" "
android:textSize="12dp" />
<Button
android:id="@+id/stop"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:lines="2"
android:text=" "
android:textSize="12dp" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:weightSum="4">
<Button
android:id="@+id/synthesize"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:lines="2"
android:text="synthesize"
android:textSize="12dp" />
<Button
android:id="@+id/play"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:lines="2"
android:text="play"
android:textSize="12dp" />
<Button
android:id="@+id/batchSpeak"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:lines="2"
android:text=" "
android:textSize="12dp" />
<Button
android:id="@+id/nextActivity"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:lines="2"
android:enabled="false"
android:text=" "
android:textSize="12dp" />
</LinearLayout>
<EditText
android:id="@+id/input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="input" />
<TextView
android:id="@+id/showText"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="10dp"
android:background="@android:color/darker_gray"
android:minLines="3"
android:scrollbars="vertical" />
</LinearLayout>
2、ch2005 MainActivity.cs 추가
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.OS;
using Android.Widget;
using Com.Baidu.Tts.Client;
using Com.Baidu.Tts.Answer.Auth;
namespace MyDemos.SrcDemos
{
[Activity(Label = "【 20-5】 tts ")]
public class ch2005MainActivity : Activity, ISpeechSynthesizerListener
{
private EditText mInput;
private TextView mShowText;
private SpeechSynthesizer mSpeechSynthesizer;
/// <summary>
/// sd tts
/// </summary>
private string mSampleDirPath;
private const string SpeechFemaleModelName = "bd_etts_speech_female.dat";
private const string SpeechMaleModelName = "bd_etts_speech_male.dat";
private const string TextModelName = "bd_etts_text.dat";
private const string EnglishSpeechFemaleModelName = "bd_etts_speech_female_en.dat";
private const string EnglishSpeechMaleModelName = "bd_etts_speech_male_en.dat";
private const string EnglishTextModelName = "bd_etts_text_en.dat";
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch2005Main);
mSampleDirPath = Android.OS.Environment.ExternalStorageDirectory.Path + "/baiduTTS";
Console.WriteLine("mSampleDirPath=" + mSampleDirPath);
initialView();
initialTts();
}
private void initialTts()
{
mSpeechSynthesizer = SpeechSynthesizer.Instance;
mSpeechSynthesizer.SetContext(this);
mSpeechSynthesizer.SetSpeechSynthesizerListener(this);
// ( )
mSpeechSynthesizer.SetParam(SpeechSynthesizer.ParamTtsTextModelFile,
mSampleDirPath + "/" + TextModelName);
// ( )
mSpeechSynthesizer.SetParam(SpeechSynthesizer.ParamTtsSpeechModelFile,
mSampleDirPath + "/" + SpeechFemaleModelName);
// App ID ( )
//mSpeechSynthesizer.SetAppId("your_app_id");
mSpeechSynthesizer.SetAppId(ch.TtsAppID);
// apikey secretkey ( )
//this.mSpeechSynthesizer.SetApiKey("your_api_key", "your_secret_key");
this.mSpeechSynthesizer.SetApiKey(ch.TtsApiKey, ch.TtsSecretKey);
// ( ), 0,1,2,3。。。( , , 。0-- ,1-- ,2-- ,3-- 。。。)
mSpeechSynthesizer.SetParam(SpeechSynthesizer.ParamSpeaker, "0");
// Mix
mSpeechSynthesizer.SetParam(SpeechSynthesizer.ParamMixMode, SpeechSynthesizer.MixModeDefault);
// ( , )
AuthInfo authInfo = this.mSpeechSynthesizer.Auth(TtsMode.Mix);
if (authInfo.IsSuccess)
{
Console.WriteLine(" -- (auth success)。");
}
else
{
string errorMsg = authInfo.TtsError.DetailMessage;
Console.WriteLine(" -- (auth failed),errorMsg=" + errorMsg);
}
// tts
mSpeechSynthesizer.InitTts(TtsMode.Mix);
// ( )
int result = mSpeechSynthesizer.LoadEnglishModel(
mSampleDirPath +
"/" + EnglishTextModelName, mSampleDirPath +
"/" + EnglishSpeechFemaleModelName);
}
private void initialView()
{
mInput = FindViewById<EditText>(Resource.Id.input);
mInput.Text = " , !";
mShowText = FindViewById<TextView>(Resource.Id.showText);
var speak = FindViewById<Button>(Resource.Id.speak);
speak.Click += delegate
{
string text = this.mInput.Text;
int result = this.mSpeechSynthesizer.Speak(text);
if (result < 0)
{
System.Diagnostics.Debug.WriteLine(" , :{0}, tts 。", result);
}
};
var pause = FindViewById<Button>(Resource.Id.pause);
pause.Click += delegate
{
mSpeechSynthesizer.Pause();
};
var resume = FindViewById<Button>(Resource.Id.resume);
resume.Click += delegate
{
mSpeechSynthesizer.Resume();
};
var stop = FindViewById<Button>(Resource.Id.stop);
stop.Click += delegate
{
mSpeechSynthesizer.Stop();
};
var synthesize = FindViewById<Button>(Resource.Id.synthesize);
synthesize.Click += delegate
{
string text = this.mInput.Text;
int result = this.mSpeechSynthesizer.Synthesize(text);
if (result < 0)
{
System.Diagnostics.Debug.WriteLine("error,please look up error code in doc or URL:http://yuyin.baidu.com/docs/tts/122 ");
}
};
var play = FindViewById<Button>(Resource.Id.play);
play.Click += delegate { };
var batchSpeak = FindViewById<Button>(Resource.Id.batchSpeak);
batchSpeak.Click += delegate
{
List<SpeechSynthesizeBag> bags = new List<SpeechSynthesizeBag>();
bags.Add(GetSpeechSynthesizeBag("123456", "0"));
bags.Add(GetSpeechSynthesizeBag(" ", "1"));
bags.Add(GetSpeechSynthesizeBag(" SDK", "2"));
bags.Add(GetSpeechSynthesizeBag("hello", "3"));
bags.Add(GetSpeechSynthesizeBag(" demo ", "4"));
int result = this.mSpeechSynthesizer.BatchSpeak(bags);
if (result < 0)
{
System.Diagnostics.Debug.WriteLine("error({0}),please look up error code in doc or URL:http://yuyin.baidu.com/docs/tts/122 ", result);
}
};
}
protected override void OnDestroy()
{
base.OnDestroy();
}
private SpeechSynthesizeBag GetSpeechSynthesizeBag(string text, string utteranceId)
{
SpeechSynthesizeBag speechSynthesizeBag = new SpeechSynthesizeBag();
speechSynthesizeBag.SetText(text);
speechSynthesizeBag.UtteranceId = utteranceId;
return speechSynthesizeBag;
}
public void OnError(string utteranceId, SpeechError error)
{
Console.WriteLine("onError error=" + error.Description + "--utteranceId=" + utteranceId);
}
public void OnSpeechFinish(string utteranceId)
{
Console.WriteLine("onSpeechFinish utteranceId=" + utteranceId);
}
public void OnSpeechProgressChanged(string p0, int p1)
{
//Console.WriteLine("onSpeechProgressChanged");
}
public void OnSpeechStart(string utteranceId)
{
Console.WriteLine("onSpeechStart utteranceId=" + utteranceId);
}
public void OnSynthesizeDataArrived(string utteranceId, byte[] data, int progress)
{
Console.WriteLine("onSynthesizeDataArrived");
}
public void OnSynthesizeFinish(string utteranceId)
{
Console.WriteLine("onSpeechFinish utteranceId=" + utteranceId);
}
public void OnSynthesizeStart(string utteranceId)
{
Console.WriteLine("onSynthesizeStart utteranceId=" + utteranceId);
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
cURL POST를 통해 말하기 속도(SSML) 조정질문에 답해보시면 이해하실 겁니다 :) 몇 주 전에 StackOverflow에서 이 질문을 보았습니다. How to adjust the speaking rate in Watson Text-to-Speech using...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.