Este tópico descreve os parâmetros e as interfaces do Python SDK para o modelo de reconhecimento de fala em tempo real Qwen-Audio-3.0-ASR-Flash-Streaming/Fun-ASR-Realtime.
ImportanteO Alibaba Cloud Model Studio lançou domínios específicos por workspace para as regiões China (Beijing) e Singapore. Os novos domínios dedicados oferecem desempenho superior e maior estabilidade para solicitações de inferência. Recomendamos migrar para os novos domínios:
- China (Beijing): de
dashscope.aliyuncs.compara{WorkspaceId}.cn-beijing.maas.aliyuncs.com - Singapore: de
dashscope-intl.aliyuncs.compara{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com
Substitua {WorkspaceId} pelo seu Workspace ID real. Os domínios existentes permanecem totalmente funcionais.
Guia do usuário: Para descrições dos modelos e orientações de seleção, consulte Speech-to-text.
Pré-requisitos
Ative o service e Obtain an API key. Para evitar riscos de segurança causados por vazamento de código, Configure API key as an environment variable em vez de codificá-la diretamente no código.
Início rápido
A Recognition class fornece interfaces para chamadas sem streaming e com streaming bidirecional. Escolha o método de chamada adequado às suas necessidades:
- Chamada sem streaming: reconhece um arquivo local e retorna o resultado completo em uma única resposta. Ideal para processar áudio pré-gravado.
- Chamada com streaming bidirecional: reconhece um fluxo de áudio diretamente e gera resultados em tempo real. O fluxo pode vir de um dispositivo externo, como microfone, ou ser lido de um arquivo local. Recomendado para cenários que exigem feedback imediato.
Chamada sem streaming
Envie uma única tarefa de reconhecimento de fala em tempo real e obtenha o resultado sincronamente ao passar um arquivo local.
Instancie a Recognition class, vincule os Request parameters e chame call para executar o reconhecimento ou tradução e obter o Recognition result (RecognitionResult) final.
Visualize o exemplo completo
from http import HTTPStatus
import dashscope
from dashscope.audio.asr import Recognition
import os
# The API Key differs between the Singapore and Beijing regions. Get an API Key: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# If you have not configured the environment variable, replace the following line with your Model Studio API Key: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# The following is the configuration for the Singapore region. When calling, replace "{WorkspaceId}" with your actual workspace ID. The configuration differs by region.
dashscope.base_websocket_api_url='wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inference'
recognition = Recognition(model='qwen-audio-3.0-asr-flash-streaming',
format='wav',
sample_rate=16000,
callback=None)
result = recognition.call('{YOUR_AUDIO_FILE}')
if result.status_code == HTTPStatus.OK:
print('Recognition result:')
print(result.get_sentence())
else:
print('Error: ', result.message)
print(
'[Metric] requestId: {}, first package delay ms: {}, last package delay ms: {}'
.format(
recognition.get_last_request_id(),
recognition.get_first_package_delay(),
recognition.get_last_package_delay(),
))
Chamada com streaming bidirecional
Envie uma única tarefa de reconhecimento de fala em tempo real e transmita os resultados continuamente implementando a interface de callback.
-
Inicie o reconhecimento de fala em streaming.
Instancie a Recognition class, vincule os Request parameters e a Callback interface (RecognitionCallback) e chame o método
startpara iniciar o reconhecimento de fala em streaming. -
Transmita o áudio.
Chame o método
send_audio_frameda Recognition class em loop para enviar o fluxo de áudio binário ao servidor em segmentos. O fluxo é lido de um arquivo local ou de um dispositivo, como microfone.Durante o envio do áudio, o servidor retorna resultados de reconhecimento ao cliente em tempo real por meio do método
on_eventda Callback interface (RecognitionCallback).Envie cerca de 100 ms de áudio por quadro e mantenha cada quadro entre 1 KB e 16 KB.
-
Encerre a tarefa.
Chame o método
stopda Recognition class para encerrar o reconhecimento de fala.Esse método bloqueia a thread atual até que o callback
on_completeouon_errorda Callback interface (RecognitionCallback) seja acionado.
Visualize o exemplo completo
import os
import signal # for keyboard events handling (press "Ctrl+C" to terminate recording)
import sys
import dashscope
import pyaudio
from dashscope.audio.asr import *
mic = None
stream = None
# Set recording parameters
sample_rate = 16000 # sampling rate (Hz)
channels = 1 # mono channel
dtype = 'int16' # data type
format_pcm = 'pcm' # the format of the audio data
block_size = 3200 # number of frames per buffer
# Real-time speech recognition callback
class Callback(RecognitionCallback):
def on_open(self) -> None:
global mic
global stream
print('RecognitionCallback open.')
mic = pyaudio.PyAudio()
stream = mic.open(format=pyaudio.paInt16,
channels=1,
rate=16000,
input=True)
def on_close(self) -> None:
global mic
global stream
print('RecognitionCallback close.')
stream.stop_stream()
stream.close()
mic.terminate()
stream = None
mic = None
def on_complete(self) -> None:
print('RecognitionCallback completed.') # recognition completed
def on_error(self, message) -> None:
print('RecognitionCallback task_id: ', message.request_id)
print('RecognitionCallback error: ', message.message)
# Stop and close the audio stream if it is running
if 'stream' in globals() and stream.active:
stream.stop()
stream.close()
# Forcefully exit the program
sys.exit(1)
def on_event(self, result: RecognitionResult) -> None:
sentence = result.get_sentence()
if 'text' in sentence:
print('RecognitionCallback text: ', sentence['text'])
if RecognitionResult.is_sentence_end(sentence):
print(
'RecognitionCallback sentence end, request_id:%s, usage:%s'
% (result.get_request_id(), result.get_usage(sentence)))
def signal_handler(sig, frame):
print('Ctrl+C pressed, stop recognition ...')
# Stop recognition
recognition.stop()
print('Recognition stopped.')
print(
'[Metric] requestId: {}, first package delay ms: {}, last package delay ms: {}'
.format(
recognition.get_last_request_id(),
recognition.get_first_package_delay(),
recognition.get_last_package_delay(),
))
# Forcefully exit the program
sys.exit(0)
# main function
if __name__ == '__main__':
# The API Key differs between the Singapore and Beijing regions. Get an API Key: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# If you have not configured the environment variable, replace the following line with your Model Studio API Key: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# The following is the configuration for the Singapore region. When calling, replace "{WorkspaceId}" with your actual workspace ID. The configuration differs by region.
dashscope.base_websocket_api_url='wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inference'
# Create the recognition callback
callback = Callback()
# Call recognition service by async mode, you can customize the recognition parameters, like model, format,
# sample_rate
recognition = Recognition(
model='qwen-audio-3.0-asr-flash-streaming',
format=format_pcm,
# 'pcm'、'wav'、'opus'、'speex'、'aac'、'amr', you can check the supported formats in the document
sample_rate=sample_rate,
# support 8000, 16000
semantic_punctuation_enabled=False,
callback=callback)
# Start recognition
recognition.start()
signal.signal(signal.SIGINT, signal_handler)
print("Press 'Ctrl+C' to stop recording and recognition...")
# Create a keyboard listener until "Ctrl+C" is pressed
while True:
if stream:
data = stream.read(3200, exception_on_overflow=False)
recognition.send_audio_frame(data)
else:
break
recognition.stop()
import os
import time
import dashscope
from dashscope.audio.asr import *
# The API Key differs between the Singapore and Beijing regions. Get an API Key: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# If you have not configured the environment variable, replace the following line with your Model Studio API Key: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# The following is the configuration for the Singapore region. When calling, replace "{WorkspaceId}" with your actual workspace ID. The configuration differs by region.
dashscope.base_websocket_api_url='wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inference'
from datetime import datetime
def get_timestamp():
now = datetime.now()
formatted_timestamp = now.strftime("[%Y-%m-%d %H:%M:%S.%f]")
return formatted_timestamp
class Callback(RecognitionCallback):
def on_complete(self) -> None:
print(get_timestamp() + ' Recognition completed') # recognition complete
def on_error(self, result: RecognitionResult) -> None:
print('Recognition task_id: ', result.request_id)
print('Recognition error: ', result.message)
exit(0)
def on_event(self, result: RecognitionResult) -> None:
sentence = result.get_sentence()
if 'text' in sentence:
print(get_timestamp() + ' RecognitionCallback text: ', sentence['text'])
if RecognitionResult.is_sentence_end(sentence):
print(get_timestamp() +
'RecognitionCallback sentence end, request_id:%s, usage:%s'
% (result.get_request_id(), result.get_usage(sentence)))
callback = Callback()
recognition = Recognition(model='qwen-audio-3.0-asr-flash-streaming',
format='wav',
sample_rate=16000,
callback=callback)
try:
audio_data: bytes = None
f = open("{YOUR_AUDIO_FILE}", 'rb')
if os.path.getsize("{YOUR_AUDIO_FILE}"):
# Read all the file data into the buffer at once
file_buffer = f.read()
f.close()
print("Start Recognition")
recognition.start()
# Send 3200 bytes from the buffer at a time
buffer_size = len(file_buffer)
offset = 0
chunk_size = 3200
while offset < buffer_size:
# Calculate the size of the data chunk to send this time
remaining_bytes = buffer_size - offset
current_chunk_size = min(chunk_size, remaining_bytes)
# Extract the current data chunk from the buffer
audio_data = file_buffer[offset:offset + current_chunk_size]
# Send the audio data frame
recognition.send_audio_frame(audio_data)
# Update the offset
offset += current_chunk_size
# Add a delay to simulate real-time transmission
time.sleep(0.1)
recognition.stop()
else:
raise Exception(
'The supplied file was empty (zero bytes long)')
except Exception as e:
raise e
print(
'[Metric] requestId: {}, first package delay ms: {}, last package delay ms: {}'
.format(
recognition.get_last_request_id(),
recognition.get_first_package_delay(),
recognition.get_last_package_delay(),
))
Parâmetros da solicitação
Defina os parâmetros da solicitação por meio do construtor (init) da Recognition class.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
model | str | Sim | Nome do modelo. Há suporte para as séries Qwen-Audio-3.0-ASR-Flash-Streaming e Fun-ASR-Realtime. Para mais detalhes, consulte Supported models and regions. |
sample_rate | int | Sim | Taxa de amostragem, em Hz. Valores válidos: modelos de 8 kHz aceitam apenas 8000 Hz; outros modelos aceitam qualquer taxa de amostragem. |
format | str | Sim | Formato do áudio. Valores válidos:
Importanteopus/speex: devem usar encapsulamento Ogg. wav: deve usar codificação PCM. amr: apenas o tipo AMR-NB é aceito. |
vocabulary_id | str | Não | ID de uma lista de palavras-chave pré-compilada. Gere esse ID antecipadamente chamando a API de criação de lista de palavras-chave. Passe o ID durante o reconhecimento para usar as palavras-chave da lista. Indicado para cenários em que o vocabulário é conhecido e relativamente estável e quando você precisa reutilizar a mesma lista de palavras entre solicitações. Para detalhes de uso, consulte Precompiled hotwords. |
vocabulary | dict | Não | Palavras-chave instantâneas. Passadas como pares chave-valor, em que a chave é o texto da palavra-chave ( Adequado para otimização temporária de palavras-chave no nível da sessão. Quando configurado junto com palavras-chave pré-compiladas, apenas as palavras-chave instantâneas têm efeito. Para detalhes de uso, consulte Instant hotwords. ImportanteApenas Exemplo: |
semantic_punctuation_enabled | bool | Não | Define se a segmentação semântica deve ser ativada. Padrão: False.
A segmentação semântica é mais precisa e adequada para transcrição de reuniões. A segmentação VAD (Detecção de Atividade de Voz) tem menor latência e é ideal para cenários interativos. |
max_sentence_silence | int | Não | Limiar de silêncio VAD para segmentação, em ms. Quando o silêncio após um segmento de fala excede esse limiar, o sistema determina que a frase terminou. Quando Valor padrão: 1300. Valores válidos: [200, 6000]. |
multi_threshold_mode_enabled | bool | Não | ImportanteTem efeito apenas quando Define se o modo de múltiplos limiares deve ser ativado. Quando ativado, impede que a segmentação VAD produza segmentos excessivamente longos. Padrão: False. |
punctuation_prediction_enabled | bool | Não | Define se a pontuação deve ser adicionada automaticamente aos resultados de reconhecimento:
|
heartbeat | bool | Não | Define se os pacotes de heartbeat devem ser ativados. Padrão: False.
Áudio silencioso refere-se a conteúdo em um arquivo de áudio ou fluxo de dados que não contém sinal sonoro. Você pode gerar áudio silencioso de várias formas, como usando software de edição de áudio como Audacity ou Adobe Audition, ou ferramentas de linha de comando como FFmpeg. Este campo requer a versão 1.23.1 ou posterior do SDK. |
language_hints | list[str] | Não | Idioma do áudio a ser reconhecido. Não há valor padrão; se não definido, o modelo detecta o idioma automaticamente. Para a série de modelos Qwen-Audio-3.0-ASR-Flash-Streaming, você pode definir até 4 valores; se definir mais de 4, apenas os primeiros 4 terão efeito. Para a série de modelos Fun-ASR-Realtime, você pode definir apenas 1 valor; se definir vários, apenas o primeiro terá efeito. Clique em para visualizar os códigos de idioma aceitos
|
speech_noise_threshold | float | Não | Limiar para distinguir fala de ruído, usado para ajustar a sensibilidade da Detecção de Atividade de Voz (VAD). Valores válidos: [-1.0, 1.0]. Descrições dos valores:
Este é um parâmetro de configuração avançada. Ajustá-lo pode afetar significativamente os resultados de reconhecimento. Recomendações:
|
special_word_filter | str | Não | Especifica as palavras sensíveis a serem processadas durante o reconhecimento de fala e permite definir diferentes métodos de processamento para cada uma. Para detalhes, consulte Sensitive word filtering. |
callback | RecognitionCallback | Não |
Passe os seguintes parâmetros como argumentos nomeados para o método call ou start da instância Recognition.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
raw_input | dict | Não | Objeto de entrada usado para passar o contexto da conversa. O aprimoramento de contexto melhora a precisão do reconhecimento para termos específicos de domínio. Para uso, consulte Quick start. ImportanteOs modelos O dict deve incluir uma chave
ImportanteLimites: mensagens de contexto dos tipos ImportanteAo passar o contexto, as mensagens em ObservaçãoEste campo requer a versão 1.25.23 ou posterior do SDK. Passe |
Interfaces principais
Classe Recognition
Importe Recognition com "from dashscope.audio.asr import *".
| Método membro | Assinatura do método | Descrição |
|---|---|---|
call | | Chamada sem streaming baseada em arquivo local. Este método bloqueia a thread atual até que todo o áudio seja lido e requer permissão de leitura no arquivo. O resultado do reconhecimento é retornado como um objeto |
start | | Inicia o reconhecimento de fala. Reconhecimento em tempo real via streaming baseado em callback. Este método não bloqueia a thread atual. Use-o juntamente com |
send_audio_frame | | Envia áudio. Mantenha cada quadro de áudio enviado nem muito grande nem muito pequeno: cerca de 100 ms por quadro, entre 1 KB e 16 KB. Os resultados de reconhecimento são obtidos através do método on_event da Callback interface (RecognitionCallback). |
stop | | Interrompe o reconhecimento de fala. Bloqueia até que o servidor termine de reconhecer todo o áudio recebido e então encerra a tarefa. |
get_last_request_id | | Obtém o request_id. Disponível após a chamada do construtor (criação do objeto). |
get_first_package_delay | | Obtém o atraso do primeiro pacote: a latência desde o envio do primeiro pacote de áudio até o recebimento do primeiro resultado de reconhecimento. Use após a conclusão da tarefa. |
get_last_package_delay | | Obtém o atraso do último pacote: o tempo desde o envio do comando |
get_response | | Obtém a última mensagem. Use para recuperar um erro de falha na tarefa. |
Interface de callback (RecognitionCallback)
Durante uma Bidirectional streaming call, o servidor retorna informações-chave de processo e dados ao cliente por meio de callbacks. Implemente os métodos de callback para lidar com as informações e dados retornados pelo servidor.
Visualize o exemplo
class Callback(RecognitionCallback):
def on_open(self) -> None:
print('Connection established')
def on_event(self, result: RecognitionResult) -> None:
# Implement the logic to receive recognition results
pass
def on_complete(self) -> None:
print('Task completed')
def on_error(self, result: RecognitionResult) -> None:
print('An error occurred:', result)
def on_close(self) -> None:
print('Connection closed')
callback = Callback()
| Método | Parâmetro | Valor de retorno | Descrição |
|---|---|---|---|
| None | None | Chamado imediatamente após o estabelecimento da conexão com o servidor. |
| None | Chamado quando o servidor envia uma resposta. | |
| None | None | Chamado após o retorno de todos os resultados de reconhecimento. |
| None | Chamado quando ocorre um erro. | |
| None | None | Chamado após o servidor fechar a conexão. |
Resposta
Resultado de reconhecimento (RecognitionResult)
RecognitionResult representa o resultado de um único reconhecimento em tempo real em uma Bidirectional streaming call ou o resultado de uma Non-streaming call.
| Método membro | Assinatura do método | Descrição |
|---|---|---|
get_sentence | | Obtém a frase reconhecida atual e suas informações de timestamp. Um callback retorna uma única frase, portanto este método retorna Dict[str, Any]. Para detalhes, consulte Sentence (Sentence). |
get_request_id | | Obtém o request_id da solicitação. |
is_sentence_end | | Determina se a frase fornecida terminou. Este método verifica se o campo |
Informações da frase (Sentence)
Os membros da classe Sentence são os seguintes:
Parâmetro | Tipo | Descrição |
|---|---|---|
begin_time | int | Tempo de início da frase, em ms. |
end_time | int | Tempo de término da frase, em ms. |
text | str | Texto reconhecido. |
words | Uma lista de Word-level timestamp information (Word) | Informações de timestamp no nível da palavra. |
Informações de timestamp no nível da palavra (Word)
Os membros da classe Word são os seguintes:
Parâmetro | Tipo | Descrição |
|---|---|---|
begin_time | int | Tempo de início da palavra, em ms. |
end_time | int | Tempo de término da palavra, em ms. |
text | str | A palavra. |
punctuation | str | A pontuação. |
Códigos de erro
Se encontrar erros, consulte Error codes para solução de problemas.
Se o problema persistir, junte-se à comunidade de desenvolvedores para relatar seu problema e forneça o Request ID para investigação adicional.
FAQ
Recursos
P: Como mantenho a conexão ativa durante longos períodos de silêncio?
Defina o parâmetro de solicitação heartbeat como true e continue enviando áudio silencioso para o servidor.
Áudio silencioso é o conteúdo em um arquivo de áudio ou fluxo que não contém sinal sonoro. Você pode gerar áudio silencioso de várias maneiras, como usando software de edição de áudio como Audacity ou Adobe Audition, ou ferramentas de linha de comando como FFmpeg.
P: Como converto áudio para um formato aceito?
Use o FFmpeg. Para mais usos, consulte o site oficial do FFmpeg.
# Basic conversion command (all-purpose template)
# -i, purpose: input file path, example value: audio.wav
# -c:a, purpose: audio codec, example values: aac, libmp3lame, pcm_s16le
# -b:a, purpose: bitrate (audio quality control), example values: 192k, 320k
# -ar, purpose: sample rate, example values: 44100 (CD), 48000, 16000
# -ac, purpose: number of channels, example values: 1 (mono), 2 (stereo)
# -y, purpose: overwrite an existing file (no value needed)
ffmpeg -i input_audio.ext -c:a codec_name -b:a bitrate -ar sample_rate -ac channels output.ext
# For example: WAV to MP3 (keep the original quality)
ffmpeg -i input.wav -c:a libmp3lame -q:a 0 output.mp3
# For example: MP3 to WAV (16-bit PCM standard format)
ffmpeg -i input.mp3 -c:a pcm_s16le -ar 44100 -ac 2 output.wav
# For example: M4A to AAC (extract or convert Apple audio)
ffmpeg -i input.m4a -c:a copy output.aac # Extract directly without re-encoding
ffmpeg -i input.m4a -c:a aac -b:a 256k output.aac # Re-encode to improve quality
# For example: FLAC lossless to Opus (high compression)
ffmpeg -i input.flac -c:a libopus -b:a 128k -vbr on output.opus
P: Como reconheço um arquivo local (gravação)?
Existem duas maneiras de reconhecer um arquivo local:
-
Passe o caminho do arquivo local diretamente: esta forma retorna o resultado completo somente após o término do reconhecimento, portanto não é adequada para cenários que precisam de feedback imediato.
Consulte Non-streaming call e passe o caminho do arquivo para o método
callda Recognition class para reconhecer a gravação diretamente. -
Converta o arquivo local em um fluxo binário para reconhecimento: esta forma reconhece o arquivo enquanto transmite os resultados em fluxo, sendo adequada para cenários que precisam de feedback imediato.
Consulte Bidirectional streaming call e envie o fluxo binário para o servidor para reconhecimento através do método
send_audio_frameda Recognition class.
Solução de problemas
P: Por que a fala não é reconhecida (nenhum resultado de reconhecimento)?
-
Verifique se o formato de áudio (
format) e a taxa de amostragem (sampleRate/sample_rate) nos parâmetros da solicitação estão corretos e atendem às restrições de parâmetros. Erros comuns incluem:- O arquivo de áudio tem extensão .wav, mas na verdade está no formato MP3, enquanto o parâmetro de solicitação
formatestá definido como mp3 (configuração incorreta de parâmetro). - A taxa de amostragem do áudio é 3600 Hz, mas o parâmetro de solicitação
sampleRate/sample_rateestá definido como 48000 (configuração incorreta de parâmetro).
Use a ferramenta ffprobe para obter o container, codec, taxa de amostragem, canais e outras informações do áudio:
- O arquivo de áudio tem extensão .wav, mas na verdade está no formato MP3, enquanto o parâmetro de solicitação
ffprobe -v error -show_entries format=format_name -show_entries stream=codec_name,sample_rate,channels -of default=noprint_wrappers=1 input.xxx
- Se nenhuma das verificações acima revelar um problema, adicione palavras-chave personalizadas para melhorar o reconhecimento de termos específicos.