cURL、Postman、Java SDK、Python のサンプルを使用して、音声認識および音声合成サービスを呼び出し、結果を取得して、合成された音声を保存します。
前提条件
クイックスタート に従って、必要なサービスをアクティベートし、プロジェクトを作成し、認証情報を準備します。呼び出すサービスに合わせてプロジェクトモデルを設定します。認識の場合は、モデルの言語とサンプルレートを入力音声に一致させます。
認識と合成のサンプルでは、プロジェクトの appkey と NLS トークンを使用します。トークンを取得するには、「SDK を使用したトークンの取得」をご参照ください。Python の音声ファイル文字起こしサンプルでは、AccessKey ペアでリクエストに署名し、NLS トークンは使用しません。可能な限り、権限を付与された RAM ユーザーの AccessKey ペアを使用し、認証情報をハードコードしないでください。
呼び出しには料金が発生する場合があります。課金ルールについては、「課金項目」をご参照ください。
サンプルの選択
|
機能 |
メソッド |
目的 |
|
cURL / Postman |
60秒以内のローカル音声ファイルを認識します。 |
|
|
Java |
音声をチャンクでストリームし、文レベルの結果を受信します。 |
|
|
Python |
音声 URL を使用して非同期タスクを送信し、結果をポーリングします。 |
|
|
Java |
テキストを WAV ファイルに合成します。 |
アクセスパラメーターの設定
ターミナルまたは IDE の実行設定で、以下の環境変数を設定します。コマンドは Bash 構文を使用しています。Windows では、システムまたは IDE で同じ名前の変数を設定します。プレースホルダーを置き換え、IDE のプロセスが変数を読み取れることを確認してください。
export NLS_APP_KEY="<appkey>"
export NLS_TOKEN="<NLS_TOKEN>"
export NLS_HTTP_URL="https://nls-gateway-ap-southeast-1.aliyuncs.com"
export NLS_WS_URL="wss://nls-gateway-ap-southeast-1.aliyuncs.com/ws/v1"
appkey、トークン、エンドポイントは、プロジェクトアカウントとサービスリージョンに一致している必要があります。トークンが期限切れになった場合は、新しいトークンを取得して環境変数を更新してください。
短文音声認識
サンプル音声ファイルをダウンロードします。これを nls-sample-16k.wav として保存し、一致する 16 kHz の英語認識モデルを使用します。また、ご自身の録音を使用することもできます。その場合、録音ファイルは、長さが 60 秒以内、サンプリングレートが 16 kHz、16 ビットサンプル、1 チャンネルで、認識モデルと一致する言語の PCM 形式の WAV ファイルである必要があります。
export NLS_AUDIO_FILE="./nls-sample-16k.wav"
cURL
認識リクエストを送信します。
curl -X POST "${NLS_HTTP_URL}/stream/v1/asr?appkey=${NLS_APP_KEY}&format=wav&sample_rate=16000" \
-H "X-NLS-Token: ${NLS_TOKEN}" \
-H "Content-Type: application/octet-stream" \
--data-binary "@${NLS_AUDIO_FILE}"
Postman
Postman をインストールして POST リクエストを作成します。 上記のアクセスパラメーターを使用して、NLS_HTTP_URL、NLS_APP_KEY、および NLS_TOKEN を Postman の変数として定義します。
|
場所 |
設定 |
|
URL |
|
|
Params |
|
|
Headers |
|
|
Body |
[binary] を選択し、WAV ファイルをアップロードします。 |
成功したレスポンスは次のようになります。 result には認識されたテキストが含まれます:
{
"task_id": "<TASK_ID>",
"result": "weather in beijing",
"status": 20000000,
"message": "SUCCESS"
}
すべてのパラメーターと音声要件については、「短文音声認識の RESTful API」をご参照ください。
リアルタイム音声認識
この Java サンプルは、ローカルの WAV ファイルを PCM ストリームとして読み取り、チャンクで送信します。このサンプルでは SDK 2.2.1 を使用します。Maven プロジェクトに次の依存関係を追加します。
<dependency>
<groupId>com.alibaba.nls</groupId>
<artifactId>nls-sdk-transcriber</artifactId>
<version>2.2.1</version>
</dependency>
サンプル音声ファイルをダウンロードし、NLS_AUDIO_FILE をそのローカルパスに設定します。NLS_APP_KEY、NLS_TOKEN、および NLS_WS_URL を再利用します。このコードは、16 kHz のサンプルレート、16 ビットサンプル、1 チャンネルのローカル PCM 形式 WAV ファイルを使用して、ライブオーディオストリームをシミュレートします。
import com.alibaba.nls.client.protocol.InputFormatEnum;
import com.alibaba.nls.client.protocol.NlsClient;
import com.alibaba.nls.client.protocol.SampleRateEnum;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriber;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriberListener;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriberResponse;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioFormat;
import java.io.File;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
public class RealtimeExample {
private static String env(String name) {
String value = System.getenv(name);
if (value == null || value.isEmpty()) {
throw new IllegalArgumentException(name + " を設定してください");
}
return value;
}
public static void main(String[] args) throws Exception {
String appKey = env("NLS_APP_KEY");
String token = env("NLS_TOKEN");
String url = env("NLS_WS_URL");
String audioFile = env("NLS_AUDIO_FILE");
CountDownLatch done = new CountDownLatch(1);
AtomicReference<String> error = new AtomicReference<>();
SpeechTranscriberListener listener = new SpeechTranscriberListener() {
public void onTranscriberStart(SpeechTranscriberResponse r) {
System.out.println("task_id=" + r.getTaskId());
}
public void onSentenceBegin(SpeechTranscriberResponse r) {}
public void onTranscriptionResultChange(SpeechTranscriberResponse r) {}
public void onSentenceEnd(SpeechTranscriberResponse r) {
System.out.println(r.getTransSentenceText());
}
public void onTranscriptionComplete(SpeechTranscriberResponse r) {
System.out.println(r.getName() + ": " + r.getStatus());
done.countDown();
}
public void onFail(SpeechTranscriberResponse r) {
error.set("task_id=" + r.getTaskId() + ", status="
+ r.getStatus() + ", message=" + r.getStatusText());
done.countDown();
}
};
NlsClient client = new NlsClient(url, token);
SpeechTranscriber transcriber = null;
try (AudioInputStream audio = AudioSystem.getAudioInputStream(new File(audioFile))) {
AudioFormat f = audio.getFormat();
if (!f.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED)
|| f.getSampleRate() != 16000 || f.getSampleSizeInBits() != 16
|| f.getChannels() != 1 || f.isBigEndian()) {
throw new IllegalArgumentException("16 kHz、16ビット、モノラルの PCM WAV ファイルを使用してください");
}
transcriber = new SpeechTranscriber(client, listener);
transcriber.setAppKey(appKey);
transcriber.setFormat(InputFormatEnum.PCM);
transcriber.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
transcriber.setEnablePunctuation(true);
transcriber.start();
byte[] buffer = new byte[3200];
int count;
while ((count = audio.read(buffer)) != -1) {
if (error.get() != null) throw new IllegalStateException(error.get());
transcriber.send(buffer, count);
Thread.sleep(Math.max(1, count / 32));
}
transcriber.stop();
if (!done.await(30, TimeUnit.SECONDS)) {
throw new IllegalStateException("文字起こし完了の待機中にタイムアウトしました");
}
if (error.get() != null) throw new IllegalStateException(error.get());
} finally {
if (transcriber != null) transcriber.close();
client.shutdown();
}
}
}
出力には、認識されたテキストと完了イベントが含まれます。例:
task_id=<TASK_ID>
weather in beijing.
TranscriptionCompleted: 20000000
その他の Java サンプルについては、nls-sdk-java-demo をダウンロードしてください。API の詳細については、「リアルタイム音声認識の API リファレンス」をご参照ください。
音声ファイルの文字起こし
Python を使用して、音声ファイルの文字起こしタスクを送信します。このサービスは、リクエストでファイルの内容を受け取るのではなく、URL から音声を取得します。アクセス可能な音声 URL を準備してください。ファイルは 512 MB を超えてはなりません。フォーマットと長さの要件については、「音声ファイルの文字起こし API リファレンス」をご参照ください。
依存関係をインストールします。この例では、aliyun-python-sdk-core 2.15.1 を使用します。
python3 -m pip install aliyun-python-sdk-core
以下の設定では、サンプル音声ファイルを使用します。上記で設定した NLS_APP_KEY を再利用します。
export ALIYUN_AK_ID="<ACCESS_KEY_ID>"
export ALIYUN_AK_SECRET="<ACCESS_KEY_SECRET>"
export NLS_FILE_URL="https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/en-US/20230426/vsxg/nls-sample-16k-en.wav"
独自の録音を使用するには、OSS にアップロードし、NLS_FILE_URL を置き換えます。 プライベートオブジェクトについては、「署名付き URL を使用してファイルをダウンロードまたはプレビューする」をご参照ください。 サービスがオーディオを取得している間、URL が有効なままであることを確認してください。
export NLS_REGION_ID="ap-southeast-1"
export NLS_FILETRANS_DOMAIN="filetrans.ap-southeast-1.aliyuncs.com"
export NLS_FILETRANS_API_VERSION="2019-08-23"
import json
import os
import time
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
def main():
client = AcsClient(os.environ["ALIYUN_AK_ID"],
os.environ["ALIYUN_AK_SECRET"],
os.environ["NLS_REGION_ID"])
def call(action, method, params):
request = CommonRequest()
request.set_domain(os.environ["NLS_FILETRANS_DOMAIN"])
request.set_version(os.environ["NLS_FILETRANS_API_VERSION"])
request.set_product("nls-filetrans")
request.set_protocol_type("https")
request.set_accept_format("json")
request.set_action_name(action)
request.set_method(method)
for key, value in params.items():
if method == "POST":
request.add_body_params(key, value)
else:
request.add_query_param(key, value)
return json.loads(client.do_action_with_exception(request))
task = {"appkey": os.environ["NLS_APP_KEY"],
"file_link": os.environ["NLS_FILE_URL"],
"version": "4.0", "enable_words": False}
result = call("SubmitTask", "POST", {"Task": json.dumps(task)})
if result.get("StatusText") != "SUCCESS" or not result.get("TaskId"):
raise RuntimeError(result)
task_id = result["TaskId"]
print("TaskId:", task_id)
for _ in range(60):
result = call("GetTaskResult", "GET", {"TaskId": task_id})
status = result.get("StatusText")
if status == "SUCCESS":
print(json.dumps(result.get("Result"), ensure_ascii=False, indent=2))
return
if status == "SUCCESS_WITH_NO_VALID_FRAGMENT":
print("有効な音声フラグメントは認識されませんでした。")
return
if status not in ("RUNNING", "QUEUEING"):
raise RuntimeError(result)
time.sleep(10)
raise TimeoutError("タスクはまだ実行中です。後で TaskId を使用して照会してください: " + task_id)
if __name__ == "__main__":
main()
このプログラムはタスクを送信し、文字起こしが完了するのを待ちます。出力例:
TaskId: <TASK_ID>
{
"Sentences": [
{
"EndTime": 1300,
"SilenceDuration": 0,
"SpeakerId": "1",
"BeginTime": 0,
"Text": "weather in beijing. ",
"ChannelId": 0,
"SpeechRate": 138,
"EmotionValue": 7.1
}
]
}
音声合成
Java SDK を使用して、テキストを 16 kHz の WAV ファイルに合成します。このサンプルでは SDK 2.2.1 を使用します。Maven プロジェクトに次の依存関係を追加します。
<dependency>
<groupId>com.alibaba.nls</groupId>
<artifactId>nls-sdk-tts</artifactId>
<version>2.2.1</version>
</dependency>
NLS_APP_KEY、NLS_TOKEN、および NLS_WS_URLを再利用し、音声とテキストを設定します:
export NLS_VOICE="abby"
export NLS_TEXT="Hello. The weather is nice today."
import com.alibaba.nls.client.protocol.NlsClient;
import com.alibaba.nls.client.protocol.OutputFormatEnum;
import com.alibaba.nls.client.protocol.SampleRateEnum;
import com.alibaba.nls.client.protocol.tts.SpeechSynthesizer;
import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerListener;
import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
public class SynthesisExample {
private static String env(String name) {
String value = System.getenv(name);
if (value == null || value.isEmpty()) throw new IllegalArgumentException(name + " を設定してください");
return value;
}
public static void main(String[] args) throws Exception {
String appKey = env("NLS_APP_KEY");
String token = env("NLS_TOKEN");
String url = env("NLS_WS_URL");
String voice = env("NLS_VOICE");
String text = env("NLS_TEXT");
CountDownLatch done = new CountDownLatch(1);
AtomicReference<String> error = new AtomicReference<>();
NlsClient client = new NlsClient(url, token);
SpeechSynthesizer synthesizer = null;
try (FileOutputStream output = new FileOutputStream("speech.wav")) {
SpeechSynthesizerListener listener = new SpeechSynthesizerListener() {
public void onMessage(ByteBuffer message) {
byte[] bytes = new byte[message.remaining()];
message.get(bytes);
try { output.write(bytes); }
catch (IOException e) { error.set(e.getMessage()); done.countDown(); }
}
public void onComplete(SpeechSynthesizerResponse r) {
System.out.println(r.getName() + ": " + r.getStatus());
done.countDown();
}
public void onFail(SpeechSynthesizerResponse r) {
error.set("task_id=" + r.getTaskId() + ", status="
+ r.getStatus() + ", message=" + r.getStatusText());
done.countDown();
}
public void onMetaInfo(SpeechSynthesizerResponse r) {}
};
synthesizer = new SpeechSynthesizer(client, listener);
synthesizer.setAppKey(appKey);
synthesizer.setFormat(OutputFormatEnum.WAV);
synthesizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
synthesizer.setVoice(voice);
synthesizer.setText(text);
synthesizer.start();
if (!done.await(60, TimeUnit.SECONDS)) {
throw new IllegalStateException("合成完了の待機中にタイムアウトしました");
}
if (error.get() != null) throw new IllegalStateException(error.get());
System.out.println("音声が speech.wav に保存されました");
} finally {
if (synthesizer != null) synthesizer.close();
client.shutdown();
}
}
}
合成に成功したら、保存された speech.wav ファイルを再生します。出力は次のとおりです。
SynthesisCompleted: 20000000
音声が speech.wav に保存されました
その他の Java サンプルについては、nls-sdk-java-demo をダウンロードしてください。その他のボイス、言語、パラメーターについては、「音声合成 API リファレンス」をご参照ください。