如何转写含糊不清的语音:不清晰语音转写完整指南

如何转写含糊不清的语音:不清晰语音转写完整指南

Eric King

Eric King

Author


如何转写含糊不清的语音:不清晰语音转写完整指南

在语音转文字转换中,转写含糊、发音不清或口齿不清的语音是最具挑战性的任务之一。无论是语速过快、发音不清、重口音,还是低音量音频,这些问题都会显著影响转写准确率。
本综合指南涵盖使用OpenAI Whisper转写不清晰语音的实用技巧与策略,包括预处理方法、模型选择、参数优化和最佳实践。

理解不清晰语音的挑战

不清晰语音可能由多种因素造成:

不清晰语音的常见原因

  1. 语速过快 - 词语连在一起
  2. 含糊不清(Mumbling) - 发音不完整或不清楚
  3. 口齿不清(Slurred speech) - 词与词黏连
  4. 重口音 - 非母语发音模式
  5. 音量过低 - 说话声音小或距离远
  6. 言语障碍 - 影响清晰度的医学状况
  7. 情绪化表达 - 哭泣、大笑或情绪波动状态
  8. 年龄相关变化 - 老年说话者发音不清
  9. 疲劳 - 说话者疲惫导致清晰度下降
  10. 酒精/药物影响 - 受损的说话模式

为什么这很有挑战

  • 音素混淆 - 相似发音难以区分
  • 上下文缺失 - 不清晰词语缺少周边语境
  • 信号质量下降 - 音量越低 = 信噪比越低
  • 模式不规则 - 不可预测的说话模式会干扰模型
  • 多问题叠加 - 通常会同时出现多个问题

策略 1:使用更大的 Whisper 模型

更大的 Whisper 模型由于容量更高、训练数据更多,在处理不清晰语音时能力更强。

不清晰语音的模型选择

import whisper

# 对于不清晰/含糊语音,使用 medium 或 large 模型
model = whisper.load_model("medium")  # 推荐起点
# 或
model = whisper.load_model("large")    # 非常不清晰语音的最佳选择
模型对比:
ModelClarity HandlingSpeedUse When
tiny⭐⭐⭐⭐⭐Clear speech only
base⭐⭐⭐⭐⭐⭐Slightly unclear
small⭐⭐⭐⭐⭐⭐Moderately unclear
medium⭐⭐⭐⭐⭐⭐⭐Unclear speech (recommended)
large⭐⭐⭐⭐⭐⭐Very unclear/mumbling (best)

代码示例

import whisper

def transcribe_unclear_speech(audio_path, clarity_level="unclear"):
    """
    根据语音清晰度等级选择模型。
    
    Args:
        audio_path: 音频文件路径
        clarity_level: "clear", "slightly_unclear", "unclear", "very_unclear"
    """
    model_sizes = {
        "clear": "base",
        "slightly_unclear": "small",
        "unclear": "medium",
        "very_unclear": "large"
    }
    
    model_size = model_sizes.get(clarity_level, "medium")
    print(f"Using {model_size} model for {clarity_level} speech")
    
    model = whisper.load_model(model_size)
    result = model.transcribe(audio_path)
    
    return result

# 用于含糊或非常不清晰的语音
result = transcribe_unclear_speech("mumbling_audio.mp3", clarity_level="very_unclear")
print(result["text"])
关键结论: 对于不清晰语音,始终使用 mediumlarge 模型。准确率提升非常显著,值得用速度做权衡。

策略 2:通过音频预处理提升清晰度

预处理可以在转写前增强不清晰语音:

方法 1:音量归一化与放大

import whisper
import librosa
import soundfile as sf
import numpy as np

def enhance_unclear_audio(audio_path, output_path="enhanced_audio.wav"):
    """
    通过归一化和放大增强不清晰音频。
    """
    # 加载音频
    audio, sr = librosa.load(audio_path, sr=16000)
    
    # 去除直流偏移
    audio = audio - np.mean(audio)
    
    # 归一化到 -3dB(安全放大)
    max_val = np.max(np.abs(audio))
    if max_val > 0:
        target_db = -3.0
        current_db = 20 * np.log10(max_val) if max_val > 0 else -60
        gain_db = target_db - current_db
        gain_linear = 10 ** (gain_db / 20)
        audio = audio * gain_linear
    
    # 温和的高通滤波,去除低频噪声
    audio = librosa.effects.preemphasis(audio, coef=0.97)
    
    # 保存增强后的音频
    sf.write(output_path, audio, sr)
    
    return output_path

# 用法
enhanced_path = enhance_unclear_audio("quiet_mumbling.mp3")
model = whisper.load_model("medium")
result = model.transcribe(enhanced_path)

方法 2:使用频谱门控进行语音增强

import whisper
import librosa
import soundfile as sf
import numpy as np

def enhance_speech_clarity(audio_path, output_path="enhanced.wav"):
    """
    使用频谱门控和归一化增强语音清晰度。
    """
    # 加载音频
    audio, sr = librosa.load(audio_path, sr=16000)
    
    # 计算频谱图
    stft = librosa.stft(audio)
    magnitude = np.abs(stft)
    phase = np.angle(stft)
    
    # 频谱门控 - 增强语音频段(300-3400 Hz)
    freq_bins = librosa.fft_frequencies(sr=sr)
    speech_mask = (freq_bins >= 300) & (freq_bins <= 3400)
    
    # 增强语音频率
    enhanced_magnitude = magnitude.copy()
    enhanced_magnitude[speech_mask] *= 1.5  # 提升语音频段
    
    # 重建音频
    enhanced_stft = enhanced_magnitude * np.exp(1j * phase)
    enhanced_audio = librosa.istft(enhanced_stft)
    
    # 归一化
    enhanced_audio = librosa.util.normalize(enhanced_audio)
    
    # 保存
    sf.write(output_path, enhanced_audio, sr)
    
    return output_path

# 用法
enhanced = enhance_speech_clarity("unclear_speech.mp3")
model = whisper.load_model("large")
result = model.transcribe(enhanced)

方法 3:放慢快速语音(速度调整)

对于语速快、含糊不清的语音,放慢后通常更易转写:
import whisper
import librosa
import soundfile as sf

def slow_down_speech(audio_path, speed_factor=0.85, output_path="slowed.wav"):
    """
    放慢快速语音以获得更好的转写效果。
    
    Args:
        audio_path: 输入音频文件
        speed_factor: 速度倍率(0.85 = 慢 15%)
        output_path: 输出文件路径
    """
    # 加载音频
    audio, sr = librosa.load(audio_path, sr=16000)
    
    # 时间拉伸(不改变音高地放慢)
    slowed_audio = librosa.effects.time_stretch(audio, rate=1/speed_factor)
    
    # 保存
    sf.write(output_path, slowed_audio, sr)
    
    return output_path

# 用法:放慢快速含糊语音
slowed_path = slow_down_speech("fast_mumbling.mp3", speed_factor=0.8)
model = whisper.load_model("medium")
result = model.transcribe(slowed_path)

# 注意:如果放慢了音频,你可能需要调整时间戳

策略 3:为不清晰语音优化 Whisper 参数

通过调整 Whisper 参数来提升对不清晰语音的处理效果:

不清晰语音的最佳参数

import whisper

model = whisper.load_model("medium")

# 针对不清晰/含糊语音的优化设置
result = model.transcribe(
    "unclear_audio.mp3",
    temperature=0.0,              # 最具确定性
    best_of=5,                    # 尝试多次解码(很重要!)
    beam_size=5,                  # 使用束搜索提升准确率
    patience=1.0,                 # 束搜索耐心参数
    condition_on_previous_text=True,  # 利用前文分段上下文
    initial_prompt="This audio contains unclear or mumbling speech. "
                   "Focus on transcribing what can be understood, "
                   "even if some words are unclear.",
    language="en"  # 已知语言时请指定
)

为什么这些参数有帮助

  • temperature=0.0:输出最稳定,减少随机性
  • best_of=5:尝试多次解码并选最佳结果 - 对不清晰语音至关重要
  • beam_size=5:探索多条转写路径
  • condition_on_previous_text=True:利用上下文补全不清晰片段
  • initial_prompt:提供不清晰语音相关上下文

高级参数调优

def transcribe_unclear_speech_advanced(audio_path, 
                                      model_size="medium",
                                      speech_type="mumbling"):
    """
    使用针对不清晰语音优化参数的高级转写。
    """
    model = whisper.load_model(model_size)
    
    # 根据语音类型定制提示词
    prompts = {
        "mumbling": "This audio contains mumbling or unclear speech. "
                   "Transcribe what can be understood clearly.",
        "fast": "This audio contains fast speech where words may blend together. "
               "Focus on accurate transcription of clear words.",
        "accent": "This audio contains speech with a heavy accent. "
                 "Transcribe phonetically accurate words.",
        "low_volume": "This audio has low volume or quiet speech. "
                     "Focus on transcribing audible words.",
        "slurred": "This audio contains slurred or unclear pronunciation. "
                  "Transcribe what is clearly audible."
    }
    
    initial_prompt = prompts.get(speech_type, prompts["mumbling"])
    
    result = model.transcribe(
        audio_path,
        temperature=0.0,
        best_of=5,
        beam_size=5,
        patience=1.0,
        condition_on_previous_text=True,
        initial_prompt=initial_prompt,
        language="en"
    )
    
    return result

# 用法
result = transcribe_unclear_speech_advanced(
    "mumbling_audio.mp3",
    model_size="large",
    speech_type="mumbling"
)

策略 4:通过初始提示词提供上下文

通过提供预期词汇和主题,上下文能帮助 Whisper 更好地理解不清晰语音。

场景化上下文提示词

import whisper

model = whisper.load_model("medium")

# 医疗场景
result = model.transcribe(
    "unclear_medical.mp3",
    initial_prompt="This is a medical consultation with unclear speech. "
                  "Common terms include: symptoms, diagnosis, treatment, "
                  "medication, patient, doctor, examination."
)

# 技术场景
result = model.transcribe(
    "unclear_technical.mp3",
    initial_prompt="This is a technical discussion about software development. "
                  "Terms include: API, database, server, deployment, "
                  "code, function, variable, algorithm."
)

# 商业场景
result = model.transcribe(
    "unclear_business.mp3",
    initial_prompt="This is a business meeting with unclear speech. "
                  "Topics include: revenue, sales, marketing, strategy, "
                  "budget, project, deadline, client."
)

# 面试场景
result = model.transcribe(
    "unclear_interview.mp3",
    initial_prompt="This is an interview with unclear speech. "
                  "Common phrases: question, answer, experience, "
                  "background, education, work, career."
)

动态构建上下文

def transcribe_with_context(audio_path, context_keywords, model_size="medium"):
    """
    结合领域上下文转写不清晰语音。
    
    Args:
        audio_path: 音频文件路径
        context_keywords: 相关关键词/术语列表
        model_size: Whisper 模型尺寸
    """
    model = whisper.load_model(model_size)
    
    # 构建上下文提示词
    context_prompt = (
        "This audio contains unclear or mumbling speech. "
        f"Relevant terms and topics include: {', '.join(context_keywords)}. "
        "Focus on transcribing words that match this context."
    )
    
    result = model.transcribe(
        audio_path,
        temperature=0.0,
        best_of=5,
        beam_size=5,
        initial_prompt=context_prompt,
        language="en"
    )
    
    return result

# 用法
result = transcribe_with_context(
    "unclear_meeting.mp3",
    context_keywords=["project", "deadline", "budget", "team", "client", "delivery"],
    model_size="large"
)

策略 5:分块与分段处理

对于非常不清晰的音频,可按更小片段并结合上下文处理:
import whisper
from pydub import AudioSegment
import os

def transcribe_unclear_audio_chunked(audio_path, 
                                     chunk_length_seconds=30,
                                     model_size="medium"):
    """
    在保留上下文的前提下分块转写不清晰音频。
    """
    model = whisper.load_model(model_size)
    
    # 加载音频
    audio = AudioSegment.from_file(audio_path)
    duration_seconds = len(audio) / 1000.0
    
    all_segments = []
    all_text = []
    previous_text = ""  # 上一块的上下文
    
    # 分块处理
    for start_seconds in range(0, int(duration_seconds), chunk_length_seconds):
        end_seconds = min(start_seconds + chunk_length_seconds, duration_seconds)
        
        # 提取分块
        chunk = audio[start_seconds * 1000:end_seconds * 1000]
        chunk_path = f"chunk_{start_seconds}.wav"
        chunk.export(chunk_path, format="wav")
        
        # 构建上下文提示词
        context_prompt = (
            "This audio contains unclear or mumbling speech. "
            f"Previous context: {previous_text[-200:]} "  # 最后 200 个字符
            "Continue transcribing with this context in mind."
        )
        
        # 转写当前分块
        result = model.transcribe(
            chunk_path,
            temperature=0.0,
            best_of=5,
            beam_size=5,
            initial_prompt=context_prompt,
            language="en"
        )
        
        # 按分块位置调整时间戳
        for segment in result["segments"]:
            segment["start"] += start_seconds
            segment["end"] += start_seconds
        
        all_segments.extend(result["segments"])
        all_text.append(result["text"])
        previous_text = result["text"]
        
        # 清理临时文件
        os.remove(chunk_path)
    
    return {
        "text": " ".join(all_text),
        "segments": all_segments
    }

# 用法
result = transcribe_unclear_audio_chunked("very_unclear_audio.mp3", chunk_length_seconds=20)
print(result["text"])

策略 6:后处理与纠错

转写完成后,可针对常见不清晰语音模式进行纠错:

常见不清晰语音模式

import re

def correct_unclear_transcription(text):
    """
    对不清晰语音转写结果应用常见纠错规则。
    """
    # 修正常见含糊语音模式
    corrections = {
        r'\b(uh|um|er|ah)\s+': '',  # 去除语气词
        r'\s+': ' ',  # 规范空白字符
        r'([.!?])\s*([A-Z])': r'\1 \2',  # 修正句子间距
    }
    
    corrected = text
    for pattern, replacement in corrections.items():
        corrected = re.sub(pattern, replacement, corrected)
    
    # 句首大写
    sentences = re.split(r'([.!?]\s+)', corrected)
    corrected = ''.join([
        s.capitalize() if i % 2 == 0 else s 
        for i, s in enumerate(sentences)
    ])
    
    return corrected.strip()

# 用法
result = model.transcribe("unclear_audio.mp3")
corrected_text = correct_unclear_transcription(result["text"])
print(corrected_text)

基于置信度的过滤

def filter_low_confidence_segments(result, min_confidence=0.5):
    """
    过滤低置信度分段(通常是听不清的内容)。
    """
    filtered_segments = []
    filtered_text_parts = []
    
    for segment in result["segments"]:
        # 检查分段是否包含 confidence/avg_logprob
        avg_logprob = segment.get("avg_logprob", -1.0)
        confidence = np.exp(avg_logprob) if avg_logprob > -10 else 0.5
        
        if confidence >= min_confidence:
            filtered_segments.append(segment)
            filtered_text_parts.append(segment["text"])
        else:
            # 标记为不清晰
            filtered_segments.append({
                **segment,
                "text": "[UNCLEAR]",
                "unclear": True
            })
    
    return {
        "text": " ".join(filtered_text_parts),
        "segments": filtered_segments
    }

# 用法
result = model.transcribe("unclear_audio.mp3")
filtered = filter_low_confidence_segments(result, min_confidence=0.4)

不清晰语音的完整流水线

下面是一个完整、可用于生产的流水线:
import whisper
import librosa
import soundfile as sf
import numpy as np
import os
from pathlib import Path

class UnclearSpeechTranscriber:
    """用于转写不清晰/含糊语音的完整流水线。"""
    
    def __init__(self, model_size="medium"):
        """初始化转写器。"""
        print(f"Loading {model_size} model...")
        self.model = whisper.load_model(model_size)
        print("✓ Model loaded")
    
    def enhance_audio(self, audio_path, output_path="enhanced_temp.wav"):
        """增强不清晰音频。"""
        # 加载
        audio, sr = librosa.load(audio_path, sr=16000)
        
        # 去除直流偏移
        audio = audio - np.mean(audio)
        
        # 归一化
        audio = librosa.util.normalize(audio)
        
        # 温和预加重
        audio = librosa.effects.preemphasis(audio, coef=0.97)
        
        # 保存
        sf.write(output_path, audio, sr)
        return output_path
    
    def transcribe(self, audio_path, 
                  enhance=True,
                  context_keywords=None,
                  speech_type="mumbling"):
        """
        使用完整流水线转写不清晰语音。
        
        Args:
            audio_path: 输入音频文件
            enhance: 是否先增强音频
            context_keywords: 相关关键词列表
            speech_type: 不清晰语音类型
        """
        temp_files = []
        
        try:
            # 第 1 步:按需增强音频
            if enhance:
                print("Enhancing audio...")
                enhanced_path = self.enhance_audio(audio_path)
                temp_files.append(enhanced_path)
                process_path = enhanced_path
            else:
                process_path = audio_path
            
            # 第 2 步:构建上下文提示词
            prompts = {
                "mumbling": "This audio contains mumbling or unclear speech.",
                "fast": "This audio contains fast speech where words blend together.",
                "accent": "This audio contains speech with a heavy accent.",
                "low_volume": "This audio has low volume or quiet speech.",
                "slurred": "This audio contains slurred or unclear pronunciation."
            }
            
            base_prompt = prompts.get(speech_type, prompts["mumbling"])
            
            if context_keywords:
                context_part = f" Relevant terms: {', '.join(context_keywords)}."
            else:
                context_part = ""
            
            initial_prompt = base_prompt + context_part + " Focus on transcribing clearly audible words."
            
            # 第 3 步:使用优化参数进行转写
            print("Transcribing...")
            result = self.model.transcribe(
                process_path,
                temperature=0.0,
                best_of=5,
                beam_size=5,
                patience=1.0,
                condition_on_previous_text=True,
                initial_prompt=initial_prompt,
                language="en"
            )
            
            print(f"✓ Transcription complete")
            print(f"  Language: {result['language']}")
            print(f"  Duration: {result['segments'][-1]['end']:.2f}s")
            
            return result
            
        finally:
            # 清理临时文件
            for temp_file in temp_files:
                if os.path.exists(temp_file):
                    os.remove(temp_file)

# 用法
transcriber = UnclearSpeechTranscriber(model_size="large")

result = transcriber.transcribe(
    "mumbling_audio.mp3",
    enhance=True,
    context_keywords=["meeting", "project", "deadline", "team"],
    speech_type="mumbling"
)

print("\nTranscription:")
print(result["text"])

最佳实践总结

用于转写不清晰/含糊语音:
  1. 使用更大模型 - 不清晰语音使用 mediumlarge
  2. 增强音频 - 转写前进行归一化、放大和滤波
  3. 优化参数 - 使用 temperature=0.0best_of=5beam_size=5
  4. 提供上下文 - 使用带相关关键词的 initial_prompt
  5. 分块处理 - 适用于很长且不清晰的音频
  6. 后处理 - 修正常见模式并过滤低置信度内容
  7. 指定语言 - 已知语言时可提升准确率
  8. 多次尝试 - 尝试不同参数组合
模型选择:
  • 轻度不清晰: small 模型
  • 中度不清晰: medium 模型(推荐)
  • 重度不清晰/含糊: large 模型
  • 关键高准确场景: large + 增强 + 参数优化

常见问题与解决方案

问题 1:Whisper 会跳过不清晰词语

解决方案: 使用 best_of=5beam_size=5 来探索更多转写路径。

问题 2:快速含糊语音准确率低

解决方案: 先通过速度调整放慢音频,再进行转写。

问题 3:重口音 + 含糊语音

解决方案: 使用 large 模型,提供口音相关上下文,并先增强音频。

问题 4:音量很低的含糊语音

解决方案: 放大并归一化音频,结合上下文使用 large 模型。

问题 5:结果不稳定

解决方案: 使用 temperature=0.0 获取确定性输出,多次处理并比较结果。

使用场景

1. 老年人语音转写

model = whisper.load_model("large")
result = model.transcribe(
    "elderly_speech.mp3",
    initial_prompt="This audio contains speech from an elderly person "
                   "with age-related unclear pronunciation. "
                   "Transcribe clearly audible words.",
    temperature=0.0,
    best_of=5
)

2. 不清晰语音的医疗问诊

model = whisper.load_model("large")
result = model.transcribe(
    "unclear_medical.mp3",
    initial_prompt="This is a medical consultation with unclear speech. "
                   "Medical terms: symptoms, diagnosis, treatment, medication, "
                   "patient, examination, prescription.",
    temperature=0.0,
    best_of=5
)

3. 重口音面试转写

model = whisper.load_model("medium")
result = model.transcribe(
    "accented_interview.mp3",
    initial_prompt="This interview contains speech with a heavy accent. "
                   "Focus on transcribing phonetically accurate words.",
    language="en",  # 或指定实际语言
    temperature=0.0,
    best_of=5
)

结论

转写不清晰或含糊语音虽然有挑战,但通过正确方法完全可以实现。关键策略包括:
  1. 使用更大模型mediumlarge
  2. 预处理音频以提升清晰度
  3. 优化参数以适配不清晰语音
  4. 提供上下文(通过初始提示词)
  5. 后处理结果以修正常见模式
关键要点:
  • 对不清晰语音始终使用 mediumlarge 模型
  • 音频增强可以显著提升结果
  • 上下文提示词可帮助 Whisper 理解不清晰词语
  • best_of=5 对探索多条转写路径至关重要
  • 分块处理有助于很长且不清晰的音频
想了解更多 Whisper 转写信息,可查看我们的指南:Whisper Accuracy TipsWhisper for Noisy BackgroundWhisper Best Settings

Looking for a professional speech-to-text solution that handles unclear speech? Visit SayToWords to explore our AI transcription platform with optimized models for challenging audio conditions.

立即免費試用

現在就體驗我們的 AI 語音與音視頻服務!不僅可以享受高精度語音轉文字、多語言翻譯與智能說話人識別,還能自動生成視頻字幕、智能編輯音視頻內容並進行聲畫同步分析,全面覆蓋會議記錄、短視頻創作、播客製作等場景——立即開始免費試用吧!

在线声音转文字免费声音转文字声音转文字转换器声音转文字 MP3声音转文字 WAV声音转文字(带时间戳)会议声音转文字Sound to Text Multi Language声音转文字字幕转换WAV为文字语音转文字在线语音转文字语音转文字转换MP3为文字语音录音转文字在线语音输入带时间戳的语音转文字实时语音转文字长音频语音转文字视频语音转文字YouTube语音转文字视频编辑语音转文字字幕语音转文字播客语音转文字采访语音转文字访谈音频转文字录音语音转文字会议语音转文字讲座语音转文字语音笔记转文字多语言语音转文字高准确度语音转文字快速语音转文字Premiere Pro 语音转文字替代方案DaVinci 语音转文字替代方案VEED 语音转文字替代方案InVideo 语音转文字替代方案Otter.ai 语音转文字替代方案Descript 语音转文字替代方案Trint 语音转文字替代方案Rev 语音转文字替代方案Sonix 语音转文字替代方案Happy Scribe 语音转文字替代方案Zoom 语音转文字替代方案Google Meet 语音转文字替代方案Microsoft Teams 语音转文字替代方案Fireflies.ai 语音转文字替代方案Fathom 语音转文字替代方案FlexClip 语音转文字替代方案Kapwing 语音转文字替代方案Canva 语音转文字替代方案长音频语音转文字AI语音转文字免费语音转文字无广告语音转文字噪音音频语音转文字带时间戳的语音转文字从音频生成字幕播客转录在线转录客户通话TikTok语音转文字TikTok音频转文字YouTube语音转文字YouTube音频转文字语音备忘录转文字WhatsApp语音消息转文字Telegram语音转文字Discord通话转录Twitch语音转文字Skype语音转文字Messenger语音转文字LINE语音消息转文字Vlog转录转文字讲道音频转文字语音转文字音频转文字语音笔记转文字语音输入会议语音输入YouTube语音输入说话打字免提打字语音转文字语音转文字在线语音转文字Online Transcription Software会议语音转文字快速语音转文字Real Time Speech to TextLive Transcription AppTikTok语音转文字TikTok音频转文字说话转文字语音转文字Talk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for Meetings音频转文字声音转文字语音写作工具语音写作工具语音听写法律转录工具医疗语音听写工具日语音频转录韩语会议转录会议转录工具会议音频转文字讲座转文字转换器讲座音频转文字视频转文字转录TikTok字幕生成器呼叫中心转录Reels音频转文字工具MP3转录为文字WAV文件转录为文字CapCut语音转文字CapCut语音转文字英语语音转文字英语音频转文字西班牙语语音转文字法语语音转文字法语音频转文字德语语音转文字德语音频转文字日语语音转文字日语音频转文字韩语语音转文字韩语音频转文字葡萄牙语语音转文字阿拉伯语语音转文字中文语音转文字印地语语音转文字俄语语音转文字网页语音输入工具语音输入网站